我正在尝试使用Rcpp将功能从BayesOpt C++库扩展到R.我是一个长期的R用户,但对C++来说相对较新,我遇到了一些问题.我已经按照Rcpp的插图设置了一个包,我理解这是引入外部C++库的最佳方法.
我在src/Makevars中将PKG_CPPFLAGS和PKG_LIBS设置为BayesOpt包含文件夹和库,我在src /中有一个.cpp文件(称为test.cpp),它使用#include来处理来自BayesOpt的一些头文件.在这个文件中,我有// [[Rcpp::export]]我要导出的函数.
当我运行时R CMD check mypackage,库似乎成功运行 - 查看日志,一切顺利,直到它尝试加载刚刚"安装"的软件包.然后,我明白了
** testing if installed package can be loaded
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/home/me/p3/mypackage.Rcheck/mypackage/libs/mypackage.so':
/home/me/p3/mypackage.Rcheck/mypackage/libs/mypackage.so: undefined symbol: _ZTIN8bayesopt13DiscreteModelE
Run Code Online (Sandbox Code Playgroud)
在错误日志中. echo _ZTIN8bayesopt13DiscreteModelE | c++filt给出typeinfo for bayesopt::DiscreteModel,这是我的test.cpp文件中第一个使用BayesOpt头的对象.为了解决这个问题,我看起来又高又低,但我似乎找不到一个.我想相信Makevars正确地指向库,因为它能够在第一次安装检查期间找到头文件 - 只有在加载候选包时我得到这个未定义的符号错误.我看过一个使用外部库的Rcpp示例,但是Dirk在我看到的答案中指出RcppGSL,有一个3500+行配置脚本填充了Makevars,并且它有点难以解析.
我很感激任何人的帮助 - 我的最后一招是把所有东西都放进去,src但对于一个已经整齐有序的图书馆来说,这似乎很麻烦而且不那么优雅.