2011-04-16 107 views
4

我在鏈接可執行文件中缺少靜態庫符號時遇到問題。 這裏是我的問題描述:鏈接可執行文件中缺少靜態庫中的符號

我有從幾個目標文件建立的靜態庫。這些目標文件提供了與下列關聯的sevaral組符號:

  1. 一組C函數和結構(幾個對象文件)。我們來調用相應的符號level1符號。
  2. 用於此C函數和結構(另一個對象文件)的一組C++包裝類。讓我們調用相應的符號level2符號。
  3. 一組C++包裝類,其中包含具有擴展功能的2級類(另一個對象文件)。我們來調用相應的符號level3符號。

Undeground C代碼使用其他幾個項目和外部庫。其中一些是靜態的,所以目前這個庫也是靜態的。

庫與可執行文件鏈接。該文件僅使用來自lib的level2符號。但是這個可執行程序在執行期間加載的一些動態庫需要level3符號。

問題是,level3符號由於某種原因被遺漏到這個可執行文件(nm批准)中。

庫本身包含所有符號組。此外,還有另一個與此庫鏈接的可執行文件,它也包含所有符號組。這些可執行文件之間的主要區別在於第二個可執行文件(其中提供了所有符號)直接使用符號。

整個項目是用CMake在調試配置中構建的(這意味着「-g」選項在g ++命令中提供)。底層操作系統是GNU/Linux x86_64。 g ++版本是4.4。

我檢查了幾個StackOverflow類似的問題,但我還沒有找到任何可接受的解決方案。

我已經嘗試了幾個鏈接選項來解決問題(--export-dynamic,--whole_archive),但都沒有幫助。

我會很高興看到任何想法來解決這個問題,或者至少,這種奇怪行爲的可能原因。

這是用於構建可執行文件的命令行。命令由CMake生成。我只添加--whole_archive選項,然後刪除可執行文件並重新運行命令。我也希望你能原諒我用「???」替換所有項目特定的名稱。

exec_name - 可執行文件的名稱,我們都在談論
lib_name - 庫的名稱,我們都在談論

在/ usr/bin中/ C++ - 符號鏈接到g ++ V4.4可執行

在/ usr/bin中/ C++ -Wextra -g -fPIC CMakeFiles/exec_dir.dir/main.cpp.o CMakeFiles/exec_dir.dir/options.cpp.o CMakeFiles/exec_dir。dir/runtime.cpp.o CMakeFiles/exec_dir.dir/plugins.cpp.o CMakeFiles/exec_dir.dir/CServer.cpp.o -o exec_name -rdynamic ../lib/???/lib???.a - -whole-archive ../../lib/???/???/lib_name.a ../lib/???/lib???so./../lib/???/ ???/lib ???。a ../../???/???/lib???a../../lib/??/lib??a -ldl -lboost_filesystem -lboost_signals -lboost_system -lboost_thread ../../lib/???/lib???.so /usr/local/ssl/lib64/libcrypto.so -ldl -luuid -lodbc ../lib/log /lib???.so ../lib/config/lib???a -lpthread ../../???/???/lib???.a -Wl,-rpath,/ home/beduin/???/build/deb/???/lib/???:/ home/beduin/???/build/deb/lib/???:/ usr/local/ssl/lib64

+0

- 整個檔案和-rdynamic *是*的方式來解決這個問題 - 你可以顯示commandl生成可執行文件的ine? – Erik 2011-04-16 11:30:58

+0

我已經添加了comamndline的問題。 – beduin 2011-04-16 13:13:56

+0

試試'-rdynamic -Wl,-whole-archive <你的所有庫> -Wl,-no-whole-archive ' - 看起來像你的一個庫不在--whole-檔案 – Erik 2011-04-16 13:18:58

回答

4

使用-rdynamic -Wl,-whole-archive <all your libs> -Wl,-no-whole-archive <boost, pthread and so on> - 你的一個庫不在--whole-archive

+2

一個建議:解釋爲什麼'-whole-archive'有幫助。與類似Stackexchange的網站相比,提供可用資源的不僅僅是發佈問題的人。一般而言,我沒有看到許多對所有人都有幫助的單行答案,只是發佈原始問題的個人。 – 2012-04-20 19:41:16

+0

是否 - 全部歸檔轉儲甚至標記爲隱藏的符號?我的可執行文件大小增加了很多。 – Halsafar 2012-07-23 18:53:45