我正在经历.如果我的 c++ 代码使用 C++11 std::regex
,那么在 Windows 上运行使用 Rcpp 构建的函数时调用问题,到目前为止我还没有找到出路。
与之前关于类似问题的问题不同,我既没有构建问题也没有链接问题。Rcpp 软件包使用 C++11 插件构建和链接,在我的平台上制作可用的软件包。 constexpr
和 C++11 特定的功能(如 std::stoi
)在不使用std::regex
时不会造成问题。
我遇到了链接问题,即使在指定 PKG_LIBS="-L/path/to/boost/libs -lboost_regex" 时也是如此,所以我宁愿坚持使用 std::regex
.
相同的软件包在linux下构建,安装和运行良好,使用vanilla std::regex或boost::regex。
不幸的是,我在精美的 Rcpp 画廊示例中找不到解决方案。
视窗平台是:
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. 问题集中在标准::正则表达式上。提升问题只是附带的评论。
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)不会产生任何变化。
你能试着再解开一下吗? 你在这里混合了很多东西。
尝试先从R中"只是"C++,使用更新的g ++ 4.9.3编译器,看看这是否可以让您如愿以偿地使用Boost。 你的用例是本地和非标准的,所以你必须解决这个问题。 我们通常只建议使用BH而不进行链接。
我实际上在这里没有看到 Rcpp 问题。 您只需将(工作,测试,受信任的)Rcpp设置推到尚未使用的角落。 所以你可能需要自己解决一些事情。
另请注意,用于 R 的 g++ 4.9.3 尚未真正发布。