Я пытаюсь включить библиотеку C в некоторый код Rcpp.Неопределенная ссылка при попытке использовать внешнюю библиотеку
Я могу легко использовать библиотеку C в программе на C++. Я создаю библиотеку C, которая создает файлы .a и .dll в папке/lib. Затем я могу использовать пакет, включая заголовок в программе и работает что-то вроде этого из командной строки:
cc myfile.cpp -o myfile -Ipath.to.header path.to.lib.a -lz
В сущности, это говорит компилятору принять программу .cpp, включают в себя заголовки из -I, и связать к двум библиотекам.
Получение этого для работы с Rcpp не должно быть чрезмерно трудным, если я правильно понимаю makevars (что, к сожалению, мне не кажется).
добавить библиотеку в папку в моем пакете, и в ИПВ я добавить makevars и makevars.win, которые выглядят следующим образом:
PKG_CFLAGS=
# specify header location
PKG_CPPFLAGS=-Ipath.to.lib/include
# specify libs to link to
PKG_LIBS=path.to.lib/lib/file.a -lz
# make library
path.to.lib/lib/file.a:
cd path.to.lib;$(MAKE)
Это правильно «делает» в .a и DLL-файлы для библиотеки, однако ни один из магов Rcpp не запускается (т. е. в сборке я никогда не вижу системный вызов g++
, который компилирует файлы в src), поэтому «никакая Dll не была создана».
Я вполне уверен, что это проблема в моей целевой мистерии, которая делает библиотеку. Когда я удаляю эту часть из makevars и «делаю» библиотеку из командной строки непосредственно перед созданием пакета, я получаю правильные вызовы g++
с моими операторами -I и -l, но я получаю ошибки в отношении неопределенных ссылок.
Я заметил, что инструкции -l включены только в окончательный вызов g++
, где производится окончательная .dll, но не включена в более ранние вызовы g++
, где скомпилированы файлы с заголовками библиотеки.
Поэтому у меня есть две проблемы:
Как исправить мои makevars так, что это делает "библиотеку, но не останавливает Rcpp от компиляции файлов в ИПВ?
Как я могу справиться с неопределенными ссылками? Библиотека явно не только для заголовка, поэтому я предполагаю, что ей нужна инструкция -l в предыдущих вызовах
g++
, но это может быть даже невозможно.