如何更改和设置Rcpp编译参数



我创建了一个新的Rcpp包(通过使用RStudio)。这个包包含一个c++函数,通过使用以下编译器选项进行编译:

clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG-I/usr/local/include/freetype2 -I/opt/X11/include -I"/Library/Frameworks/R.framework/Versions/3.2/Resources/Library/Rcpp/include"-fPIC -Wall -mtune=core2 -g -O2 -c RcppExports.cpp -o RcppExports.o

我想更改/设置这些参数,例如删除-g,添加-std=c++11并将参数-O2更改为-O3。此外,最好能够指定一次这些更改(对于包)。

完成编写R扩展,第1.2节,看起来您应该能够使用几个shell脚本来处理这个问题。作为一个最小的示例(在Linux机器上工作),我从Rcpp::Rcpp.package.skeleton创建了一个基本包,并将以下两个文件放在项目根目录中:

#!/bin/bash
if [ ! -d "~/.R" ]; then
  mkdir ~/.R; touch ~/.R/Makevars
  echo "CXXFLAGS= -O3 -std=c++11 -Wall -mtune=core2" > ~/.R/Makevars
elif [ ! -e "~/.R/Makevars" ]; then
  touch ~/.R/Makevars
  echo "CXXFLAGS= -O3 -std=c++11 -Wall -mtune=core2" > ~/.R/Makevars
else
  mv ~/.R/Makevars ~/.R/Makevars.bak_CustomConfig
  echo "CXXFLAGS= -O3 -std=c++11 -Wall -mtune=core2" > ~/.R/Makevars
fi

清理

#!/bin/bash
if [ -e "~/.R/Makevars.bak_CustomConfig" ]; then
  mv -f ~/.R/Makevars.bak_CustomConfig ~/.R/Makevars
fi

,然后使它们可执行(chmod 777 path/to/project/root/configurechmod 777 path/to/project/root/cleanup)。当我运行Build and Reload时,我得到(节选):

g++ -m64 -I/usr/include/R -DNDEBUG  
-I/usr/local/include 
-I"/home/nr07/R/x86_64-redhat-linux-gnu-library/3.2/Rcpp/include"  
-fpic  -O3 -std=c++11 -Wall -mtune=core2
-c rcpp_hello.cpp -o rcpp_hello.o
g++ -m64 -shared -L/usr/lib64/R/lib 
-Wl,-z,relro -o CustomConfig.so RcppExports.o rcpp_hello.o 
-L/usr/lib64/R/lib -lR

覆盖R的Makevars默认值,并使用正确的选项。


这只是一个基本的示例,因此您可能希望根据您的目标进一步执行几个步骤:

  1. 为不同的平台调整脚本(例如Unix/Linux vs Windows/Windows 64位),我相信链接的文章中有涉及。
  2. 确保从您的机器设置文件的权限足以使这些文件在不同的计算机上执行(我认为它会起作用,但我不完全肯定)。

谢谢@nrussell,回答了我2天搜索的问题!这些解决方案是一个必要的除了Rcpp的小插曲,有一个高的学习曲线。为了添加到您的指令,我做了构建:

  1. 如果在RStudio中已有的R项目中,则执行菜单File>New project.
  2. Build> Configure Build Tools>选择'package'并指向包文件夹Rcpp.package.skeleton(name ="yourRpackageName",cpp_files = "yoursourcefile.cpp")

  3. 然后找到右上方窗格的Build选项卡,选择Install and Restart

  4. 执行sourceCpp,例如sourceCpp(file ="anRpackage/src/rcpp_hello_world.cpp")。要检查它是否已经编译了新的说明,请转到右下角窗格并单击Source Cpp选项卡。
  5. 则示例函数rcpp_hello_world()将工作。

最新更新