LIBCMT.LIB(crt0.obj) : error LNK2001: unresolved external symbol _main错误的解决

最近写一个ATL的项目,最终realease的时候出现了这个问题,当时吓了一跳,后来发现了问题,代码没有错误是配置搞错了,因为debug没有任何问题。
出错原因:使用了CRT函数,这些函数需要CRT启动代码,就会出现这种链接错误。因为Release配置的Preprocessor definitions中定义了_ATL_MIN_CRT,它把将CRT启动代码从Dll中删除了。
最简单的办法就是工程设置中删除_ATL_MIN_CRT,但是这样以来就会增加编译后文件的大小。或者工程设置的ignore libraries中输入Libcmt.lib。再次链接时,到几个“unresolved external”的错误,然后你就开始Look for things that you think may be pulling in the startup code and remove them if you can.Instead, use their Win32 equivalents. For example, use lstrcmp() instead of strcmp(). Known functions that require CRT startup code are some of the string and floating point functions.
看了看微软的文档
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++运行库的函数。
ATL向导生成的ATL工程为所有的Release版本的编连定义了_ATL_MIN_CRT,但是没有为Debug版本定义这个符号。
Debug配置没有定义这三个符号中的任何一个。
RelMinSize配置定义了_ATL_MIN_CRT和_ATL_DLL。
RelMinDependency配置定义了_ATL_MIN_CRT和_ATL_STATIC_REGISTRY。
隐约记得,VC的sp6确实解决了这个bug,还是我比较懒,没有给vc打servicepack6。发现  打开stdafx.cpp,注释掉#include <atlimpl.cpp>也是可以的。
msdn描述
INFO:   LNK2001   Error   ATL   Release   Build   
  ID:   Q165076     
    
    
    
  --------------------------------------------------------------------------------   
  The   information   in   this   article   applies   to:   
    
  Microsoft   Active   Template   Library,   versions   2.0,   2.1,   3.0   
    
  --------------------------------------------------------------------------------   
    
    
  SUMMARY   
  Microsoft   Active   Template   Library   COM   AppWizard   generates   a   release   build   of   your   project   using   macro   _ATL_MIN_CRT.   Selecting   this   configuration   causes   the   C   run-time   (CRT)   library   startup   code   to   not   be   linked   into   your   project.   If   you   use   functions   or   code   in   your   project   that   require   the   use   of   the   C   run-time   library   startup   code,   you   may   experience   LNK2001   -   unresolved   external   errors   when   you   try   to   build   the   release   version   of   your   project.     
    
    
    
  MORE   INFORMATION   
  You   can   use   some   C   run-time   functions   without   requiring   the   CRT   startup   code.   Examples   include   the   mem*   functions.   Other   functions   require   the   CRT   startup   code.   CRT   string   comparisons   for   example   require   the   startup   code   as   the   CRT   initializes   some   tables   used   for   comparing.   Global   objects   that   have   constructors   also   require   the   startup   code.   In   Visual   C++   5.0,   statically   linking   the   startup   code   adds   about   25K   to   your   image   (in   Visual   C++   4.2   it   is   about   20K).     
    
  Following   are   some   suggestions   for   finding   the   cause   of   the   LNK2001   errors:     
    
  In   the   linker   options   there   is   an   "ignore   libraries"   edit   box.   Enter   Libcmt.lib   into   it,   and   build.   You   get   several   unresolved   externals.   This   list   is   everything   that   you   are   using   from   the   CRT.   Look   for   things   that   you   think   may   be   pulling   in   the   startup   code   and   remove   them   if   you   can.     
    
    
  Don't   ignore   Libcmt.lib,   but   turn   on   the   verbose   flag   for   the   linker.   From   this,   you   can   see   what   is   triggering   CRT   startup   code   to   get   pulled   in.     
    
    
  If   you   decide   that   you   really   need   the   startup   code,   then   remove   the   _ATL_MIN_CRT   define   from   the   project   settings.   You   can   also   dynamically   link   to   the   CRT,   which   reduces   your   image   size   but   requires   the   CRT's   DLL.   If   you   turn   on   exception   handling   you   have   to   pull   in   the   startup   code.   Even   when   building   minsize   the   default   is   to   statically   link   to   the   CRT   and   use   _ATL_MIN_CRT.  

引用\[1\]: VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。初学者在学习VC++的过程中,遇到的LNK2001错误错误消息主要为:unresolved external symbol "symbol"(不确定的外部"符号")。如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。\[1\] 引用\[2\]: 出现这个错误,应该首先查看"#include"语句是否包含,或者是否包含正确。符号无法解析意味着编译器知道有这个符号存在,也就是有声明,但在链接时,找不到实现代码,那么就去看看报错的这个函数有没有实现代码。如果它们的确已经有了,还是出现这个错误,就把它们重新编译一下。\[2\] 引用\[3\]: 使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对"func"的引用,在目标文件里即对"__imp__func"的引用。如果试图使用静态LIBC.LIBLIBCMT.LIB进行连接,将在__imp__func上发生LNK2001;如果不使用/MD选项编译,在使用MSVCxx.LIB连接时也会发生LNK2001。\[3\] 问题: qt PCL error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public" 回答: 出现LNK2001错误通常是因为连接程序无法找到所引用的函数或变量的实现代码。对于qt PCL error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public"这个错误,可能是由于缺少相应的库文件或者库文件版本不匹配所致。首先,你可以检查是否正确包含了相关的头文件,然后查看是否正确链接了相应的库文件。如果确认这些都没有问题,可以尝试重新编译相关的代码。如果问题仍然存在,可能需要进一步检查编译选项是否正确设置,比如是否使用了正确的编译选项/MD。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [Error LNK2001 无法解析的外部符号 的几种情况及解决办法](https://blog.csdn.net/shenyulv/article/details/6699836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [VC++常见错误原因解析之error LNK2019: 无法解析的外部符号 "public: void __thiscall](https://blog.csdn.net/weixin_42040046/article/details/102723809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值