上一篇拋出的六個問題,本文將從 hello.c 編譯產生 hello.exe 的過程切入,層層剖析。核心工具是 CL.EXE——微軟官方文件定義它為「控制 Microsoft C/C++ 編譯器與連結器的 32 位元工具」。編譯器產生 COFF 格式 .obj 目標檔,連結器產生 .exe 或 DLL。實際執行 cl hello.c 確實會產生 hello.obj 與 hello.exe,且 /c 選項可僅編譯不連結。
執行 cl /? 可見完整列表,主要分類如下:
/O1(空間)、/O2(速度)、/Od(停用,預設)等/Gd(__cdecl)、/Gr(__fastcall)、/Gz(__stdcall)、/GR(C++ RTTI)、/GX(C++ 例外處理)等/Fa(組語清單)、/Fo(指定 .obj)、/Fe(指定 .exe)、/Fm(對應檔)/D(定義巨集)、/I(加入標頭搜尋路徑)、/E、/EP、/P(輸出前置處理結果)/Za(停用擴充,嚴格 ANSI)、/Ze(啟用擴充,預設)、/Zi(除錯資訊)、/Zl(.obj 中省略預設庫名)/c(僅編譯)、/Wn(警告等級)、/?(說明)__cdecl(/Gd),C++ 執行期型別識別(RTTI)與例外處理(EH)需顯式啟用。/Zl 選項對理解「預設連結庫」機制至關重要,後續文章將深入探討。下一步將針對 hello.c 的六個疑問,結合 CRT(C 執行期庫)、入口點、標準庫連結等主題逐一解答。