靜態庫是預先編譯好的、可復用的二進制代碼集合。本質上是**目標文件的歸檔包**,在鏈接階段被鏈接器解析並**直接合併進可執行文件**。

關鍵點:鏈接階段將 .obj 與 .lib 合併生成最終 .exe,運行時**無需**庫文件存在。
| 維度 | 靜態庫 | 動態庫 |
|---|---|---|
| 鏈接時機 | 編譯時(靜態鏈接) | 運行時(動態鏈接) |
| 可執行文件體積 | 較大(含庫代碼) | 較小(僅存符號引用) |
| 內存佔用(多進程) | 每進程獨佔一份副本 | 共享單一內存映射 |
| 部署更新 | 庫更新需重新編譯、全量發布 | 僅替換 DLL,增量更新 |
| 符號解析 | 鏈接期完成 | 加載期/運行期完成 |
StaticLibDemo → 確定

Static_Lib.h
#ifndef _STATIC_LIB_H_
#define _STATIC_LIB_H_
int Add(int, int);
#endif
Static_Lib.cpp
#include "stdafx.h"
#include "Static_Lib.h"
int Add(int a, int b) {
return (a + b);
}
Build → Build Solution,輸出目錄(如 Debug/)生成 StaticLibDemo.lib。
Win32 控制台應用程序,名稱 StaticLibClient。
StaticLibDemo

..\StaticLibDemo\Debug\StaticLibDemo.lib
..\StaticLibDemo\DebugStaticLibDemo.lib

#include
#include "..\StaticLibDemo\Static_Lib.h"
using namespace std;
#pragma comment(lib, "..\\StaticLibDemo\\Debug\\StaticLibDemo.lib") // 方式二/三可省略
int main() {
cout << Add(10, 20) << endl; // 輸出 30
return 0;
}
DLL 編譯也會產生 .lib 文件(導入庫),但兩者本質不同:
