簡體   English   中英

多個已定義符號的C / C ++鏈接器順序

[英]C/C++ linker order for multiple defined symbols

如果我在目標文件和庫中定義了相同的符號,GNU鏈接器將從目標文件中獲取符號。 考慮這個例子:

g++ -L"dir/to/lib" -o Executable Test.o foo.o -lMyLib

如果我在foo.cpp中定義了一個具有相同簽名的函數foo ,並且在源文件中編譯了“MyLib”,那么如果我使用這個順序,GNU鏈接器總是更喜歡前一個。

這種行為GNU工具鏈是否具體? 您是否知道其他連接器的行為方式相同? 這是否記錄在案(GNU文檔,C ++標准)? 我找不到任何東西......

我想在進行單元測試(也就是鏈接接縫)時使用此功能來替換/模擬某些功能。

來自http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

“鏈接器按照指定的順序搜索和處理庫和目標文件”

也許。

鏈接器處理文件的確切方式取決於鏈接器,但在您描述的確切情況下,我認為不會有任何變化。 當您指定的目標文件,它包含到您的最終版本,你會得到它從它定義的任何符號; 如果兩個目標文件定義相同的符號,通常會從鏈接器中獲得錯誤(但由於弱符號或類似Fortran的數據定義處理,因此存在異常)。 庫是對象文件的集合; 庫的標准處理是鏈接器掃描它,並合並任何定義其他未定義外部的對象(並且只包含那些對象)。 如果庫中的目標文件僅定義了相關符號,並且其定義已由顯式指定的目標文件解析,則鏈接器將不會將庫中的目標文件合並到程序中。 但是,如果庫中的目標文件也定義了其他符號,並且其中一個符號解析了未定義的外部符號,則庫中的目標文件將與其定義的所有符號一起合並到程序中。 這可能導致多種定義。

從語言的角度來看,“鏈接順序”是未指定的,不能以可靠的方式使用。

通過平台(工具鏈)的觀點,它必須以某種方式指定,並且 - 通常 - 它考慮所有未在本地解析的所有symbold的對象和對象中解析的所有符號的庫。 這允許開發人員屏蔽/替換庫函數。

現在,gcc(作為msvc)以啟動鏈接器的命令行的相同順序鏈接。 這種行為是否可以“信任”(從某種意義上說,它將在未來的版本中保留)尚不清楚。 (GCC文檔使用現有動詞編寫......)

暫無
暫無

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

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