VC++ 6.0開發OCX控制元件時遇到LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main問題解決記錄
當你OCX控制元件的ReleaseMinDependency版時,你得到了下面這個連結錯誤:
LIBCMT.LIB(crt0.obj) : error LNK2001: unresolved external symbol _main
而Debug版本的編連卻順利通過。
出錯原因:
如果你在工程中使用了CRT函式,而這些函式又需要CRT啟動程式碼,就會出現這種連結錯誤。預設情況下,ReleaseMinDepende配置的Preprocessor definitions中定義了_ATL_MIN_CRT,它將CRT啟動程式碼從你的EXE或DLL剔出去了。
背景知識:
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 _main
ATL嚮導生成的ATL工程為所有的Release版本的編連定義了_ATL_MIN_CRT,但是沒有為Debug版本定義這個符號。
Debug配置沒有定義這三個符號中的任何一個。
RelMinSize配置定義了_ATL_MIN_CRT和_ATL_DLL。
RelMinDependency配置定義了_ATL_MIN_CRT和_ATL_STATIC_REGISTRY。
解決方法:
Project -----> Settings-----> C/C++
在Category中選擇General ;
去除_ATL_MIN_CRT這個預處理符號;