【发布时间】: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 选项来编译但没有链接目标文件。