背景:.lib 文件本質
靜態庫 = 多個 .obj 目標文件的歸檔包(類比 Linux .a)。鏈接器按需提取其中的 OBJ 解決符號引用。
工具:Microsoft Library Manager (lib.exe)
位置:VC/bin/lib.exe 或 VC/Tools/MSVC/x.x.x/bin/Hostx64/x64/lib.exe
常用選項
| 選項 | 功能 |
/LIST[:file] | 列出庫中所有 OBJ 模塊(可重定向到文件) |
/EXTRACT:member | 提取指定 OBJ 到文件 |
/REMOVE:member | 從庫中刪除 OBJ |
/OUT:file | 指定輸出庫文件名(配合增刪改) |
實戰:分析 LIBC.LIB
D:\Program Files\Microsoft Visual Studio\VC98\Lib> lib /LIST libc.lib > libc.log
輸出 600+ 行,部分節選:
Microsoft (R) Library Manager Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
..\build\intel\st_obj\util.obj
..\build\intel\st_obj\matherr.obj
..\build\intel\st_obj\ldexp.obj
..\build\intel\st_obj\ieeemisc.obj
..\build\intel\st_obj\frexp.obj
..\build\intel\st_obj\fpexcept.obj
..\build\intel\st_obj\bessel.obj
..\build\intel\st_obj\xmmi2_fp_emul.obj
..\build\intel\st_obj\xmmi_fp_emul.obj
..\build\intel\st_obj\sqrt.obj
..\build\intel\st_obj\pow.obj
..\build\intel\st_obj\log10.obj
..\build\intel\st_obj\log.obj
..\build\intel\st_obj\tan.obj
..\build\intel\st_obj\cos.obj
..\build\intel\st_obj\sin.obj
..\build\intel\st_obj\atan.obj
..\build\intel\st_obj\acos.obj
..\build\intel\st_obj\asin.obj
..\build\intel\st_obj\testfdiv.obj
..\build\intel\st_obj\powhlp.obj
..\build\intel\st_obj\modf.obj
..\build\intel\st_obj\ieee87.obj
...
分類觀察
- 浮點模擬/異常:
fpexcept、ieee87、xmmi_fp_emul (SSE)
- 數學函數:
sin/cos/tan、asin/acos/atan、log/exp/pow/sqrt、hypot
- 運行時支持:
matherr、fpinit、cvt、ftol (float→long)
- 時間/日期:
time/ctime/gmtime/localtime/strftime/mktime
- 字符串/多字節:
cmap* (字符映射)、mbscpy/mbslen、str*
- 內存/堆:
malloc/free/heap*(可能在單獨庫中)
進階用法
1. 提取單個 OBJ 研究符號表
lib /EXTRACT:sin.obj libc.lib
dumpbin /SYMBOLS sin.obj
2. 重建精簡庫(僅保留需要的 OBJ)
lib /OUT:my_libc.lib /REMOVE:unwanted1.obj /REMOVE:unwanted2.obj libc.lib
3. 查看符號導出
lib /LIST libc.lib | findstr "sin"
dumpbin /EXPORTS libc.lib
Linux 對比:ar 與 nm
| 操作 | Windows (lib.exe) | Linux (ar/nm) |
| 列出模塊 | lib /LIST foo.lib | ar -t foo.a |
| 提取模塊 | lib /EXTRACT:bar.obj foo.lib | ar -x foo.a bar.o |
| 查看符號 | dumpbin /SYMBOLS bar.obj | nm bar.o |
| 創建庫 | lib /OUT:foo.lib a.obj b.obj | ar rcs foo.a a.o b.o |
總結
lib.exe /LIST 是分析靜態庫組成的**標準方法**。理解庫內部 OBJ 結構,有助於:排查鏈接錯誤(多重定義/未解析符號)、優化鏈接速度(移除無用 OBJ)、安全審計(檢查是否包含調試/測試代碼)、跨平台移植(對應 .a 文件結構)。
- 上一篇文章: C 語言整數除法陷阱:-1/2 為什麼等於 0 而不是 -0.5?
- 下一篇文章: Windows 程式設計入門(二):脫離 IDE,掌握命令列編譯環境
Copyright ©
程式碼之家 All Rights Reserved