2014-10-29 163 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