2014-12-05 138 views
2

我在QNX 6.5.0中構建了boost 1.57.0。沒有生成錯誤。但是一些庫鏈接到libboost_system.so指定相對路徑。我保存了編譯日誌。下面是boost_thread聯動步:用相對路徑構建的boost庫

"QCC_gpp" -o "bin.v2/libs/thread/build/qcc/release/threading-multi/libboost_thread.so.1.57.0" -shared "bin.v2/libs/thread/build/qcc/release/threading-multi/pthread/thread.o" "bin.v2/libs/thread/build/qcc/release/threading-multi/pthread/once.o" "bin.v2/libs/thread/build/qcc/release/threading-multi/future.o" "bin.v2/libs/system/build/qcc/release/threading-multi/libboost_system.so.1.57.0" -lm 

所以,當我運行ldd libboost_thread.so,它不能找到libboost_system。我認爲libboost_thread應該與-lboost_system選項相關聯。但我不知道該怎麼做。

謝謝。

編輯:我不能建立任何與boost_thread鏈接的程序。因爲,boost_thread在bin.v2/libs/system/build/qcc/release/threading-multi文件夾中搜索boost_system。然而,boost_thread和boost_system都位於庫搜索文件夾中。 (用LD_LIBRARY_PATH定義)

+1

同樣的問題在http討論刪除$(HAVE_SONAME)://計算器。 com/q/23485903/1048959 – 2015-07-07 17:27:47

回答

3

,你會發現libboost_system.so的NEEDED條目包含一個(相對)路徑。根據ELF規範,NEEDED條目應該只包含所需庫的名稱,所以鏈接器或QCC中似乎存在錯誤。

因爲如果這樣,系統將無法在運行時找到該文件,除非當前目錄與鏈接發生時相同。

最簡單的解決方法是靜態鏈接到libboost_thread.a。

另一種變通,我用我自己是創建一個圍繞QCC一個包裝,變換命令行,那樣依賴給定爲-Wl,-L <path> -Wl,-l <name>,而不是<path>/lib<name>.so這也需要改變Boost編譯系統,以便它不不會將版本號附加到庫文件名的末尾。

+0

只是在舊的答案上註釋... [ELF規範](http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf)在這裏沒有違反。該錯誤在Boost.Build中;請參閱下面的答案。 – Lack 2016-10-10 05:10:55

-1

我認爲你應該從臨時區域拿走圖書館。

我平時也有類似的東西:

-L /home/.../boost/stage/lib/ -lboost_system 

當然你升壓目錄


略有關更換/home/.../boost作者:同上面的配置,你需要確保正確的版本的庫位於加載器庫路徑(LD_LIBRARY_PATH,ldconfig)中。

如果你想有一個開發版本,你可以在你建立了這個在系統上的「只運行」,可以烤庫路徑對進入目標二:如果你運行objdump -p libboost_thread.so

-Wl,-rpath -Wl,/home/.../boost/stage/lib/:/usr/lib/x86_64-linux-gnu 
+0

我也在庫文件安裝在/ usr/local/lib後試過ldd。結果是一樣的。 – 2014-12-05 09:04:05

+0

@QQ我看不出你的評論與我的答案有什麼關係。 – sehe 2014-12-05 09:35:17

0

正如Nicklas Angare所寫,問題是NEEDED條目包含構建時的相對路徑,它應該只包含.so文件的名稱。

這是因爲傳給連接器的共享庫沒有SONAME,並是因爲鏈接器未給-h選項。

ld documentation

-h 名稱
-soname = 名稱
當創建ELF共享對象,內部DT_SONAME字段設置爲指定的名稱。當一個可執行文件與一個具有DT_SONAME字段的共享對象鏈接時,那麼當可執行文件運行時,動態鏈接器將嘗試加載由DT_SONAME字段指定的共享對象,而不是使用給予鏈接器的文件名稱。

爲什麼鏈接器不能獲得qcc構建的-h選項?這似乎是一個長期被忽視的升壓的bug(見Boost.org ticketgithub issue

的解決方案,如上面的鏈接提示,是從tools/build/v2/tools/qcc.jam