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

标签 c++ r c++11 rcpp

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

clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -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。此外,最好能够一次指定这些更改(对于包)。

最佳答案

正在工作 Writing R Extension, Section 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)。 当我运行构建和重新加载时,我得到了(摘录):

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 与 Windows/Windows 64 位),我相信链接文章中提到了这一点。
  2. 确保从您的计算机设置文件的权限足以让这些文件在不同的计算机上执行(我认为它会起作用,但我不完全肯定)。

关于c++ - 如何更改和设置 Rcpp 编译参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32586455/

相关文章:

c++ - 在程序运行时更改 DLL

根据另一个向量的索引替换向量元素

r - 如何根据在一列中排序的奇数列重新排列偶数列

c++ - 带有尾随返回类型的 final、override、const 的语法

c++ - 如何有条件地定义默认构造函数?

c++ - cocreateinstance 成功后访问 COM 方法失败

c++ - 将 ROS PointCloud2 消息转换为 PCL PointCloud 后出现奇怪的段错误

c++ - 什么是回调?它的用途是什么以及如何在 C++ 中实现

r - 在 R 中将行转换为列

使用 unique_ptr 的 C++ char 数组