1. 程式人生 > >VC++ 6.0開發OCX控制元件時遇到LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main問題解決記錄

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這個預處理符號;

 

 

參考來自:https://blog.csdn.net/richie12/article/details/5799097