在程序編譯完成後,生成的文件是以.obj爲擴展名的對象文件,link.exe是將這些對象文件與庫連接起來以建立可執行文件或動態連接庫文件的工具。web
link.exe的輸入文件包括obj文件、lib文件、exp文件、def文件、res文件、txt文件、ilk文件等等,而輸出的文件通常是exe文件、dll文件、sys文件等可執行程序文件。數據庫
一、命令行參數windows
link.exe運行參數以下:安全
LINK [options] files服務器
參數包括選項和文件名,選項和文件名可按任意順序指定。link會首先處理選項,而後是文件。各參數間必須使用一個或多個空格或製表符來分隔。函數
二、輸入文件工具
參數中的files是指連接器的輸入文件。用戶可使用文件名指定絕對路徑或相對路徑,可在文件名中使用通配符。若是用戶指定的文件名沒有擴展名,則默認假設擴展名爲obj。link.exe對文件格式的判斷不是根據文件擴展名,而是判斷文件的內容。佈局
好比以前【深刻探究VC —— 編譯器cl.exe(1)】代碼中:性能
// File Name: Hello.c
// Description: First Win32 Application
// by Koma 2009-11-18 22:05
#include <windows.h>
#pragma comment(lib,"user32.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pszCmdLine, int cmdShow)
{
MessageBox(NULL,"Hello World !","Test",MB_OK);
return 0;
}測試
Hello.c完成編譯後會生成Hello.obj文件,而後將Hello.obj與系統庫文件連接起來,最終生成可執行文件。命令行參數爲:
link Hello.obj /subsystem:windows
注意,在以前【深刻探究VC —— 編譯器cl.exe(1)】代碼中有這樣一行代碼:
#pragma comment(lib,"user32.lib")
若是在輸入文件中指明瞭user32.lib,那麼這一行是沒有必要的。可是若是將參數裏這一段連接user32.lib去掉,而代碼文件中又不包括 上面這一行,則
若是編譯器報告錯誤「LNK2019:沒法解析的外部符號......」,那麼一般是因爲沒有將連接這些符號所須要的輸入庫文件加入到輸入文件參數中,好比調用MessageBox API就必須在連接時輸入user32.lib。
三、連接器選項
選項前需加「選項說明符」(一個短劃線‘-’或一個正斜槓‘/’),而後是該選項的名稱。若是選項帶參數,參數在冒號(:)後指定選項的參數。若是參數是數值,可使用十進制、或C語言表示法。與編譯器cl.exe不一樣,連接器的選項名及其關鍵字或文件名參數不區分大小寫,但用做參數的標識符區分大小字書。
選項中不少涉及Windows可執行文件的格式問題,好比節、導入表、導出表、基地址等,以及Windows可執行文件中EXE文件、DLL文件的區別與做用、可執行文件的加載以及API函數動態連接過程。(Windows可執行文件編譯與連接的內部原理,請自行查閱相關資料吧!)
選項
用途
@
指定響應文件
/ALIGN
指定每一節的對齊方式
/ALLOWBIND
指定 DLL 不能綁定
/ALLOWISOLATION
指定清單查找的行爲。
/ASSEMBLYDEBUG
將 DebuggableAttribute 添加到託管映像中。
/ASSEMBLYLINKRESOURCE
建立指向託管資源的連接。
/ASSEMBLYMODULE
指定應將 Microsoft 中間語言 (MSIL) 模塊導入到程序集中
/ASSEMBLYRESOURCE
將託管資源文件嵌入到程序集
/BASE
爲程序設置基址
/CLRIMAGETYPE
設置 CLR 映像的類型(IJW 映像、純映像或安全映像)。
/CLRSUPPORTLASTERROR
保留經過 P/Invoke 機制調用的函數的上一個錯誤代碼。
/CLRTHREADATTRIBUTE
指定要應用於 CLR 程序入口點的線程屬性。
/CLRUNMANAGEDCODECHECK
/CLRUNMANAGEDCODECHECK 指定連接器是否將 SuppressUnmanagedCodeSecurity 屬性應用於連接器生成的、從託管代碼調用到本機 DLL 中的 PInvoke 存根 (stub)。
/DEBUG
建立調試信息
/DEF
將模塊定義 (.def) 文件傳遞到連接器
/DEFAULTLIB
在解析外部引用時搜索指定的庫
/DELAY
控制 DLL 的延遲加載
/DELAYLOAD
致使延遲加載指定的 DLL
/DELAYSIGN
對程序集進行部分簽名。
/DLL
生成 DLL
/DRIVER
建立 Windows NT 核心模式驅動程序
/DYNAMICBASE
使用 Windows Vista 的地址空間佈局隨機化 (ASLR) 功能,指定是否生成可在加載時隨機從新設定基址的可執行文件映像。
/ENTRY
設置起始地址
/errorReport
向 Microsoft 報告內部連接器錯誤。
/EXPORT
導出函數
/FIXED
建立只能在其首選基址加載的程序
/FORCE
強制完成連接,即便符號沒法解析或已定義屢次
/FUNCTIONPADMIN
建立可熱修補的映像。
/HEAP
設置堆的大小(以字節爲單位)
/IDLOUT
指定 .idl 文件和其餘 MIDL 輸出文件的名稱
/IGNOREIDL
防止將屬性信息處理到 .idl 文件中
/IMPLIB
重寫默認的導入庫名
/INCLUDE
強制符號引用
/INCREMENTAL
控制增量連接
/KEYCONTAINER
指定用來爲程序集簽名的密鑰容器。
/KEYFILE
指定用來爲程序集簽名的密鑰或密鑰對。
/LARGEADDRESSAWARE
通知編譯器應用程序支持大於 2 GB 的地址
/LIBPATH
容許用戶重寫環境庫路徑
/LTCG
指定連接時代碼生成
/MACHINE
指定目標平臺
/MANIFEST
建立並行清單文件。
/MANIFESTDEPENDENCY
在清單文件中指定 <dependentAssembly> 節。
/MANIFESTFILE(命名清單文件)
更改清單文件的默認名稱。
/MANIFESTUAC
指定是否將用戶賬戶控制 (UAC) 信息嵌入到程序清單中。
/MAP
建立映射文件
/MAPINFO
包括映射文件中的指定信息
/MERGE
合併節
/MIDL
指定 MIDL 命令行選項
/NOASSEMBLY
取消建立 .NET Framework 程序集
/NODEFAULTLIB
在解析外部引用時忽略全部(或指定的)默認庫
/NOENTRY
建立純資源 DLL
/NOLOGO
取消顯示啓動版權標誌
/NXCOMPAT
將可執行文件標記爲經測試與 Windows 數據執行保護功能兼容。
/OPT
控制 LINK 優化
/ORDER
按預先肯定的順序將 COMDAT 放置到圖像中
/OUT
指定輸出文件名
/PDB
建立程序數據庫 (PDB) 文件
/PDBSTRIPPED
建立沒有私有符號的程序數據庫 (PDB) 文件
/PGD
爲按配置文件優化指定 .pgd 文件。
/PROFILE
生成一個可與「性能工具」探查器結合使用的輸出文件。
/RELEASE
在 .exe 文件頭中設置校驗和
/SAFESEH
指定圖像將包含安全異常處理程序表。
/SECTION
重寫節的屬性
/STACK
設置堆棧的大小(以字節爲單位)
/STUB
將 MS-DOS 存根 (stub) 程序附加到 Win32 程序
/SUBSYSTEM
通知操做系統如何運行 .exe 文件
/SWAPRUN
通知操做系統在運行連接器輸出以前將其複製到一個交換文件
/TLBID
容許指定連接器生成的類型庫的資源 ID
/TLBOUT
指定 .tlb 文件和其餘 MIDL 輸出文件的名稱
/TSAWARE
建立專爲在終端服務器下運行而設計的應用程序
/VERBOSE
打印連接器進度消息
/VERSION
分配版本號
/WX
將連接器警告視爲錯誤。
四、參考資料
微軟官方MSDN幫助文檔
有關更多信息,請參見編譯器控制的 LINK 選項、 設置連接器選項、有關生成的常見問題.
本文來自CSDN博客,轉載請標明出處:http://www.cnblogs.com/lidabo/admin/file:///C:/Documents%20and%20Settings/Administrator/桌面/MFC-20100806文章/MFC-20100806文章/深刻探究VC%20——%20連接器link_exe(4)%20-%20zxzqwq2009的專欄%20-%20CSDN博客.htm