编译ATL工程的连接错误:__fltused already defined 和 unresolved external symbol _main

来源:互联网 发布:手机搜不到4g网络 编辑:程序博客网 时间:2024/05/01 05:24

现象:一个ATL工程, DEBUG版本已经通过,编译 ReleaseMinSize版本时
出现以下错误:
Linking...
msvcrt.lib(dllsupp.obj) : error LNK2005: __fltused already defined in StdAfx.obj
msvcrt.lib(dllsupp.obj) : warning LNK4006: __fltused already defined in StdAfx.obj; second definition ignored
LIBCMT.LIB(crt0.obj) : error LNK2001: unresolved external symbol _main
Creating library ReleaseMinSize/VideoMod.lib and object
ReleaseMinSize/VideoMod.exp
ReleaseMinSize/VideoMod.exe : fatal error LNK1169: oneor more multiply defined symbols found
Error executing link.exe.

原因与解决方法:
出错原因:
如果你在工程中使用了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-TimeLibrary                           Characteristics                 Option                        Defined
(withoutiostream)   
LIBC.LIB                                        a statically linked library           /ML
                                                      for single-threaded
                                                      programs
                                                    (Single threaded, static link)

LIBCMT.LIB                                    a statically linked library               
                                                        that supports multithreaded      /MT                            _MT
                                                       programs(Multithreaded,
                                                       static link)

MSVCRT.LIB                                 Multithreaded, dynamic                 /MD                         _MT,_DLL
                                                      link (import library for
                                                          MSVCRT.DLL)

解决方法:
Project->Settings:Setting for “Multiple configuration”
C/C++ Tab:General category, Preprocessor definitions去除_ATL_MIN_CRT这个预处理符号;

原创粉丝点击