深入探究VC —— 鏈接器link.exe(4)【轉(zhuǎn)】http://blog.csdn.net/wangningyu/article/details/4849452在程序編譯完成后,生成的文件是以.obj為擴展名的對象文件,link.exe是將這些對象文件與庫鏈接起來以創(chuàng)建可執(zhí)行文件或動態(tài)鏈接庫文件的工具。
link.exe的輸入文件包括obj文件、lib文件、exp文件、def文件、res文件、txt文件、ilk文件等等,而輸出的文件一般是exe文件、dll文件、sys文件等可執(zhí)行程序文件。
1、命令行參數(shù) link.exe運行參數(shù)如下: LINK [options] files 參數(shù)包括選項和文件名,選項和文件名可按任意順序指定。link會首先處理選項,然后是文件。各參數(shù)間必須使用一個或多個空格或制表符來分隔。
2、輸入文件 參數(shù)中的files是指鏈接器的輸入文件。用戶可以使用文件名指定絕對路徑或相對路徑,可在文件名中使用通配符。如果用戶指定的文件名沒有擴展名,則默認假設(shè)擴展名為obj。link.exe對文件格式的判斷不是根據(jù)文件擴展名,而是判斷文件的內(nèi)容。 比如之前【深入探究VC —— 編譯器cl.exe(1)】代碼中:
Hello.c完成編譯后會生成Hello.obj文件,然后將Hello.obj與系統(tǒng)庫文件鏈接起來,最終生成可執(zhí)行文件。命令行參數(shù)為: link Hello.obj /subsystem:windows
注意,在之前【深入探究VC —— 編譯器cl.exe(1)】代碼中有這樣一行代碼:
如果在輸入文件中指明了user32.lib,那么這一行是沒有必要的。但是如果將參數(shù)里這一段鏈接user32.lib去掉,而代碼文件中又不包括 上面這一行,則編譯器會報錯。
如果編譯器報告錯誤“LNK2019:無法解析的外部符號......”,那么通常是由于沒有將鏈接這些符號所需要的輸入庫文件加入到輸入文件參數(shù)中,比如調(diào)用MessageBox API就必須在鏈接時輸入user32.lib。
3、鏈接器選項 選項前需加“選項說明符”(一個短劃線‘-’或一個正斜杠‘/’),然后是該選項的名稱。如果選項帶參數(shù),參數(shù)在冒號(:)后指定選項的參數(shù)。如果參數(shù)是數(shù)值,可以使用十進制、或C語言表示法。與編譯器cl.exe不同,鏈接器的選項名及其關(guān)鍵字或文件名參數(shù)不區(qū)分大小寫,但用作參數(shù)的標識符區(qū)分大小字書。
選項中很多涉及Windows可執(zhí)行文件的格式問題,比如節(jié)、導入表、導出表、基地址等,以及Windows可執(zhí)行文件中EXE文件、DLL文件的區(qū)別與作用、可執(zhí)行文件的加載以及API函數(shù)動態(tài)鏈接過程。(Windows可執(zhí)行文件編譯與鏈接的內(nèi)部原理,請自行查閱相關(guān)資料吧?。?/p>
4、參考資料
有關(guān)更多信息,請參見編譯器控制的 LINK 選項、 設(shè)置鏈接器選項、有關(guān)生成的常見問題. |
|
|