2014-01-27 93 views
4

我想向我的庫中添加多線程,所以我正在爲我的庫創建線程執行程序。爲此,我使用boost線程。當訪問boost綁定時,共享庫中的C++符號查找錯誤

這是運行鏈接到庫中的測試用例時,我得到的錯誤:

symbol lookup error: libmylibexample.so.0: undefined symbol: _ZTVN5boost6detail16thread_data_baseE 

這是代碼行,導致該錯誤我的共享庫:

MyNameSpace::Producer producer = MyNameSpace::Producer(); 
threads.create_thread(boost::bind(&MyNameSpace::Producer::run, &producer)); 

我正在使用autotools和libtool編譯這個庫。代碼編譯得很好。然後我創建一個測試案例,我試圖引用該庫。下面是編制測試用例的編寫順序:

g++ -I. -I../include -g -O2 -MT runTest-runTest.o -MD -MP -MF .deps/runTest-runTest.Tpo -c -o runTest-runTest.o `test -f 'runTest.cc' || echo './'`runTest.cc 

,這是我的鏈接階段:

mv -f .deps/runTest-runTest.Tpo  .deps/runTest-runTest.Po 

/bin/bash ../libtool --tag=CXX --mode=link g++ -g -O2 ../libmylibexample/libmylibexample.la -o runTest runTest-runTest.o -lboost_system -lboost_filesystem -lboost_regex -lboost_thread-mt -lfftw3 -ltiff 

libtool: link: g++ -g -O2 -o .libs/runTest runTest-runTest.o ../libmylibexample/.libs/libmylibexample.so -lboost_system -lboost_filesystem -lboost_regex -lboost_thread-mt -lfftw3 /usr/lib/x86_64-linux-gnu/libtiff.so 

我的一個同事建議初始化與線程一些提振模板,幫助共享庫加載boost_thread庫中的符號。我不完全確定最好的方法來做到這一點,如果這是正確的方式,使事情得到加載。

所以包裝:錯誤似乎涉及不能從我的共享庫中加載libboost_thread中定義的符號。

回答

5

如錯誤所示,您需要鏈接libmylibexamplelibboost_thread

+1

是的,我看到你在'runTest'的鏈接步驟中都有它們。然而,在你沒有顯示的鏈接步驟中需要'-lboost_thread'或'-lboost_thread-mt' - 'libmylibexample'的鏈接步驟。 – ldav1s

+0

在我的鏈接階段,我添加庫'../ libmylibexample/.libs/libmylibexample.so'和'-lboost_thread-mt' ...我也嘗試過'-lboost_thread' ...除非有辦法在編譯庫本身時添加此鏈接... (必須閱讀。)我將編輯我的文章以包含庫創建。沒有意識到創建共享庫本身時,我將不得不鏈接庫。通常我會將所有庫鏈接到使用所有庫的主應用程序。 – Jameshobbs

+0

好吧,我將boost_thread庫添加到我的共享庫中,一切正常!感謝您的幫助!在創建共享庫方面,我非常新,特別是在提升的時候。再次感謝! – Jameshobbs

相關問題