unresolved external symbol _main

来源:互联网 发布:淘宝红人店铺 编辑:程序博客网 时间:2024/05/05 10:13

 

现象:

当你编译一个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,然后编译