2016-07-22 3 views
0

Я пытаюсь включить библиотеку 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++, но это может быть даже невозможно.

ответ

2

Лучший способ избежать сложного файла src/Makevars.

Один простой подход: используйте configure для создания вашей статической библиотеки, а затем, как только вы на самом деле строите, просто обратитесь к нему в src/Makevars.

Я использую эту схему в Rblpapi (где мы копируем библиотеку, поставляемую извне) и в nloptr, где мы загружаем источники nlopt и строим их «когда необходимо» (т.е. когда в системе нет libnlopt).

Смежные вопросы