现在的位置: 首页 > 综合 > 正文

从 LNK2005 看 stdafx.h

2012年01月24日 ⁄ 综合 ⁄ 共 674字 ⁄ 字号 评论关闭

编译错误:
nafxcwd.lib(afxmem.obj) : error LNK2005:
"void __cdecl operator delete(void *)"(??3@YAXPAX@Z) already defined
in LIBCMTD.lib(dbgnew.obj)

问题说明:
http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652

msdn 有关于 LNK2005 的详细说明。 但是一般的症结在于同时使用了 CRT 和 MFC 的运行库, 并且 CRT 在先于 MFC 运行库之前被链接。

问题出现:
取消了预编译头文件, 并且使用了 CRT 有可能导致这个问题. 比如, 在自定义头文件 common.h 申明了程序所使用的全局函数, 并且用到了 CRT 库函数. 这中情况下就不能保证 MFC 运行库先于 CRT 被链接.

处理办法:
1, 如果硬要取消预编译头文件,可以在可能先编译的程序模块中加入 #include “StdAfx.h”.
2, 不要取消预编译头文件. 如果对建立的文件模块比较熟悉的话, 是不会产生什么 “unexpected end of file while looking for precompiled header...”之类的错误的.这种错误主要还是对工程文件的组织不熟悉, 简单的处理办法, 将公共使用的模块头文件放在 “StdAfx.h”中. 尽管这样情况下,改动某些头文件可能使整个工程需要重新编译, 延长编译时间. 但是, 如果正确设计好接口并规整的使用头文件, 预编译这中东西就只会使你的工作效率更高了.

抱歉!评论已关闭.