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中定義的符號。
是的,我看到你在'runTest'的鏈接步驟中都有它們。然而,在你沒有顯示的鏈接步驟中需要'-lboost_thread'或'-lboost_thread-mt' - 'libmylibexample'的鏈接步驟。 – ldav1s
在我的鏈接階段,我添加庫'../ libmylibexample/.libs/libmylibexample.so'和'-lboost_thread-mt' ...我也嘗試過'-lboost_thread' ...除非有辦法在編譯庫本身時添加此鏈接... (必須閱讀。)我將編輯我的文章以包含庫創建。沒有意識到創建共享庫本身時,我將不得不鏈接庫。通常我會將所有庫鏈接到使用所有庫的主應用程序。 – Jameshobbs
好吧,我將boost_thread庫添加到我的共享庫中,一切正常!感謝您的幫助!在創建共享庫方面,我非常新,特別是在提升的時候。再次感謝! – Jameshobbs