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 еще не выпущен.

Другие вопросы по тегам