如果我有兩個定義符號(函數)「foobar」的目標文件。使用通用符號鏈接兩個目標文件
是否有可能告訴鏈接器服從我在命令行調用中給出的obj文件順序,並始終從第一個文件中取出符號,而不是從後面的文件中取出符號? 「弱」雜注只適用於共享庫,但不適用於目標文件。
請回答你知道的所有C/C++編譯器/鏈接器/操作系統組合,因爲我是flexibel並使用大量編譯(sun studio,intel,msvc,gcc,acc)。
如果我有兩個定義符號(函數)「foobar」的目標文件。使用通用符號鏈接兩個目標文件
是否有可能告訴鏈接器服從我在命令行調用中給出的obj文件順序,並始終從第一個文件中取出符號,而不是從後面的文件中取出符號? 「弱」雜注只適用於共享庫,但不適用於目標文件。
請回答你知道的所有C/C++編譯器/鏈接器/操作系統組合,因爲我是flexibel並使用大量編譯(sun studio,intel,msvc,gcc,acc)。
我相信你需要從第二個目標文件創建一個靜態庫,然後鏈接第一個目標文件,然後鏈接庫。如果一個符號被一個目標文件解析,鏈接器將不會搜索它的庫。
或者將兩個目標文件分別放置在單獨的靜態庫中,然後鏈接順序將由它們在命令行中的出現決定。
從目標文件創建靜態庫會因工具鏈而異。在GCC中使用ar實用程序和MSVC lib.exe(或使用靜態庫項目嚮導)。
這裏存在危險,這裏的關鍵字叫做依賴於代碼的編碼。
讓我給你在這裏一個例子:
假設你已經寫了名爲malloc
自定義程序。並且你鏈接到標準庫中,會發生什麼是這樣的,需要使用malloc
(標準函數)的函數將使用你的自定義版本,最終結果是代碼可能會變得不穩定,因爲意想不到的副作用和某些東西會出現'破碎'。
這只是要牢記的一點。
就你而言,你可以'覆蓋'(我用引號強調)其他功能,但你怎麼知道哪個foobar
被使用?這可能會導致在嘗試確定調用哪個foobar
時調試悲傷。
希望這會有所幫助, 最好的問候, 湯姆。
你可以把它作爲一個某文件......那麼編譯器可獲取符號及更高版本不嬰兒牀
會有任何錯誤的報道,同樣的符號在'1.o'定義'2.o'(都在'libsome.a'中),我試圖靜態鏈接到這個庫? –
@dmak_k:我不知道;你爲什麼要做這樣的事情?有兩件事可能發生; 1)鏈接器可以找到兩個定義並報告錯誤; 2)它可以找到第一個找到的符號,在這種情況下,它將取決於目標文件在庫中出現的順序。在大多數情況下,你會希望(1)發生,因爲(2)不明確並且會導致很難發現錯誤。你當然可以試試。 – Clifford