如何将一个链接器标志添加到R CMD SHLIB?

时间:2017-08-30 17:08:07

标签: r

我在R中通过R CMD SHLIB以编程方式调用system2()。我希望链接器链接另一个.so文件,但我想避免修改{{1}在PKG_LIBS中。当我尝试将Makevars文件路径作为参数传递给.so时,所有其他链接器标志都被删除,如ss中所述。 Writing R Extensions Manual中的5.5:

  

将链接器命令作为参数提供给R CMD SHLIB将优先于Makevars中的PKG_LIBS。

有没有办法告诉R CMD SHLIB添加一个额外的标志(而不是替换所有标志)?

或者,是否有一种干净的编程方式来检索所有当前标志,以便我可以手动添加一个?类似下面的R CMD SHLIB

--get-linker-flags

我还试图非侵入性地将环境变量附加到linker_flags <- system2('R', c('CMD', 'SHLIB', '--get-linker-flags'), stdout = TRUE) linker_flags <- paste(linker_flags, '/path/to/my_library.so') system2('R', c('CMD', 'SHLIB', 'my_file.cpp', '-o', 'my_file.so', linker_flags)) 中的PKG_VARS

Makevars

然后在调用- PKG_VARS = ...existing vars... + PKG_VARS = ...existing vars... $(PKG_VARS) 之前Sys.setenv(PKG_VARS = '/path/to/my_library.so'),但这不起作用。

1 个答案:

答案 0 :(得分:0)

  

我在R。

中通过system2()以编程方式调用R CMD SHLIB

我会称之为“做错了” - 这样做本身就是平台依赖的(.so vs .dll vs .dylib)。所以我们首先提供(当然还在工作)inline包来提供帮助。

之后Rcpp Attributes

对于任何实际工作,请考虑创建一个包。

至于

  

有没有办法告诉R CMD SHLIB添加一个额外的标志(而不是替换所有标志)?

是的,因为您同时拥有=+=,除此之外还有CXXFLAGSPKG_CXXFLAGS

最后,对于Rcpp,我们使用插件来管理这种行为。

编辑:但如果你真的必须:

R> flgs <- tools::Rcmd("config CXXFLAGS", TRUE)
R> flgs
[1] "-g -O3 -Wall -pipe -Wno-unused -march=native"
R> paste(flgs, "-fopenmp")
[1] "-g -O3 -Wall -pipe -Wno-unused -march=native -fopenmp"
R> 

您现在可以将CXXFLAGS传递给Sys.setenv。同上LIBS

R> libs <- tools::Rcmd("config --ldflags", TRUE)
R> paste(libs, "-fopenmp")
[1] "-Wl,--export-dynamic -fopenmp -Wl,-Bsymbolic-functions -Wl,-z,relro -L/usr/lib/R/lib -lR -lpcre -llzma -lbz2 -lz -lrt -ldl -lm -fopenmp"
R>