2010-05-03 64 views
5

是否有一個內置的linux實用程序,我可以使用它來測試新編譯的外部未定義引用的共享庫?海灣合作委員會似乎足夠聰明,可以檢查我自己的二進制文件中未定義的符號,但是如果符號是對另一個庫的引用,gcc不會在鏈接時檢查。相反,當我嘗試從另一個程序鏈接到我的新庫時,我只會收到消息。在Linux中測試外部未定義的引用

當我編譯一個不同的項目時,在庫中獲取未定義的引用消息似乎有點愚蠢,所以我想知道當我建立庫時我是否可以檢查內部和外部的所有引用,而不是當我鏈接時到它。

典型的錯誤:

make -C UnitTests debug 
make[1]: Entering directory `~/projects/Foo/UnitTests` 
g++ [ tons of objects ] -L../libbar/bin -lbar -o UnitTests 
libbar.so: undefined reference to `DoSomethingFromAnotherLibrary` 
collect2: ld returned 1 exit status 
make[1]: *** [~/projects/Foo/UnitTests] Error 1 

回答

2

通常情況下,將共享對象時未定義的引用是允許的,但你可以做,如果有在目標文件要鏈接創建未定義的符號鏈接器生成錯誤通過向鏈接器提供-z defs(或等同於調用鏈接器的gcc命令中的-Wl,-z,defs)來共享庫。

+0

哈哈,輝煌。現在我可以在編譯庫時告訴誰在調用未定義的函數!鏈接到庫時比通用消息要好得多。乾杯!我有點好奇爲什麼ld現在允許在共享庫中未解析的外部數據庫。 – Charles 2010-05-03 21:29:57

+1

@Charles:可能(如果不尋常)在可執行文件的目標文件中使用符號解析共享對象符號,所以'-z defs'可能並不總是成爲你想成爲的人。在最終鏈接時使用的庫的版本也可能不是在最終鏈接或加載時使用的版本,所以即使'-z defs'在構建過程的早期會產生錯誤,最終鏈接也可能工作。在我創建共享對象的大多數情況下,'-z defs'起作用並且很有用。 – 2010-05-03 21:34:28

相關問題