連結階段錯誤(LNKxxxx)與編譯錯誤不同,發生在所有 .obj 檔產生後、合併為 .exe/.dll 時。本文詳細解析兩大經典連結錯誤:LNK2001(未解析外部符號)與 LNK2005(符號重複定義)。
error LNK2001: unresolved external symbol _main
直譯:找不到 _main 符號
原因:專案中缺少 main() / WinMain() 進入點
檢查清單:
main 全小寫main,GUI 應用需 WinMainerror LNK2005: _main already defined in xxx.obj
直譯:_main 已在 xxx.obj 中定義
根本原因:**單一專案中存在多個 main 函式**
main()| 概念 | 說明 |
|---|---|
| Workspace (.dsw) | 專案集合,可包含多個 Project |
| Project (.dsp) | 單一應用程式/動態庫,編譯產出一個 .exe/.dll |
| Source Files | 專案下的 .cpp/.h 檔,**只能有一個 main** |
在 File View 中右鍵多餘的 .cpp → Remove From Project(不刪除檔案,只移出專案)。
// 只在特定條件編譯 main
#if defined(TEST_PROGRAM_1)
int main() { ... }
#elif defined(TEST_PROGRAM_2)
int main() { ... }
#endif
| 錯誤代碼 | 含義 | 常見原因 |
|---|---|---|
| LNK2001 | 未解析外部符號 | 函式僅宣告未定義、static 成員未定義、庫檔未連結 |
| LNK2005 | 符號重複定義 | 多檔定義同名全域變數/函式、header 含定義被多處 include |
| LNK1120 | 未解析的外部項目 | LNK2001 導致的最終連結失敗 |
| LNK4098 | 預設程式庫衝突 | Debug/Release 混用、單執行緒/多執行緒 CRT 混用 |