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

 
链接错误"unresolved external symbol _main"

Article last modified on 2002-3-2

------------------------------------------------------------

The information in this article applies to:

  - Microsoft ATL 2.X

------------------------------------------------------------

现象:
当你编译一个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 _main

ATL向导生成的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,然后编译,如下图所示:


你将会得到几个“unresolved external”的错误,如下所示。


        这个列表就是你用到的CRT的函数。

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.

其他:
我的VC IDE是6.0版本和SP5,如果用ATL COM AppWizard创建Service (EXE)工程。在这种情况下,它的RelMinDependency版本的配置中就没有定义_ATL_MIN_CRT符号!这和微软声称的“Service EXE Created with ATL COM AppWizard Doesn't Build in Release Mode”不一样,可能这是一个已经被FIX了的Bug。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/richie12/archive/2010/08/09/5799097.aspx

引用\[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、付费专栏及课程。

余额充值