首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows 程式設計入門(八):親手編譯 CRT 原始碼完整流程

     編輯:關於C語言

前置準備

  1. 確認 nmake 可用(參考第 2 篇)。
  2. 從 VC6 安裝媒體複製 3 個檔案至 VC98\CRT\SRC:
    MAKEFILE、MAKEFILE.INC、MAKEFILE.SUB
  3. 編輯 MAKEFILE,刪除 6 處 $(V6TOOLS)include\winver.h 行(僅影響 DLL 編譯)。

六種模型編譯指令與產出

模型指令產出 LIB備註
ST(單執行緒靜態)nmake stlibc.lib libci.lib libcp.lib對應 /ML
MT(多執行緒靜態)nmake mtlibcmt.lib libcimt.lib libcpmt.lib對應 /MT
DLL(多執行緒動態)nmake dll見下表出現 LNK4102 警告屬正常
XST(ST Debug)nmake xstlibcd.lib libcid.lib libcpd.lib含 PDB
XMT(MT Debug)nmake xmtlibcmtd.lib libcimtd.lib libcpmtd.lib含 PDB
XDLL(DLL Debug)nmake xdll見下表含 PDB、MAP、RES

DLL 模型詳細產出

LIBDLLMAPRES對應發布庫
_sample_.lib_sample_.dll_sample_.map_sample_.resMSVCRT.LIB
sample_i.libsample_i.dllsample_i.mapsample_i.resMSVCIRT.LIB
sample_p.libsample_p.dllsample_p.mapsample_p.resMSVCPRT.LIB

XDLL 模型詳細產出

LIBDLLMAPRESPDB對應發布庫
_sampld_.lib_sampld_.dll_sampld_.map_sampld_.res_sampld_.pdbMSVCRTD.LIB
sampld_i.libsampled_i.dllsampled_i.mapsampled_i.ressampld_i.pdbMSVCIRTD.LIB
sampld_p.libsampled_p.dllsampled_p.mapsampled_p.ressampld_p.pdbMSVCPRTD.LIB

編譯產出結構

  • 所有中間 .obj 位於 build\<model>_obj 目錄。
  • 最終庫檔輸出於 build 根目錄。
  • 編譯過程中出現的 LNK4102(解構函式匯出警告)微軟文件說明屬正常,可忽略。

實戰價值

親手編譯 CRT 能深入理解:

  • 不同執行緒/連結/除錯模式的程式碼差異(巨集控制)。
  • 靜態庫與動態庫匯出符號的對應關係。
  • 除錯資訊(PDB)、對應檔(MAP)、資源檔(RES)的產生時機。
  • Makefile 組織大型 C 專案的實務技巧。

這也是「源碼面前,了無秘密」的最佳實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved