_DllMain@12 已经在 MSVCRTD.lib(dllmain.obj)

用 VC 编译程序,不时会出现下面错误:

error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义

或许你会郁闷,好好的程序,折腾着,怎么突然就不行了呢?

如果确保没有定义 2 个 DllMain,就可以尝试下面 2 个办法了:

1 确保每一个 cpp 的最前面有:#include “stdafx.h”

2 在 Project->Properties->C/C++->Preprocessor 的 Preprocessor Definitions 中将_USEDLL 删掉

出现这个问题的大致原因,除了粗心写了 2 个以上的 DllMain 外,还有一个原因就是 VC 聪明过度了。

VC 会检查 cpp 和 c 代码,链接时,如果遇到 c,就会自作聪明地自动链接 c 的库,这时如果混搭了 c 和 cpp 的时候,VC 可能同时会链接 c 和 cpp 的库,导致出现了 2 个 DllMain,自然就报错了。

基本来说,VC 是优先链接 cpp 的库的,但如果不幸,它编译的第一个文件是 c 文件的话,那么就会首先链接 c 库,所以解决错误的办法还有 1 个:不要让 c 文件是第一个文件,即保证第一个编译的文件是 cpp 文件。这个可看看解决方案里面文件的顺序,如果第一个是 c 文件,可以尝试把它移出工程,然后再加入,这样让它排到列表的后面。如果实在搞不好列表顺序,就把工程先关闭,用记事本打开工程文件,手动把 c 文件放到后面吧。

当然,VC 的聪明在于,不定什么时候它会自动给项目的文件重新顺序,如按照文件名重新排序,所以再来一个绝招:加一个空文件,命名为 1.cpp,里面包含一行 stdafx.h 即可。

最后的啰嗦:加上 stdafx.h 的文件,VC 都会作为 cpp 代码处理。

正文完
 
评论(没有评论)
验证码