Visual C++ 專案建置時出現 error LNK2001: unresolved external symbol,通常是**子系統設定錯誤**、**入口點不符**、**執行期庫不匹配**三大類原因。本文針對四種最常見錯誤訊息,提供精確對應的專案屬性修正步驟(VS6 / VS2005+ 通用)。
unresolved external symbol _main
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
原因:專案設定為 **Console 子系統**,連結器尋找 main() 入口,但專案實為 Windows GUI 程式(含 WinMain)。
修正:
/subsystem:console 改為 /subsystem:windows。unresolved external symbol _WinMain / _WinMain@16
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain
原因:專案設定為 **Windows 子系統**,連結器尋找 WinMain,但專案實為 Console 程式(含 main)。
修正:
_WinMain
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain
原因:MFC Unicode 專案預設入口點為 wWinMainCRTStartup,若專案屬性未正確設定會找不到入口。
修正:
wWinMainCRTStartup。__beginthreadex / __endthreadex 未解析
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
原因:MFC 使用多執行緒,需連結**多執行緒執行期庫** (MT/MD),但專案設定為單執行緒庫。
修正:
| 建置類型 | 正確選項 |
|---|---|
| Debug 靜態連結 | Multi-threaded Debug (/MTd) |
| Release 靜態連結 | Multi-threaded (/MT) |
| Debug 動態連結 (DLL) | Multi-threaded Debug DLL (/MDd) |
| Release 動態連結 (DLL) | Multi-threaded DLL (/MD) |
⚠️ 專案中**所有**靜態庫、DLL 必須使用**相同**執行期庫選項,否則會有多份 errno、malloc 堆疊導致崩潰。
#include 導致 MFC 符號未引入?依序檢查上述四項,90% 的 LNK2001 可在分鐘內解決。