2017-01-11 17 views
1

Я создаю пакет R, называемый CVOC. Он включает в себя код на C++ и использует арифметику высокой точности из библиотеки g c.Ошибка при создании R-пакета: ошибка в dyn.load (файл, DLLpath = DLLpath, ...)

Пакет должен быть создан с помощью следующих шагов:

1) с использованием Rcpp :: Rcpp.package.skeleton создать пакет скелет.

2) копирует необходимые файлы, такие как описание, NAMESPACE, Makevars и т.д., в правильные папки

3) создание файлов документации .Rd с использованием roxygen2 :: roxygenise()

4) проверка R-пакет с помощью R CMD проверить

5) создание R-пакет с помощью R CMD построить

Когда я бегу R CMD проверить "CVOC" следующее сообщение об ошибке появляется:

* installing *source* package ‘CVOC’ ... 
** libs 
g++ -std=c++11 -I/usr/share/R/include -DNDEBUG -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/RcppMP/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/BH/include" -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c RcppExports.cpp -o RcppExports.o 
g++ -std=c++11 -I/usr/share/R/include -DNDEBUG -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/RcppMP/include" -I"/home/fabian/R/x86_64-pc-linux-gnu-library/3.2/BH/include" -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c etcND.cpp -o etcND.o 
g++ -std=c++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o CVOC.so RcppExports.o etcND.o -L/usr/lib/R/lib -lR 
installing to /home/fabian/Desktop/CVOCcreate/CVOC.Rcheck/CVOC/libs 
** R 
** preparing package for lazy loading 
** help 
*** installing help indices 
** building package indices 
** testing if installed package can be loaded 
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
unable to load shared object '/home/fabian/Desktop/CVOCcreat/CVOC.Rcheck /CVOC/libs/CVOC.so': 
    /home/fabian/Desktop/CVOCcreate/CVOC.Rcheck/CVOC/libs/CVOC.so:    
undefined symbol: __gmp_bits_per_limb 
Error: loading failed 
Execution halted 
ERROR: loading failed 
* removing ‘/home/fabian/Desktop/CVOCcreate/CVOC.Rcheck/CVOC’ 

Все необходимые файлы, включая скрипт bash createCVOC.sh, можно найти в репозитории github по адресу https://github.com/SchroederFabian/CVOC.

Любая помощь очень ценится.

ответ

4

Что-то не так, поэтому давайте проверим. Вы любезно предоставить ссылку на ваш , который делает на самом деле показывают, что у вас есть

CXXFLAGS= -lgmpxx -lgmp 

еще в журнал, вы показываете в вашем вопросе нет такого связывания не происходит:

g++ -std=c++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions \ 
    -Wl,-z,relro -o CVOC.so RcppExports.o etcND.o -L/usr/lib/R/lib -lR 

В сущности вы путать

  • в PKG_* варианты, которые позволяют «добавить» к существующим правилам с простыми из них (то есть для compilati по вашему желанию PKG_CXXFLAGS) и

  • Вы использовали PKG_CXXFLAGS, когда вам нужно PKG_LIBS.

Попробуйте добавить

PKG_LIBS= -lgmpxx -lgmp 

и повторите попытку. Проверьте, что происходит. У вас должны быть добавлены необходимые библиотеки и больше не страдать от «неизвестного символа».

+0

Благодарим за указание этого. Я изменил строку в файле Makevars на PKG_LIBS = -lgmpxx -lgmp, как вы сказали, но независимо от того, что я делаю, флаги в журнале не меняются. Появится такая же ошибка «неизвестный символ». – fabianschroeder

+0

Ваш комментарий заставил меня понять, что я скопировал файл Makevars в корневую папку вместо папки src. Кажется, теперь это работает. Спасибо! – fabianschroeder

+0

Что вы делаете в этом репо GitHub кажется ... необычным. Нет причин повторно запускать функцию скелета каждый раз или копировать файлы. Просто создайте правильный макет и сделайте это. Посмотрите на множество других репозиториев и на то, как они это делают. Кроме того, если ответ поможет, пожалуйста, не стесняйтесь его принять (нажав на отметку «галочка», которую вы видите). –