2014-10-29 113 views
1

我需要从C++源生成目标文件,然后将它们与Boost正规表库链接以模仿使用Rcpp编译包。我在编写小测试用例和完整软件包时观察到了同样的问题,因此这里提供了两个版本的问题,供不熟悉Rcpp的人使用。链接提升正则表达式

小测试用例

我使用gcc 4.6.3在Windows上,由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 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?

+0

原来,对于小测试用例,我只是忘记了gcc -c选项来编译但不链接对象文件。 – vkubicki 2014-10-30 13:29:01

回答

2

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

我在我的一个软件包中使用了正则表达式,并且没有在Windows上编译错误。您可以通过

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

希望它可以帮助你找到它。

+0

我在boost_1_56_0 \ libs \ regex \ build目录内使用'make -f gcc.mak'构建boost正则表达式。我想我面临的问题来自用于构建正则表达式和我自己的包的编译标志的区别。感谢您提供您的软件包,这将有所帮助! – vkubicki 2014-10-30 15:05:40

+0

钉住它!罪魁祸首是-m64 :)! – vkubicki 2014-10-30 17:04:08

+0

@vkubicki恭喜! – 2014-10-30 20:55:43

1

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

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

一旦您使用包装,所有这一切变得更容易。在这里,数十个关于SO的答案强烈建议将包作为更复杂的R和C++文件集合的适当结构。

本文主要讨论几个地方,从Writing R Extensions手册和我的Rcpp书开始。 CRAN上的许多Rcpp包都这样做。对于Windows和CRAN自动构建器,您还有一个额外的问题需要确保他们拥有您需要的库。

编辑:即使你的编辑后,你的例子是不完整的或最小的,但如果你想看到一个简单的使用正则表达式加速与RCPP,该Rcpp Gallerypost illustraing it为好。如果你想自成一体,那么@KQiang的建议是很好的:嵌入源代码。你将不得不依靠如何构建包含子目录的包,所以你交换了一个难题。但是这两种方法都有例子。

+0

我在第一篇文章中添加了包含我发生同样错误的软件包Makevars的摘录。 – vkubicki 2014-10-29 14:46:33