ошибки g++ при попытке компиляции c++11 с помощью Rcpp
СПЕЦИФИКАЦИЯ СИСТЕМЫ:
- OS - Mac OS X 10.6.8 (Снежный Барс)
- g++ - Macports gcc 4.8.1_2 + универсальный
- R - 2.15.3
- Rcpp - 0.10.3
Я продолжаю получать ошибку, когда я пытаюсь скомпилировать функции, которые используют C++11 в R (через Rcpp) - по какой-то причине 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
3 ответов
Кевин ушли абсолютно прав - самый простой способ убедиться, что используется правильный компилятор-через . В моем случае я добавил:--3-->
CXX = g++-4.8.1
PKG_CXXFLAGS = -std=c++11
это то, чего мне не хватало - и все это сработало впоследствии. Это работает, если вы компилируете свой пакет.
вопросы:
вы за on Rcpp, который находится в выпущенной версии 0.10.4
версия, которую вы используете (0.10.3) есть плагин для C++11
здесь Целая статья в галерее Rcpp какие подробности этого.
так позвольте мне процитировать из этого C++11 часть на Rcpp Галерея:
R> library(Rcpp)
R> sourceCpp("/tmp/cpp11.cpp")
R> useAuto()
[1] 42
R>
где код /tmp/cpp11.cpp
следующим образом:
#include <Rcpp.h>
// Enable C++11 via this plugin (Rcpp 0.10.3 or later)
// [[Rcpp::plugins("cpp11")]]
// [[Rcpp::export]]
int useAuto() {
auto val = 42; // val will be of type int
return val;
}
если это не работает для вас, то ваша система не настроена правильно. Другими словами, это не вопрос для Rcpp
tag -- но скорее для "как настроить мой путь для вызова версии g++, я думаю, что я должен вызывать".
если вы не хотите исправлять свой путь, вы можете установить PKG_CXXFLAGS
переменная среды непосредственно перед компиляцией.
export PKG_CXXFLAGS='`Rscript -e "Rcpp:::CxxFlags()"` -std=c++11'
например:
на R
#generate the bare Rcpp package as usual
library(Rcpp)
Rcpp.package.skeleton("Foo",
example_code=FALSE,
attributes=TRUE,
cpp_files=c("./Foo_R_wrapper.cpp", "./Foo.h", "/Foo.cpp")
)
и Баш
#tell the compiler to use C++11
export PKG_CXXFLAGS='`Rscript -e "Rcpp:::CxxFlags()"` -std=c++11'
#compile as usual
cd ./Foo/;
R -e 'Rcpp::compileAttributes(".",verbose=TRUE)';
cd ..;
R CMD build Foo;
#ensure that there are no bugs
R CMD check Foo;
здесь Foo_R_wrapper.cpp обертывает функцию C++ FooBar, определенную и реализованную в Фу.h и Фу.cpp соответственно.
Foo_R_wrapper.cpp может содержать следующие элементы:
#include <Rcpp.h>
#include "Foo.h"
// [[Rcpp::export]]
SEXP FooBar(SEXP baa)
{
Rcpp::NumericVector baa_vec(baa)
//Do something from Foo.h (to baa_vec?)
...
//etc
return baa_vec;
}