如何解决这个错误?Hits error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义

guokema 2007-12-07 05:12:07
我自己建立了一个DLL,刚开始编译通过的,后来加入部分代码后就会出现

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

这种错误,请教各位到底怎么解决?

我原来在在属性里面的设置中:MFC的使用情况用的是 使用标准 Windows 库 后来有人告诉我要用 在共享 DLL 中使用 MFC ,可是我改了后还是有错。

还有人告诉我应该在 link 的edit设定中nodefaultlib:"msvcrtd.lib",但是我这样做了又有很多其他错误。
...全文
5997 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen277910405 2012-10-23
  • 打赏
  • 举报
回复
#include "StdAfx.h"
在一个dll。cpp文件加了这个头文件就连接通过了。
商博良 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]

在Project->Properties->C/C++->Preprocessor的Preprocessor Definitions中将_USEDLL删掉即可。
[/Quote]

这个的确好用。
clever101 2012-09-12
  • 打赏
  • 举报
回复
楼主使用了AFX_MANAGE_STATE(AfxGetStaticModuleState());这种资源切换的语句吧,使用了这个是会出现这个错误的。
mhsjfly 2012-07-12
  • 打赏
  • 举报
回复
在Project->Properties->C/C++->Preprocessor的Preprocessor Definitions中将_USEDLL删掉即可。
andylinn 2012-05-23
  • 打赏
  • 举报
回复
今天遇到了同样的问题,搜索搜到了这里,后来解决了。。。。。。。。
创建解决方案时,用的是WIN32 DLL,添加了MFC ATL的支持,自动生成文件中是没有现成的DllMain函数的。后来需要用到这个入口函数,所以自己人工添加了DllMain函数,调试结果就报错,退重复定义DllMain之类的。。。

从其它地方找到了解决办法,这里给大家分享下:

给项目添加一个dllmian.cpp,里边的内容为
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"

// global data

// The following symbol used to force inclusion of this module for _USRDLL
#ifdef _X86_
extern "C" { int _afxForceUSRDLL; }
#else
extern "C" { int __afxForceUSRDLL; }
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

这样问题就 解决了。。最重要的就是
#ifdef _X86_
extern "C" { int _afxForceUSRDLL; }
#else
extern "C" { int __afxForceUSRDLL; }
#endif
这段代码起到了强制执行你自定义的dllmain函数的作用。。
qdwang2010 2011-11-23
  • 打赏
  • 举报
回复
楼主四年前 的那天倪是怎么解决这个问题的,回忆一下吧
。。。。。。。。。。。。。。。
这帖 可评为年度 大帖
dreamgis 2011-10-28
  • 打赏
  • 举报
回复
cjV5
lyglary 2011-03-30
  • 打赏
  • 举报
回复
fdsfdsfdsfsdf
hehaho112 2010-12-01
  • 打赏
  • 举报
回复
我也出现了这个问题,比较搞笑的一个错误。

我通过VS向导建立了一个空的DLL,又通过向导添加了两个头文件a.h、b.h和两个源文件a.cpp、b.cpp,这四个文件都是空的。

先在a.h和a.cpp中写了代码,编译链接成功了。

突然发现把代码写错地方了,应该写入到b.h和b.cpp中的,于是,我把所有的代码重新剪切到b.h和b.cpp中,重新编译链接,出现了这个错误。把工程里面之前所有编译过的全部删除了,还是这个错误。
hehaho112 2010-12-01
  • 打赏
  • 举报
回复
我这个dll链接了一个自己写的lib,lib的编译链接选项:没有用到MFC,多线程DLL

DLL用到的了MFC
clever101 2010-10-30
  • 打赏
  • 举报
回复
你看看是哪个工程的obj出现这个错误,如果是静态库的话,可以直接把该工程的DllMain函数注释掉即可。
dahuamaja 2010-08-29
  • 打赏
  • 举报
回复
这帖子跨度还挺大,顶楼上的方法
gischenjun04 2010-06-29
  • 打赏
  • 举报
回复 1
_DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义
VC2005解决办法:
1)Debug版本:
项目-属性-链接器-输入:忽略特定库中输入mfc80d.lib;mfcs80d.lib
项目-属性-链接器-附加依赖项:mfc80d.lib;mfcs80d.lib
就可以保证mfc80d和mfcs80d先于MSVCRTD.lib链接,OK,成功
2)Release版本
与Debug版本不同在于mfc80.lib;mfcs80.lib

祝你好运
batistar 2008-08-02
  • 打赏
  • 举报
回复
可以肯定的是:重复定义,或者重复包含了什么文件,你可以用#ifdef什么的来避免这种情况,认真的检查一下在提示重复的部分是否被重复包含。
up_down 2008-02-19
  • 打赏
  • 举报
回复 1
在每个文件头部加#inlcude "stdafx.h"试试
BEYOND_Q 2008-02-19
  • 打赏
  • 举报
回复
BOOL WINAPI DllMain(
HANDLE hinstDLL,
DWORD dwReason,
LPVOID lpvReserved
);
你应该不是这么写的DllMain吧!
up_down 2008-02-19
  • 打赏
  • 举报
回复
可能是同时用了C运行库与MFC库吧,链接时先链MFC库,就没问题。
rageliu 2008-02-19
  • 打赏
  • 举报
回复
出现这种问题,是不是你本来是建立的非mfc工程,后来添加了mfc的使用?
jixingzhong 2008-02-19
  • 打赏
  • 举报
回复
这个IDE有时候就是存在一些问题。

如果问题依旧,可以尝试这样:
楼主你可以undo到正常状态,
再逐步redo回来,看看在那个步骤出现了问题
jixingzhong 2008-02-19
  • 打赏
  • 举报
回复
build==》clean

然后rebuild all 试试
加载更多回复(9)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧