在Rcpp中如何引用集群安装的C++包?以Boost包为例
解决Rcpp中引入集群指定路径Boost库的问题
不要直接在#include里写完整绝对路径,这会破坏Boost内部头文件的相对引用逻辑。正确做法是通过编译选项添加Boost的根目录到编译器的包含路径,这样编译器会自动在指定目录下查找boost/开头的头文件。
具体操作分两种场景:
1. 直接用sourceCpp运行Rcpp代码
在调用sourceCpp时,通过cppargs参数指定包含路径:
sourceCpp("your_code.cpp", cppargs = "-I/storage/icds/RISE/sw8/boost_1_81_0")
你的Rcpp代码里依然可以保持标准的Boost头文件引用:
#include <boost/math/distributions/binomial.hpp>
2. 开发R包时集成Boost
如果是在R包中使用Boost,修改包的Makevars(Unix/Linux环境)文件,添加包含路径:
PKG_CPPFLAGS = -I/storage/icds/RISE/sw8/boost_1_81_0
这样编译包时,编译器会自动从指定路径加载Boost的头文件,适配内部的相对引用结构。
原理说明
编译器的-I选项会把指定目录添加到头文件搜索路径的最前端,当代码中出现#include <boost/math/xxx.hpp>时,编译器会自动在/storage/icds/RISE/sw8/boost_1_81_0目录下查找对应的boost/math/xxx.hpp文件,无需修改Boost内部的头文件引用路径。
内容的提问来源于stack exchange,提问作者Chinyako
相关产品推荐
相关产品推荐

