回答缺口出來的「MetaWINDOW常見問題 - OMF VS COFF目標文件Formats.htm」
由於PC文明向上的黎明到了時間的Microsoft Win32編程工具來了,生產的幾乎所有的PC編譯器的目標文件使用英特爾目標模塊格式(OMF)標準。後來,英特爾推出了386個處理器和32位保護模式,此時他們還將OMF規範擴展到了32位,從而形成了「OMF-386」,成爲大多數PC保護模式環境的標準。大約在同一時間,最初的Windows NT開發團隊也在設計代碼,不僅用於英特爾處理器,還用於支持其他供應商的處理器。微軟NT團隊選擇了被稱爲通用對象文件格式(COFF)從UNIX系統V COFF對象模塊的官方目標代碼格式導出的更便攜的對象模塊格式後來成爲所有微軟的Win32開發工具的事實標準,並獲得在正在格式更接近於移植可執行文件的優勢 - 爲Win32本機可執行文件格式(COFF格式的連接要少得多的工作,以創建比從OMF格式文件COFF文件32位的EXE或DLL)。
正如有OMF-和COFF格式的目標文件(.OBJ的),還有OMF和COFF格式庫文件(.LIB的)。幸運的是,這些庫基本上只是對象文件的一個集合,還有一些頭文件信息可以讓鏈接器確定從庫中使用哪些對象文件。然而,爲了使事情變得困難,OMF和COFF都使用相同的文件擴展名.obj和.lib來引用兩種不同類型的對象和庫文件格式(因爲這樣你就不能只看文件擴展名告訴對象模塊或庫文件是否爲OMF或COFF)。
從不同的編譯器廠商混合對象文件和庫文件的問題是,有些供應商支持COFF,其他供應商使用OMF,和幾個可以同時處理。例如,Borland仍然使用OMF目標文件和庫,而微軟的32位編譯器生成COFF格式文件。在編譯和鏈接Windows應用程序時,Watcom C/C++ v11.0似乎更喜歡COFF,但生成OMF目標文件以與其DOS4GW 32位保護模式DOS擴展程序一起使用。除此之外,默認情況下,Microsoft MASM 6.13會生成OMF文件,但使用/ coff開關可以發出COFF目標文件。
當談到時間不同格式的鏈接文件,不同接頭做不同的事情。例如,Microsoft Visual C/C++鏈接器是爲COFF格式的目標文件和庫而設計的,但如果需要,它會嘗試將OMF目標文件轉換爲COFF文件。這在某些情況下可行,但不幸的是,Microsoft LINK不支持所有OMF記錄類型,因此在許多情況下,鏈接器在給出OMF格式對象文件時可能仍會失敗。另外,雖然Microsoft LINK嘗試對OMF目標文件提供一些支持,但它將拒絕處理任何OMF格式庫。其他連接器,如Borland的TLINK,是爲OMF目標文件設計的,並且同樣拒絕使用COFF格式的對象或庫文件。某些DOS擴展器和嵌入式系統供應商(如Phar Lap)提供了自己的連接器,它們同時支持OMF和COFF,因此可供您選擇。
底線是混合OMF和COFF對象和庫文件類型可能是一團糟(加上來自連接器的神祕錯誤消息不起作用)。除非您的鏈接器專門支持它,否則您應該堅持爲您的編譯器/鏈接器/平臺推薦的對象和庫格式,並避免混合OMF和COFF文件。
請看http://www.iecc.com/linker/linker03.html。 – avakar 2009-06-08 19:48:21
@avakar:爲什麼不把這個鏈接倒入正確的答案? – xtofl 2009-06-08 20:10:00