Я хочу использовать libDAI C ++ библиотека в R-пакете и хотите пакет:
Моя текущая настройка:
Изменить файл Makevar:
# include libraries
PKG_CPPFLAGS =-I../inst/include/
PKG_LIBS = -Llib -l../lib/libdai.a
Мой скрипт для доступа к библиотеке libDAI (test.cpp в src /):
#include <dai/factorgraph.h>
#include <Rcpp.h>
#include <cmath>
using namespace Rcpp;
using namespace std;
using namespace dai;
//'
//' Creates libDAI factor graph object
//'
//' @param factor_graph character definition of the factor graph
//' @export
// [[Rcpp::export]]
void initialize_factor_graph(const char* factor_graph) {
// read the factor graph from the string
std::istringstream fgStream(factor_graph);
FactorGraph net;
net.ReadFromString( fgStream );
// Output some information about the factorgraph
cout << "Factor graph has " << net.nrVars() << " variables" << endl;
cout << "Factor graph has " << net.nrFactors() << " factors" << endl;
}
Бег Rscript -e "Rcpp::compileAttributes('libdai')"
, с последующим R CMD INSTALL libdai
возвращает ошибку:
Error: package or namespace load failed for 'libdai' in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object
'/home/jk/libs/R/libdai/libs/libdai.so':
/home/jk/libs/R/libdai/libs/libdai.so: undefined symbol: _ZTVN3dai11FactorGraphE
Error: loading failed
Итак, мои вопросы:
Мой вопрос тесно связан с этот а также этот вопрос и несколько других постов, связанных со ссылками на статические библиотеки, однако мне не удалось решить мою проблему с этими ссылками.
Вы можете использовать -L<directory> -l<name>
или же <path>
то есть в вашем случае
PKG_LIBS = -L../lib -ldai
или же
PKG_LIBS = ../lib/libdai.a
Заголовки для libDAI
используются только для внутреннего использования. Нельзя ссылаться на функции, объявленные в этих заголовках. Я бы поэтому не использовал inst/include
для этих заголовков.
Библиотека gmp доступна для сборщиков CRAN, c.f. https://github.com/cran/gmp а также https://cran.r-project.org/package=gmp. Похоже, что libDAI требует соединение повысить (варианты программы), ср. https://bitbucket.org/jorism/libdai/src/83bd24a4c5bf17b0592a7b5b21e26bf052881833/Makefile.LINUX?at=master&FileViewer = файл вид по умолчанию # Makefile.LINUX-49. Тем не менее, глядя на фактическую Makefile
кажется, это используется только для тестов и служебных программ. Таким образом, вы могли бы сойти с толчка заголовки предоставлено пакетом BH.
Это общий подход в Windows (см. https://github.com/rwinlib), но я нахожу это необычным для Linux. Более распространенный подход будет одним из:
Для всех трех подходов есть множество примеров на CRAN и GitHub. Трудно дать рекомендацию, хотя. Я, вероятно, хотел бы пойти «включить исходники в пакет» и использовать Makefile, предоставленный апстримом в качестве отправной точки для сборки библиотеки.
Других решений пока нет …