【问题标题】:Linking Boost Regex链接 Boost 正则表达式
【发布时间】:2014-10-29 13:32:49
【问题描述】:

我需要从 C++ 源代码构建目标文件,然后将它们链接到 Boost Regex 库以模拟使用 Rcpp 编译包的过程。我在一个小测试用例和完整包的编译中发现了同样的问题,因此这里提供了两个版本的问题,供不熟悉 Rcpp 的人使用。

小测试用例

我在 Windows 上使用 Gcc 4.6.3,由 Rtools 提供。测试的源文件非常基本:我包含 regex.hpp,然后我使用 boost::regex、boost::regex_match、boost::regex_search 和 boost::smatch。问题是,如果我使用以下代码编译代码:

g++ -O0 -pipe -g -Wall -I"xxx\boost_1_56_0" "src/01 - regex.cpp" -o Debug/regex.o
g++ -O0 -pipe -g -Wall Debug/regex.o "xxx\libboost_regex-gcc-1_56.a" -o Debug/reg.exe

我在第一个命令时收到这种错误消息:

undefined reference to `boost::re_detail::cpp_regex_traits_char_layer<char>::init()

但如果我使用单个命令来构建所有内容:

g++ -O0 -pipe -g -Wall -I"xxx\boost_1_56_0" "src/01 - regex.cpp" "xxx\libboost_regex-gcc-1_56.a" -o Debug/reg.exe

我没有收到任何错误消息。如何编译我的目标文件然后链接到 Boost Regex?

完整的 Rcpp 包有问题

在更大的上下文中,当我编译我真正的 Rcpp 包时,我能够编译其他几个目标文件,然后将它们链接到(非 Boost)库。 Boost Regex 是这方面第一个有问题的库。

完整的包是使用以下方法构建的:

R CMD INSTALL --no-multiarch --with-keep.source .

与:

STKPPLIB = ../../stkpp/lib/libSTKpp.a
RELIB = ../../boost_1_56_0/libs/regex/build/gcc/libboost_regex-gcc-1_56.a
MCLIB = ../../MixtComp/lib/libMixtComp.a

和:

PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` $(MCLIB) $(STKPPLIB) $(RELIB)

并且构建过程给出了类似的“未定义引用”错误。问题与上一个问题相同:如何编译我的目标文件然后链接到 Boost Regex ?

【问题讨论】:

  • 原来对于小测试用例我只是忘记了 gcc -c 选项来编译但没有链接目标文件。

标签: c++ regex r boost rcpp


【解决方案1】:

我个人的建议是将正则表达式部分的源代码放在你的包中,并在安装包时编译它。

我在我的一个包中使用了正则表达式,并且在 Windows 上没有编译错误。你可以找到它

https://github.com/thirdwing/mzR/

希望对你有帮助。

【讨论】:

  • 我在 boost_1_56_0\libs\regex\build 目录中使用 make -f gcc.mak 构建了 boost 正则表达式。我想我面临的问题来自构建正则表达式和我自己的包中使用的编译标志的差异。感谢您提供包裹,这将有所帮助!
  • 成功了!罪魁祸首是 -m64 :) !
  • @vkubicki 恭喜!
【解决方案2】:

这相当于标准问题“我如何构建需要链接到库的包?”

首先,您应该使用R CMD COMPILE ... 而不是手动调用g++。然后,您可以使用 R 提供的所有选项来声明要链接到的库——值得注意的 PKG_LIBS。

一旦你使用了一个包,这一切都会变得更容易。 SO 上的数十个答案强烈建议将包作为更复杂的 R 和 C++ 文件集合的适当结构。

在几个地方讨论了这个主题,从编写 R 扩展手册和我的 Rcpp 书开始。 CRAN 上的许多 Rcpp 包都可以做到这一点。对于 Windows 和 CRAN 自动构建器,您还需要确保它们拥有您需要的库。

编辑:即使在您编辑之后,您的示例仍不完整或最小,但如果您想看到 Boost 正则表达式与 Rcpp 的简单使用,Rcpp Gallery 有一个 post illustraing it 作为好。如果你想自成一体,那么@KQiang 的建议很好:嵌入源代码。您将不得不学习如何构建带有子目录的包,因此您需要以一种难度换取另一种难度。但是这两种方法都有例子。

【讨论】:

  • 我在最初的帖子中添加了我遇到相同错误的包 Makevars 的摘录。
猜你喜欢
  • 2013-07-09
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 2012-06-08
相关资源
最近更新 更多