簡體   English   中英

對 static 庫中符號的未定義引用

[英]Undefined reference to symbol on a static library

我正在嘗試編譯一個二進制文件,將其與 static 庫 libfoo.a 鏈接:

gcc -L. -o myapp myapp.o -lfoo

但是我從 linker 收到以下錯誤:

libfoo.c:101: undefined reference to `_TRACE'

問題是我沒有 libfoo.a 庫的源代碼。 我試圖在庫中獲取_TRACE符號的引用,我得到了這個:

nm libfoo.a | grep TRACE
    U _TRACE

假設_TRACE不會影響libfoo.a的內部工作,是否可以讓 linker 為這個符號定義一些占位符值,以便我可以編譯我的代碼?

假定_TRACE不會影響libfoo.a的內部工作原理

這似乎是一個毫無希望的假設。

是否有可能使鏈接器為此符號定義一些占位符值,以便我可以編譯代碼?

要做的第一件事是檢查libfoo的文檔。 靜態庫依賴於用戶期望定義的符號是很不尋常的。 實際上,這樣的布置不能與傳統的連接器完美地配合。 我看到一些合理的解釋:

  1. 您需要在libfoo之后鏈接其他(特定的)庫,以提供該符號的定義。

  2. 預期使用libfoo代碼將#include一個關聯的標頭,並且該標頭提供_TRACE的臨時定義。

  3. 使用libfoo程序必須使用特定的工具鏈以及特定的選項來構建。

  4. 壞了

僅在情況(4)中嘗試為該符號手動提供定義是合適的,在這種情況下,最好的選擇是像情況(1)一樣或多或少地通過構建提供定義的對象來進行並將其鏈接到庫之后。 當然,這讓您嘗試猜測應該是什么定義。

如果_TRACE是全局變量,則將其定義為初始值為0的intmax_t可能會起作用,即使庫期望使用不同大小的整數或具有不同符號的整數也是如此。 但是,如果它應該是一個函數,那么您很可能敬酒。 它可能擁有太多的簽名,對行為的太多期望。 沒有理由認為您可以提供合適的占位符。

我懷疑_TRACE函數是一種調試函數。 我認為它不會影響libfoo.a的內部工作原理是正確的。

我解決了將_TRACE函數定義為的問題:

int _TRACE(char*, ...) { return 0; }

當然,該解決方案只是臨時的,不能在生產中使用,但是它符合我編譯代碼的目的。

如果您使用的是 GCC 5.1 或更高版本和/或 C++11,則ABI 發生了變化

您可以使用nm -C發現此問題:如果符號已定義(不是U )但附加了[abi:cxx11] ,那么它是使用新 ABI 編譯的。 從鏈接:

如果你得到 linker 錯誤關於涉及 std::__cxx11 命名空間或標記 [abi:cxx11] 中的類型的符號的未定義引用,那么它可能表明你正在嘗試將 object 文件鏈接在一起,這些文件是使用不同的 _GLIBCXX_USE_CXX11_ABI 值編譯的宏。

如果您有權訪問源代碼(不是您的具體情況),則可以使用-Wabi-tag -D_GLIBCXX_USE_CXX11_ABI=0 ,后者會強制編譯器使用新的 ABI。 您的所有代碼(包括庫)都應該保持一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM