【发布时间】:2014-02-12 15:10:19
【问题描述】:
系统规格:
- 操作系统 - Mac OS X 10.6.8(雪豹)
- g++ - Macports gcc 4.8.1_2+universal
- R - 2.15.3
- Rcpp - 0.10.3
当我尝试编译在 R 中(通过 Rcpp)使用 C++11 的函数时,我不断收到错误消息 - 由于某种原因,g++ 无法识别 -std=c++11 选项。
此示例取自 Rcpp 帮助文件(它不包含任何特定于 C++11 的内容,但可以显示我的问题所在)。如果我尝试运行:
require( Rcpp )
Sys.setenv( "PKG_CXXFLAGS"="-std=c++11" )
cppFunction(plugins=c("cpp11"), '
int useCpp11() {
int x = 10;
return x;
}')
我明白了:
cc1plus: error: unrecognized command line option "-std=c++11"
make: *** [file61239328ae6.o] Error 1
g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/include/x86_64 -DNDEBUG -I/usr/local/include -I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include" -std=c++11 -fPIC -g -O2 -c file61239328ae6.cpp -o file61239328ae6.o
Error in sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput, :
Error 1 occurred building shared library.
同时,我可以直接从 bash 编译这个函数 - 如果这个代码在 useCpp11.cpp 文件中,那么它运行没有任何抱怨:
g++ useCpp11.cpp -std=c++11
当然,我做错了什么,但我无法弄清楚它是什么。 gcc 4.8 被设置为 bash 中的默认编译器,Rcpp 过去一直在正常工作。我怀疑我没有告诉 R 使用哪个版本的 g++ - 可能是这样吗?
【问题讨论】:
-
如果你在 Mac 上使用 clang
-
我还需要我的代码在 Windows 和 Linux 上工作...
-
尝试传递“-v”而不是“-std=c++11”来确认您怀疑选择了错误的 gcc 版本。
-
在 R 会话中运行
Sys.getenv()["PATH"]的输出是什么?是否有一个较旧的g++首先从这些目录之一访问?尝试使用Sys.setenv(CXX=<full_path_to_g++>)强制使用特定的g++。 -
我认为最好的解决方案是创建一个文件
~/.R/Makevars,并在其中放置您的制作标志等。所以你可以设置CXX=<path_to_g++>,从此不用操心。