深入探究VC —— 链接器link.exe(4)【转】http://blog.csdn.net/wangningyu/article/details/4849452...
在程序編譯完成后,生成的文件是以.obj為擴展名的對象文件,link.exe是將這些對象文件與庫鏈接起來以創建可執行文件或動態鏈接庫文件的工具。
?
link.exe的輸入文件包括obj文件、lib文件、exp文件、def文件、res文件、txt文件、ilk文件等等,而輸出的文件一般是exe文件、dll文件、sys文件等可執行程序文件。
?
1、命令行參數
link.exe運行參數如下:
LINK [options] files
參數包括選項和文件名,選項和文件名可按任意順序指定。link會首先處理選項,然后是文件。各參數間必須使用一個或多個空格或制表符來分隔。
?
2、輸入文件
參數中的files是指鏈接器的輸入文件。用戶可以使用文件名指定絕對路徑或相對路徑,可在文件名中使用通配符。如果用戶指定的文件名沒有擴展名,則默認假設擴展名為obj。link.exe對文件格式的判斷不是根據文件擴展名,而是判斷文件的內容。
比如之前【深入探究VC —— 編譯器cl.exe(1)】代碼中:
?
[cpp]?view plaincopyprint??
?
Hello.c完成編譯后會生成Hello.obj文件,然后將Hello.obj與系統庫文件鏈接起來,最終生成可執行文件。命令行參數為:
link Hello.obj /subsystem:windows
?
注意,在之前【深入探究VC —— 編譯器cl.exe(1)】代碼中有這樣一行代碼:
?
[cpp]?view plaincopyprint??
如果在輸入文件中指明了user32.lib,那么這一行是沒有必要的。但是如果將參數里這一段鏈接user32.lib去掉,而代碼文件中又不包括 上面這一行,則編譯器會報錯。
?
如果編譯器報告錯誤“LNK2019:無法解析的外部符號......”,那么通常是由于沒有將鏈接這些符號所需要的輸入庫文件加入到輸入文件參數中,比如調用MessageBox API就必須在鏈接時輸入user32.lib。
?
3、鏈接器選項
選項前需加“選項說明符”(一個短劃線‘-’或一個正斜杠‘/’),然后是該選項的名稱。如果選項帶參數,參數在冒號(:)后指定選項的參數。如果參數是數值,可以使用十進制、或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 | 將鏈接器警告視為錯誤。 |
?
?
4、參考資料
微軟官方MSDN幫助文檔
?
有關更多信息,請參見編譯器控制的 LINK 選項、?設置鏈接器選項、有關生成的常見問題.
轉載于:https://www.cnblogs.com/songtzu/archive/2013/01/12/2857358.html
總結
以上是生活随笔為你收集整理的深入探究VC —— 链接器link.exe(4)【转】http://blog.csdn.net/wangningyu/article/details/4849452...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开机自启动 .
- 下一篇: 【helpdesk】启明星helpdes