現象:
當你編譯一個ATL工程的Release版時,你得到了下面這個連結錯誤: LIBCMT.LIB(crt0.obj) : error LNK2001: unresolved external symbol _main而Debug版本的編連卻順利通過。 出錯原因:如果你在工程中使用了CRT函數,而這些函數又需要CRT啟動代碼,就會出現這種連結錯誤。預設情況下,Release配置的Preprocessor definitions中定義了_ATL_MIN_CRT,它將CRT啟動代碼從你的EXE或DLL剔出去了。背景知識:1:ATL支援把一個伺服器編連最佳化成最小尺寸或者依賴性最小。我們可以定義三個前置處理器符號來影響伺服器的最佳化。
_ATL_MIN_CRT 伺服器不連結標準的C/C++運行庫_ATL_DLL 伺服器動態連結工具函數庫atl.dll_ATL_STATIC_REGISTRY 伺服器靜態連結對組件註冊的支援如果定義了前置處理器符號_ATL_MIN_CRT,那麼我們的伺服器不連結C/C++運行庫,並且ATL提供了函數malloc、realloc、new和delete的一個實現。當定義了這個符號時,我們不能調用任何其他的C/C++運行庫的函數。否則,就會受到這樣的待遇:LIBCMT.LIB(crt0.obj) : error LNK2001: unresolved external symbol _mainATL嚮導產生的ATL工程為所有的Release版本的編連定義了_ATL_MIN_CRT,但是沒有為Debug版本定義這個符號。Debug配置沒有定義這三個符號中的任何一個。RelMinSize配置定義了_ATL_MIN_CRT和_ATL_DLL。RelMinDependency配置定義了_ATL_MIN_CRT和_ATL_STATIC_REGISTRY。2:
C Run-Time Library (without iostream) |
Characteristics |
Option |
Defined |
LIBC.LIB |
a statically linked library for single-threaded programs (Single threaded, static link) |
/ML |
|
LIBCMT.LIB |
a statically linked library that supports multithreaded programs (Multithreaded, static link) |
/MT |
_MT |
MSVCRT.LIB |
Multithreaded, dynamic link (import library for MSVCRT.DLL) |
/MD |
_MT, _DLL |
解決方案:下面方法中的任何一個都可以糾正這個錯誤:Ø 去除_ATL_MIN_CRT這個預先處理符號;Ø 開啟stdafx.cpp,注釋掉#include <atlimpl.cpp>這句話,然後編譯,即可;Ø 在工程的配置對話方塊的Link頁面上,"ignore libraries"編輯框中輸入Libcmt.lib,然後編譯