我想在R包中使用libDAI C++库,并想要该包:
我当前的设置是:
修改Makevar文件:
# include libraries
PKG_CPPFLAGS =-I../inst/include/
PKG_LIBS = -Llib -l../lib/libdai.a
我访问libDAI库的脚本是(src /中的test.cpp):
#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
所以我的问题是:
我的问题与this和this问题以及与引用静态库有关的其他几篇文章密切相关,但是我无法使用这些链接解决问题。
最佳答案
如何与静态库链接
您可以使用-L<directory> -l<name>
或<path>
,即您的情况
PKG_LIBS = -L../lib -ldai
要么
PKG_LIBS = ../lib/libdai.a
标题位置
libDAI
的 header 仅在内部使用。不能链接到这些 header 中声明的功能。因此,我不会将inst/include
用于这些 header 。对CRAN的依赖
gmp库似乎在CRAN构建器上可用,请参见c.f。 https://github.com/cran/gmp和https://cran.r-project.org/package=gmp。看来libDAI需要链接到boost(程序选项),参见c.f。 https://bitbucket.org/jorism/libdai/src/83bd24a4c5bf17b0592a7b5b21e26bf052881833/Makefile.LINUX?at=master&fileviewer=file-view-default#Makefile.LINUX-49。但是,从实际的
Makefile
看,这似乎仅用于测试和实用程序。因此,您可能会摆脱BH软件包提供的boost接头。预先构建静态库
这是Windows(c.f. https://github.com/rwinlib)上的一种常见方法,但是我发现它对于Linux不常见。较常见的方法是:
对于这三种方法,在CRAN和GitHub上都有大量示例。但是,很难提出建议。我可能会选择“在包中包含源代码”,并使用上游提供的Makefile作为构建库的起点。