錯誤本質
Linker 階段找不到函數/變量的定義(實作),僅有宣告。常見於:
- 函數僅在 .h 中宣告,未在 .cpp 中定義。
- 靜態成員變量未在 .cpp 中定義初始化。
- 模板函數定義未放在頭文件(或未显式實例化)。
- 第三方庫 .lib 未加入連結器輸入,或路徑錯誤。
- 調用約定不匹配(
__cdecl vs __stdcall)。
- 專案屬性中 Configuration Properties → Linker → Input → Additional Dependencies 缺少依賴庫。
系統化排查步驟
- 雙擊錯誤訊息,查看具體缺少的符號名稱(如
ClassName::FunctionName)。
- 全域搜尋 該符號:是否有定義?是否在正確的 .cpp 中?是否被
#ifdef 排除?
- 檢查第三方庫:
- 確認 .h 對應的 .lib/.dll 版本一致。
- 64 位元專案必須連結 64 位元庫。
- 在專案屬性 → Linker → General → Additional Library Directories 加入庫目錄;
Linker → Input → Additional Dependencies 加入具體 .lib 檔名。
- 模板/內聯函數:將定義移至頭文件,或在 .cpp 尾部显式實例化
template class MyClass<int>;。
- 靜態成員:在 .cpp 中
int MyClass::staticMember = 0; 定義一次。
- 清理重建:Build → Clean 後 Rebuild,排除殘留 .obj 干擾。
常見場景速查表
| 錯誤符號特徵 | 可能原因 | 解決 |
__imp__FunctionName | 缺少 DLL 導入庫 | 加入 .lib,確保 DLL 在運行路徑 |
ClassName::staticVar | 靜態成員未定義 | 在 .cpp 定義 |
ClassName::templateFunc<T> | 模板定義不在頭文件 | 移至 .h 或显式實例化 |
main 缺失 | 入口點錯誤或子系統設定 | 專案屬性 → Linker → System → SubSystem: Console (/SUBSYSTEM:CONSOLE) |
工具輔助
dumpbin /exports xxx.lib 查看庫導出符號。
nm (MinGW) 或 objdump 分析 .obj/.a 符號表。
- Visual Studio 依賴關係圖 檢查專案引用順序。
遵循上述流程,90% 以上連結錯誤可在 10 分鐘內定位解決。