簡體   English   中英

鏈接Boost正則表達式

[英]Linking Boost Regex

我需要從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?

我個人的建議是將正則表達式的部分放在你的包中,並在安裝包時編譯它。

我在我的一個軟件包中使用了正則表達式,在Windows上沒有編譯錯誤。 你可以找到它

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

希望它能幫到你。

這相當於“我如何構建需要鏈接到庫的包?”的標准問題。

首先,您應該使用R CMD COMPILE ...而不是手動g++調用。 然后,您可以使用R提供的所有選項來聲明要鏈接到的庫 - 值得注意的PKG_LIBS

一旦您使用包,所有這一切都變得更容易。 SO上的數十個答案強烈建議將包作為更復雜的R和C ++文件集合的適當結構。

從寫作R擴展手冊和我的Rcpp書開始,在幾個地方討論了這個主題。 CRAN上的許多Rcpp軟件包都可以實現。 對於Windows和CRAN自動構建器,您還有一個問題,即確保它們具有您需要的庫。

編輯:即使在您的編輯之后,您的示例也不完整或最小,但如果您想看到使用Rcpp的Boost正則表達式的簡單使用, Rcpp Gallery也有一個插圖說明它 如果你想要自成一體,那么@KQiang的建議很好:嵌入源代碼。 您將不得不傾斜如何使用子目錄構建包,因此您將一個難度換成另一個。 但是這兩種方法都有例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM