Rcpp C++11 . Проблемы с вызовами под Windows
У меня возникают проблемы.Call при запуске функций, созданных с помощью Rcpp в Windows, если мой код на C++ использует C++11 std::regex
и я не нашел выхода до сих пор.
В отличие от предыдущих вопросов по аналогичным вопросам, у меня не было ни проблем со сборкой, ни связыванием. Пакет Rcpp прекрасно компилируется и связывается с помощью плагина C++11, что делает используемые пакеты на моей платформе. constexpr
и C++11-специфичные функции, такие как std::stoi
не вызывает проблем, когда std::regex
не используется
При использовании библиотек повышения Windows я испытывал проблемы с компоновкой, даже когда указывал PKG_LIBS="-L/path/to/boost/libs -lboost_regex", поэтому я бы предпочел придерживаться std::regex
,
Эти же пакеты собирают, устанавливают и запускают нормально под Linux, используя vanilla std::regex или boost:: regex.
К сожалению, я не нашел решения в прекрасных примерах галереи Rcpp.
Платформа Windows это:
R version 3.2.3 (2015-12-10)
x86_64-w64-mingw32/x64 (64-bit)
Работает под:
Windows >= 8 x64 (build 9200)
Rcpp_0.12.3
Rtools 3.3.0.1959 running g++ 4.9.3 (x86_64-posix-seh,
built by MinGW-W64 project), normally C++11-compatible.
PKG_CXXFLAGS="-std=c++11"
Платформа linux аналогична за исключением g++ (версия 5.3).
Ниже приведен упрощенный фрагмент кода для дублирования.
#include <Rcpp.h>
#if defined(__linux__) && ! defined(FORCE_STL_BUILD)
#include <boost/regex.hpp>
#define reglib boost
#else
#include <regex>
#define reglib std
#endif
#include <string>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
constexpr int a[3]= {2, 10, 15};
// [[Rcpp::export]]
int my_test(int prop, const std::string& index)
{
#ifndef NO_REG
static const reglib::regex test {"H.*A", reglib::regex::icase};
#endif
int index_int = std::stoi(index) + a[1] + prop;
return index_int;
}
Этот код работает нормально при сборке с использованием -DNO_REG. Иначе вызывая test::my_test(1, "1000")
возвращает:
`Error in .Call("test_my_test", PACKAGE = "test", prop, index) :
"test_my_test" not available for .Call() for package "test"`
РЕДАКТИРОВАТЬ:
1. Вопрос сосредоточен на std:: regex. Проблемы повышения - только случайные комментарии.
2. Проблемы возникают только после упаковки, а не использования Rcpp::source("cppfile")
3. Код упаковки:
Консоль R:
Rcpp::Rcpp.package.skeleton("test", attributes=TRUE, example_code=FALSE, cpp_files="test.cpp")
Rcpp::compileAttributes("test")
CMD консоль:
REM paths to R/bin/x64 and Rtools/bin, Rtools/mingw_64/bin added to PATH
set PKG_CXXFLAGS=-std=c++11
R CMD build test
R CMD INSTALL test_1.0.tar.gz
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:
Проблемы с вызовом возникают, как только в коде C++ объявлено регулярное выражение. Использование этого или нет (как в std::regex_match) не меняет ничего.
1 ответ
Можете ли вы попробовать распутать это еще немного? Вы смешиваете много вещей здесь.
Попробуйте сначала "просто" C++ из R с новым компилятором g++ 4.9.3 и посмотрите, позволяет ли вам использовать Boost, как вы надеетесь. Ваш вариант использования там локальный и нестандартный, так что вы должны решить это. Обычно мы просто рекомендуем использовать BH без ссылок.
Я на самом деле не вижу проблемы Rcpp здесь. Вы просто толкаете (работающую, проверенную, доверенную) настройку Rcpp в угол, в котором она еще не использовалась. Так что, возможно, вам придется решить некоторые вещи самостоятельно.
Также обратите внимание, что g++ 4.9.3 для R еще не выпущен.