_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代码处理。

This entry was posted in VC.

发表评论