PRB:連結錯誤 LNK2001:無法解析的外部符號 _main

文章翻譯 文章翻譯
文章編號: 291952 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

徵狀

當您建置下列其中一種類型的專案時
  • Win32 主控台應用程式專案
  • 具有發行組態的 Active Template Library (ATL) DLL/EXE 專案
  • main 做為自訂進入點的專案
您可能會從連結器收到下列錯誤訊息:
LIBCD.lib(crt0.obj) :error LNK2001:unresolved external symbol _main (錯誤 LNK2001:無法解析的外部符號 _main)

發生的原因

Win32 主控台應用程式必須有 main 函式做為進入點。當連結器無法在附加到專案的任何檔案中找到 main 函式時,會傳回這個錯誤訊息。

如果您的專案是 ATL 專案,則 ATL 專案的發行組態會定義 _ATL_MIN_CRT,後者會從 .exe 或 .dll 檔案中排除 CRT (C Runtime) 啟動程式碼。當您定義了 _ATL_MIN_CRT,並使用需要 CRT 啟動程式碼的 CRT 函式時,連結器便會產生這個錯誤訊息。

如果專案不是本文<癥狀>一節列出的其中一個類型,但仍然收到錯誤,則可能是您在連結器設定中選取 main 做為專案進入點符號,但沒有在加入專案的檔案中提供 main 函式。

解決方案

  • 當您錯誤地建立了 Win32 主控台應用程式而非 Win32 應用程式時,有兩種方式可以修正這個問題:
    • [專案] 功能表中選擇 [設定],然後按一下 [C/C++] 索引標籤,將前置處理器定義從 WIN32、_DEBUG、_CONSOLE 和 _MBCS 變更為 WIN32、_DEBUG 和 _WINDOWS。接著,按一下 [連結] 索引標籤,並在 [專案選項] 下,將 /subsystem:console 變更為 /subsystem:windows。- 或 -

    • 建立新的專案,並選取 [Win32 應用程式],而非 [Win32 主控台應用程式]。將檔案加入至該專案。
  • 如果您已經建立 Win32 主控台應用程式,但忘了提供 main 函式,請在加入專案的其中一個原始程式檔內寫入 main 函式。
  • 如果您錯誤地選取 main 做為自訂進入點,請從 [專案] 功能表中選擇 [設定],然後按一下 [連結器] 索引標籤。選取 [輸出] 做為分類,並從 [進入點符號] 文字方塊中移除 main
  • 如果是 ATL 專案,則有兩種方式可以修正這個問題:
    • 從前置處理器定義清單中移除 _ATL_MIN_CRT,以允許包括 CRT 啟動程式碼:從 [建置] 功能表中選擇 [設定]。按住 CTRL 鍵,同時選取所有的發行組態。在 [C/C++] 索引標籤中選擇 [一般] 分類,然後從 [前置處理器定義] 編輯方塊中移除 [_ATL_MIN_CRT]。- 或 -

    • 如果可能,移除需要 CRT 啟動程式碼的 CRT 函式呼叫,並使用其 Win32 等效函式。例如,使用 lstrcmp,而不要使用 strcmp。已知需要 CRT 啟動程式碼的函式包括字串和浮點函式。

狀況說明

這是原本設計的做法。

其他相關資訊

下列是各種專案類型的進入點:
  • main:主控台專案
  • WinMain:Win32 專案
  • DllMain:Win32 DLL 專案 (如果是連結 CRT 程式庫,就不需要指定進入點,因為它會加入預設的 DllMain)
LNK2001 錯誤會指明造成錯誤的符號。這表示連結器在專案和專案使用的程式庫中找不到該符號。請確定專案的原始程式檔中有這個符號。否則,請連結適當的靜態程式庫、匯入程式庫或 .obj 檔案。

AppWizard 產生的 ATL 專案會替發行組態定義這個 _ATL_MIN_CRT。ATL 的用意是在縮減映像大小,以及降低對執行階段 .dll 檔案的依賴。它為原本需要 CRT 啟動程式碼的通用 CRT API 提供了替代的實作方式。_ATL_MIN_CRT 巨集會控制這些 API 的使用。如果您使用 _ATL_MIN_CRT,並不表示您不能使用 CRT 常式。不過,如果您使用需要 CRT 啟動程式碼的常式,就會得到無法解析 _main 的連結器錯誤。提供您自己實作的 _main 也不能解決這個問題。

?考

如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
138400 Troubleshooting LNK2001 or L2029 Unresolved External Errors
125750 PRB:You receive an "unresolved external symbol _WinMain@16" error message when you try to build an MFC application with Unicode support in Visual C++
131204 PRB:You receive an "error LNK2001:unresolved external symbol "_WinMain@16" message when a Console Application project is built as an Application project in Visual C++
166480 INFO:Active Template Library (ATL) Frequently Asked Questions
MSDN Online Library 上初學者適用的 Microsoft Visual C++ 相關文件
http://msdn2.microsoft.com/en-us/library/ms950396.aspx

屬性

文章編號: 291952 - 上次校閱: 2007年3月23日 - 版次: 2.3
這篇文章中的資訊適用於:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
關鍵字:?
kbprb KB291952
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com