2009-12-02 124 views

回答

68

currently accepted answer有些不完整。

COMDAT部分的目的是允許在多個對象文件中定義「重複」部分。通常,如果在多個目標文件中定義了相同的符號,鏈接器將報告錯誤。這可能會導致某些C++語言功能(如模板)出現問題,可能會在不同的cpp文件中實例化相同的符號。

COMDAT部分用於解決此問題。當某個節在對象文件中被標記爲COMDAT時,它還指定一個標誌來指示應如何解決衝突。有很多選擇,包括「只挑選你喜歡的任何人」,「確保所有的仲裁人都是相同的大小」,「確保所有的仲裁者,擁有相同的內容」,「挑選最大的人」等。 COFF規範的完整列表。

在任何情況下,與currently accepted answer表示的不同,對於COMDAT部分的內容必須是什麼樣的方式,沒有任何要求。它們可以包含一個程序,許多程序,數據或代碼和數據的任意組合。

5

/Gy選項很適合在發佈版本中使用。 '因爲每個函數都有它自己的部分,鏈接器可以刪除每一個未使用的代碼。 如果你沒有指定/ Gy選項,你會得到如下結果: 「a.cpp」定義了3個函數,編譯時編譯器將它們放在一個代碼段中。 「main.cpp」只使用「a.cpp」中的一個函數,但鏈接「a.cpp」中的所有函數時將會鏈接(其中兩個作爲負擔)。如果每個函數都有它自己的部分,鏈接器只能選取一個包含「main.cpp」所需功能的函數。 編譯不帶/ Gy選項對調試版本非常有用。 編譯類時,默認情況下,它的所有方法都會自行獲取單獨的部分。

+3

這是舊的,但對於任何人的信息:這不是連接器的工作原理。有一個完全不同的開關來控制未引用的功能:/ OPT:REF(Optimization-> References:Yes)。它下面還有一個合併相同功能/ OPT:ICF的權利。 ICF僅適用於/ Gy,但REF可以使用或不使用它。 – SilverbackNet 2015-05-04 21:37:10