我在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')
,但这不起作用。
答案 0 :(得分:0)
我在R。
中通过system2()以编程方式调用R CMD SHLIB
我会称之为“做错了” - 这样做本身就是平台依赖的(.so vs .dll vs .dylib)。所以我们首先提供(当然还在工作)inline包来提供帮助。
对于任何实际工作,请考虑创建一个包。
至于
有没有办法告诉R CMD SHLIB添加一个额外的标志(而不是替换所有标志)?
是的,因为您同时拥有=
和+=
,除此之外还有CXXFLAGS
和PKG_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>