RInside и Rcpp в С++x11

Я хотел бы использовать RInside в коде С++ x11 для вызова процедуры R. По умолчанию R, кажется, устанавливает версию библиотеки С++ 98, и поэтому связывание не удается. Интересно, какие шаги я должен предпринять, чтобы установить версию RInside для c++x11 (но я думаю, что мне нужно перекомпилировать весь пакет R/R, не так ли?), и существует ли какое-то более простое решение. Заранее спасибо (работаю на MacOs)

Обновление: я переустановил Rcpp и RInside (мой Makevars пуст, поэтому версия С++ 98)

 sudo R CMD INSTALL ~/Downloads/Rcpp_0.10.4.tar.gz 
 sudo R CMD INSTALL ~/Downloads/RInside_0.2.10.tar.gz

Затем я компилирую пример hello world, используя (без cx11):

clang++ -I/Library/Frameworks/R.framework/Versions/2.15/Headers/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/include/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/  -c ../src/Gui/test.cc -o testOut.cc.o

clang++ testOut.cc.o -o testOut -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/lib/x86_64 -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64 -framework R -lRInside -lRcpp

Это производит меня:

  Hello, world!

Однако, добавив опцию x11:

clang++ -I/Library/Frameworks/R.framework/Versions/2.15/Headers/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/include/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/  -c ../src/Gui/test.cc -o testOut.cc.o -stdlib=libc++ -std=c++11

clang++ testOut.cc.o -o testOut -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/lib/x86_64 -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64 -framework R -lRInside -lRcpp -stdlib=libc++ -std=c++11

Я получаю (при ссылке):

  Undefined symbols for architecture x86_64:
   "RInside::parseEvalQ(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
  _main in testOut.cc.o
   "RInside::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
  _main in testOut.cc.o
   "Rcpp::Environment::assign(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, SEXPREC*) const", referenced from:
        bool Rcpp::Environment::assign<char [15]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [15]) const in testOut.cc.o

При перекомпиляции Rcpp и RInside с использованием опций c++x11

clang++ -I/Library/Frameworks/R.framework/Versions/2.15/Headers/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/include/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/  -c ../src/Gui/test.cc -o testOut.cc.o -stdlib=libc++ -std=c++11

clang++ testOut.cc.o -o testOut -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/lib/x86_64 -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64 -framework R -lRInside -lRcpp -stdlib=libc++ -std=c++11

нравится, но ./test дает мне ошибку seg.

Добавлено: моя версия clang: Apple clang версии 4.1 (tags/Apple/clang-421.11.66)


person user1835313    schedule 16.10.2013    source источник
comment
Я бы сказал, что вы не успешно собрали библиотеку, если ваша программа зависла на простейшем примере. Также нет реальной необходимости перепечатывать исходный код, который годами находился в репозитории и дистрибутиве RInside.   -  person Dirk Eddelbuettel    schedule 16.10.2013


Ответы (2)


R компилируется компилятором c. Вам не обязательно использовать то же самое для сборки пакетов. Таким образом, использование clang для компиляции дополнительных пакетов вполне допустимо. У меня есть это в моем файле ~/.R/Makevars для использования clang и С++ 11 для пакета:

CC=clang
CXX=clang++
CXXFLAGS= -stdlib=libc++ -std=c++11

Кроме того, вы можете взглянуть на Rcpp11, редизайн Rcpp, ориентированный на C++11. Вероятно, было бы несложно разветвить RInside, чтобы использовать Rcpp11 вместо Rcpp.

person Romain Francois    schedule 16.10.2013

Я не знаю о различных требованиях компоновщика. То, что у вас есть, должно просто работать. В противном случае, пожалуйста, покажите ваши фактические шаги и ошибки связывания, желательно в воспроизводимом виде, на который я тоже мог бы посмотреть в конце.

Свидетельствуйте следующее. Сначала мы строим с флагами по умолчанию:

edd@max:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars
CXXFLAGS=             -g -O3 -Wall -pipe -Wno-unused -pedantic    # plain C++ 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ make rinside_sample0
ccache g++-4.7 -I/usr/share/R/include \
  -I/usr/local/lib/R/site-library/Rcpp/include \
  -I/usr/local/lib/R/site-library/RInside/include -g -O3 -Wall \
  -pipe -Wno-unused -pedantic -Wall   \
  rinside_sample0.cpp  -L/usr/lib/R/lib -lR  -lblas \
  -llapack -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp \
  -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
  -L/usr/local/lib/R/site-library/RInside/lib \
  -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
  -o rinside_sample0
edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0 
Hello, world!       
edd@max:~/svn/rinside/pkg/inst/examples/standard$ 

Теперь я просто добавляю -std=c++11 к своему CXXFLAGS:

edd@max:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars 
CXXFLAGS=             -g -O3 -Wall -pipe -Wno-unused -pedantic -std=c++11
edd@max:~/svn/rinside/pkg/inst/examples/standard$  

и переделайте бинарник:

edd@max:~/svn/rinside/pkg/inst/examples/standard$ rm rinside_sample0  
edd@max:~/svn/rinside/pkg/inst/examples/standard$ make rinside_sample0
ccache g++-4.7 -I/usr/share/R/include \
 -I/usr/local/lib/R/site-library/Rcpp/include \
 -I/usr/local/lib/R/site-library/RInside/include \
 -g -O3 -Wall -pipe -Wno-unused \
 -pedantic -std=c++11 -Wall  \
  rinside_sample0.cpp  -L/usr/lib/R/lib -lR \
 -lblas -llapack -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp \
 -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
 -L/usr/local/lib/R/site-library/RInside/lib \
 -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
 -o rinside_sample0 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0    
Hello, world!        
edd@max:~/svn/rinside/pkg/inst/examples/standard$  

Для развертывания C++11 вам не нужен новый компилятор или проект.

Просто добавьте один параметр к флагам вашего компилятора — это так просто.

И просто чтобы сделать это более понятным, мы также можем добавить эти три строки к rinside_sample0.cpp, чтобы сделать его программой C++11:

auto magic = 42;                    // C++11 
R["magic"] = magic;                    
R.parseEvalQ("print(magic)");     

и (с требуемым флагом -std=c++11) он тоже собирается и запускается. Не требуется никаких изменений на стороне Rcpp или RInside для их развертывания с помощью компилятора с поддержкой C++11.

person Dirk Eddelbuettel    schedule 16.10.2013
comment
Извините, я немного потерялся. Вы предлагаете мне не перекомпилировать RInside и Rcpp? - person user1835313; 16.10.2013
comment
Это то, что мой пример только что продемонстрировал. - person Dirk Eddelbuettel; 16.10.2013
comment
Rcpp 0.10.4 — более ранняя версия. Попробуйте новейшее. Попробуйте все без каких-либо модификаций, чтобы продемонстрировать, что ваша система не засорена. Потом посыпать модификациями. Список rcpp-devel может вам помочь, так как пользователей OS X довольно много. - person Dirk Eddelbuettel; 16.10.2013
comment
Вполне может быть взаимодействие с новым clang++ -- мы выпускаем Rcpp / Rinside для CRAN, и он проходит все (разумные) системы и ОС, на которых тестирует CRAN (за отмеченным исключением Solaris, который никто не использует, никто не может нам помочь). с патчами). Это включает в себя OS X. Вы используете его за пределами этих спецификаций; как я показал, это все еще работает на моей системе, и у меня нет доступа к такой, как ваша. - person Dirk Eddelbuettel; 16.10.2013
comment
Выбор более новой версии не удаляет неопределенные символы для архитектуры x86_64. Я не понимаю, почему мне нужно перекомпилировать Rcpp и RInside, чтобы иметь совместимую версию, в то время как вам это не нужно. - person user1835313; 16.10.2013
comment
Я предполагаю, что это потому, что я использую версию clang для Apple. - person user1835313; 16.10.2013
comment
Я могу прекрасно сочетать clang/clang++ и gcc/g++ в Linux. Я только что перестроил пример с clang++. - person Dirk Eddelbuettel; 16.10.2013