如何更改和设置 Rcpp 编译参数
How to change and set Rcpp compile arguments
我创建了一个新的 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
我想 change/set 这些参数,例如删除 -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/configure
和 chmod 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 默认值,并使用了正确的选项。
这只是一个基本示例,因此您可能希望根据自己的目标进一步深入:
- 为不同的平台调整脚本(例如 Unix/Linux vs Windows/Windows 64 位),我相信链接的文章中提到了这一点。
- 确保从您的计算机设置文件的权限足以让这些文件在不同的计算机上执行(我认为它会起作用,但我不完全肯定)。
感谢@nrussell 并回答了我搜索了 2 天的问题!这些解决方案是 必不可少的 对具有高学习曲线的 Rcpp
小插图的补充。为了添加到您的说明中,我通过以下方式进行了构建:
- 在 RStudio 的现有 R 项目中,否则执行菜单 文件>新建项目。
构建 > 配置构建工具 > 选择 'package' 并指向包
您之前创建的文件夹,即 Rcpp.package.skeleton(name ="yourRpackageName",cpp_files = "yoursourcefile.cpp")
然后在右上角的窗格中找到 Build 选项卡并选择 Install and Restart
- 运行
sourceCpp
,例如sourceCpp(file ="anRpackage/src/rcpp_hello_world.cpp")
。要检查它是否已使用新指令编译,请转到右下角的窗格并单击 Source Cpp 选项卡。
- 然后示例函数
rcpp_hello_world()
将起作用。
我创建了一个新的 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
我想 change/set 这些参数,例如删除 -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/configure
和 chmod 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 默认值,并使用了正确的选项。
这只是一个基本示例,因此您可能希望根据自己的目标进一步深入:
- 为不同的平台调整脚本(例如 Unix/Linux vs Windows/Windows 64 位),我相信链接的文章中提到了这一点。
- 确保从您的计算机设置文件的权限足以让这些文件在不同的计算机上执行(我认为它会起作用,但我不完全肯定)。
感谢@nrussell 并回答了我搜索了 2 天的问题!这些解决方案是 必不可少的 对具有高学习曲线的 Rcpp
小插图的补充。为了添加到您的说明中,我通过以下方式进行了构建:
- 在 RStudio 的现有 R 项目中,否则执行菜单 文件>新建项目。
构建 > 配置构建工具 > 选择 'package' 并指向包 您之前创建的文件夹,即
Rcpp.package.skeleton(name ="yourRpackageName",cpp_files = "yoursourcefile.cpp")
然后在右上角的窗格中找到 Build 选项卡并选择 Install and Restart
- 运行
sourceCpp
,例如sourceCpp(file ="anRpackage/src/rcpp_hello_world.cpp")
。要检查它是否已使用新指令编译,请转到右下角的窗格并单击 Source Cpp 选项卡。 - 然后示例函数
rcpp_hello_world()
将起作用。