0

說我有2個靜態庫如何獲得所有符號的衝突,從2個靜態庫在VC8

ex1.a ex2.a

在這兩個庫,我將確定10個相同的功能

當編譯一個示例測試代碼說「test.c」,我鏈接到靜態庫ex1.a和ex2.a

在「test.c」中我只會調用3個函數,然後我會得到 鏈接器錯誤「ex1.a和ex2.a庫中都有相同的符號「 還行吧。這裏

我的問題是: 1.爲什麼這個錯誤只顯示3只充當多個定義。爲什麼不是列出所有10個功能

  1. 在VC8我怎麼能列出所有多重定義的符號,而不actualy調用在測試代​​碼的功能...

感謝,

回答

0

那是因爲,鏈接器會嘗試resovle符號名稱,當它編譯和鏈接具有函數調用中的代碼。只有當代碼有一些函數調用時,鏈接器纔會嘗試在測試代碼或鏈接的庫中解析它,以及何時會找到多個定義。如果沒有函數調用,那麼我想沒問題。

0

您所遇到的是鏈接器的優化部分:默認情況下,它將不包含未引用的代碼。編譯器將創建具有最可能未解決的依賴性的多個對象文件(包含的代碼無法滿足的調用)。因此,鏈接器將傳遞所有的對象文件,並嘗試爲未解決的依賴項找到解決方案。如果失敗,它將檢查可用的庫文件。如果有多個選項具有相同的確切名稱/簽名,它將開始抱怨,因爲它無法決定選擇哪一個(對於相同的代碼,這並不重要,但想象使用不同的「幕後」工作的不同實現在內存上,如調試和發佈的東西)。

我能想到檢測所有這些多重定義的唯一方法(也許是最簡單的方法)是創建另一個靜態庫項目,包括所有靜態庫中使用的源文件。創建庫時,鏈接器將包含所有調用或導出的內容 - 只要鏈接器導出,您就不需要調用鏈接器所需的特定代碼來查看/包含所有內容。

但是我仍然不明白你實際上想要完成什麼。試圖找到兩個庫之間共享的代碼?

相關問題