我建立它使用被編譯爲.so文件的多個組件的二進制文件。我遇到了一系列鏈接器錯誤,指向哪個.so文件導致它們,但是我可以獲得有關哪些文件調用未定義函數的信息,或者如果可能的話源代碼位置中調用了未定義的函數?我發現尋找esp函數非常繁瑣,因爲大量的重載和模板正在被使用(這意味着在很多地方都有相同的名字)。在Windows中,它顯示了哪個.o文件導致了未定義的符號,但我堅持在Linux的庫級別。我在linux中使用g ++。任何指針都會有用。獲取文件引起鏈接錯誤的G ++
回答
你問「哪些對象共享庫文件內導致錯誤」。
的問題是,通過共享庫已鏈接的時候,所有的目標文件已被「融合在一起」,而不再共享庫作爲獨立的實體存在於內部,所以你的問題是有點意思的。
這就是說,如果你做一個調試版本(與-g
標誌),連接器將告訴你哪些源文件和行導致了問題,你的話也許能翻譯成目標文件。
如果你不能(例如,因爲這個問題符號在頭文件中引用的),你可以尋求幫助的鏈接:再次重建庫,通過鏈接-y
標誌:
g++ -fPIC -shared ${OBJECTS} -o foo.so -Wl,-y,my_unresolved_symbol
會告訴你哪個對象參考my_unresolved_symbol
。
注:連接器操作「低於」 C++,所以你必須通過重整名稱,例如_Znw
。
感謝您的信息,它非常有用。我還設法調整了構建系統來生成靜態庫而不是動態庫,現在gcc提供了我想要的信息。 – Venkatesan 2011-03-18 08:14:04
隨着ldd
(打印共享庫的依賴),你可以檢查的依賴所以,如果他們解決與否。
通過使用nm -Aa --demangle
,您可以獲取* .so文件中使用或定義的符號列表,只要它們沒有被剝離。使用的符號至少應該保留,以便您可以檢查是否有一些未解決的符號。
謝謝,但我已經從錯誤消息中知道哪個文件導致錯誤。我想知道里面的哪個目標文件使用未定義的函數 – Venkatesan 2011-03-15 06:46:28
- 1. 「__gfortran_pow_c8_i4」錯誤鏈接.o文件從g ++和gfortran使用g ++
- 2. AngelScript G ++鏈接器錯誤
- 3. 鏈接g ++中的文件
- 4. 引起鏈接器錯誤的宏
- 5. 獲取鏈接器錯誤
- 6. 獲取鏈接器錯誤
- 7. Flex和g ++的鏈接器錯誤?
- 8. g ++中的C++鏈接錯誤
- 9. MinGW/G ++/g95鏈接錯誤 - libf95對'MAIN_'的未定義引用
- 10. g ++鏈接錯誤:未定義的引用'主'
- 11. C++鏈接器 - g ++如何獲取ld
- 12. g ++鏈接器錯誤:undefined參考
- 13. Boost.Regex鏈接錯誤LUbuntu 14.04 g ++ 4.8.2
- 14. iostream - 鏈接器錯誤(使用g ++)
- 15. 鏈接文件MSBuild錯誤
- 16. 符號鏈接():無法獲取文件信息(錯誤2)
- 17. 克++鏈接錯誤:獲取未定義的引用錯誤的std ::哈希
- 18. 錯誤鏈接文件,而一切看起來不錯
- 19. 獲取鏈接標記返回錯誤
- 20. 爲HTML鏈接獲取404錯誤
- 21. 通過鏈接獲取錯誤QuartzCore
- 22. 與CMake獲取鏈接錯誤
- 23. 如何鏈接.o文件使用g ++
- 24. g ++沒有正確鏈接頭文件
- 25. g ++無法鏈接捲曲lib文件
- 26. 鏈接錯誤引用
- 27. NSURLRequest間接鏈接獲取文件名
- 28. 在g ++中鏈接庫不起作用
- 29. 鏈接G ++的MinGW
- 30. 獲取文件的唯一sym鏈接
爲什麼不跳過庫的步驟?不是將對象合併到庫中並動態加載它們,而是直接將對象鏈接到二進制文件中。 – Beta 2011-03-15 05:48:16