我在鏈接可執行文件中缺少靜態庫符號時遇到問題。 這裏是我的問題描述:鏈接可執行文件中缺少靜態庫中的符號
我有從幾個目標文件建立的靜態庫。這些目標文件提供了與下列關聯的sevaral組符號:
- 一組C函數和結構(幾個對象文件)。我們來調用相應的符號level1符號。
- 用於此C函數和結構(另一個對象文件)的一組C++包裝類。讓我們調用相應的符號level2符號。
- 一組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
- 整個檔案和-rdynamic *是*的方式來解決這個問題 - 你可以顯示commandl生成可執行文件的ine? – Erik 2011-04-16 11:30:58
我已經添加了comamndline的問題。 – beduin 2011-04-16 13:13:56
試試'-rdynamic -Wl,-whole-archive <你的所有庫> -Wl,-no-whole-archive' - 看起來像你的一個庫不在--whole-檔案 –
Erik
2011-04-16 13:18:58