您的位置:首页 > 大数据 > 人工智能

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

2008-09-03 09:33 525 查看
现象:一个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这个预处理符号;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐