Rcpp и компилятор C++ по умолчанию
у меня есть некоторые странные проблемы с Rcpp-он использует непредсказуемый компилятор C++. Этот вопрос несколько похож на этот вопрос.
Я на OSX, у меня 2 complilers - по умолчанию clang
и clang-omp
С поддержкой openmp. Также у меня есть следующие ~/.R/Makevars
файл (где я настроил clang-omp
как компилятор по умолчанию):
CC=clang-omp
CXX=clang-omp++
CFLAGS + = - O3-стена-труба-педантичный-std=gnu99
CXXFLAGS + = - O3 - Стена-труба-Wno-неиспользованный-педантичный-fopenmp
проблема в том, что пакет, который я разрабатываю, компилируется с clang++
, а не clang-omp++
. Я также попытался (в качестве эксперимента по проблеме lacate) изменить пакет src/Makevars
и set CXX=clang-omp++
и более того изменен $R_HOME/etc/Makeconf
CXX
запись CXX = clang-omp++
. Не повезло - он по-прежнему компилируется с clang++
. Понятия не имею, почему это происходит.
также Вот небольшой воспроизводимый (как из консоли R, так и из Rstudio) пример (не знаю связано ли это с вопросом выше).
Предположим, что 2 очень похожие функции cpp:
1.
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
return x * 2;
}
вызов sourceCpp
от R:
library(Rcpp)
sourceCpp("src/Rcpp_compiler.cpp", verbose = T)
/ библиотека / фреймворки / R. framework/ресурсы/bin / R CMD SHLIB-o 'sourceCpp_1.Итак, Rcpp_compiler.cpp'
clang-omp++ - I / библиотека / фреймворки / R. framework / ресурсы/include-DNDEBUG-I / usr / local/include-I / usr / local/include / freetype2-I / opt/X11 / include -Я"/пользователи/dmitryselivanov/библиотеки/Р/3.2/библиотека/Rcpp/включить" -я"/пользователи/dmitryselivanov/проекты/эксперименты/ГРЦ" -спосил -стены -mtune=сердечником2 -г -О2 -О3 -стены -трубы -кто-неиспользованный -педантичный -fopenmp -с Rcpp_compiler.cpp-o Rcpp_compiler.o
clang-omp++ -dynamiclib -зя,-headerpad_max_install_names -неопределенные dynamic_lookup -single_module -multiply_defined пресечения -л/библиотеки/фреймворки/Р. рамки/ресурсы/библиотека-л в/usr/местные/библиотека-о sourceCpp_1.так Rcpp_compiler.о - F / Library / Framework / R. framework/.. - framework R-Wl,- framework-Wl, CoreFoundation
работа как ожидалось-использует clang-omp++ и все мои флаги из ~/.R/Makevars
2.
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
return x * 2;
}
библиотека / фреймворки / R. framework/ресурсы/bin / R CMD SHLIB-o 'sourceCpp_2.Итак, Rcpp_compiler.cpp'
clang++ - std=c++11-I / библиотека / фреймворки / R. framework / ресурсы / include-DNDEBUG-I / usr / local/include -Я в/usr/местные/включать/freetype2 -я/опт/Х11/включить-я"/пользователи/dmitryselivanov/библиотеки/Р/3.2/библиотека/Rcpp/включить" -я"/пользователи/dmitryselivanov/проекты/эксперименты/ГРЦ" -спосил -стены -mtune=сердечником2 -г -О2 -ц Rcpp_compiler.cpp-o Rcpp_compiler.o
clang++ -с std=с++11 -dynamiclib -от WL,-headerpad_max_install_names -неопределенные dynamic_lookup -single_module -multiply_defined подавить -л/библиотеки/фреймворки/Р. основы/ресурсы/библиотека-л в/usr/местные/библиотека-о sourceCpp_2.так Rcpp_compiler.о - F / Library / Framework / R. framework/.. - framework R-Wl,- framework-Wl, CoreFoundation
я только добавил // [[Rcpp::plugins(cpp11)]]
и он компилируется с clang++
вместо clang-omp++
вот мой sessionInfo()
:
R версия 3.2.1 (2015-06-18) Платформа: x86_64-apple-darwin13.4.0 (64-разрядная версия)
Работает под управлением: OS X 10.10.5 (Yosemite)
место действия: 1 язык.UTF-8 / en_US.UTF-8 / en_US.UTF-8/C / en_US.UTF-8 / en_US.UTF-8 прикрепленные базовые пакеты:
1 статистика графика grDevices utils наборы данных методы базы данных
другие пакеты: 1 Rcpp_0.12.1
загружается через пространство имен (и не прикрепляется): 1 tools_3.2.1
2 ответов
спасибо, @Dirk намек, я наконец получил ответ. Надеюсь, это сэкономит кому-то немного времени.
Следующие две строки в ~/.R/Makevars
решить мою проблему:
CXX1X=clang-omp++
подробности на эта запись R Extensions раздел.
Я прочитал только одну строку ваш вопрос и остановилась:
у меня есть некоторые странные проблемы с Rcpp-он использует непредсказуемый компилятор C++
это как неправильно, а также воспалительные. Пожалуйста, прочитайте документацию R, включенную в вашу версию R, и узнайте, как R устанавливает эти вещи.
Rcpp не делает ничего лишнего. Все это поведение по умолчанию R:
как пользователь вы можете установить это в
~/.R/Makevars
в качестве автора пакета, нацеленного на портативные и CRAN-совместимые пакеты, вы не можете не использовать, скажем,
configure
на построенном времени пакета.
это все документировано и имеет это уже обсуждалось.