首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过"DllMain已定义“错误

无法通过"DllMain已定义“错误
EN

Stack Overflow用户
提问于 2012-02-07 21:29:03
回答 4查看 20.6K关注 0票数 8

我正在尝试编写一个.dll库,以实现.dll注入的目的。由于这个事实,它必须有一个名为DllMain的例程,因为它将用作入口点。我认为我的问题可能是因为我在我编写的静态库中链接,它使用了来自afxmt.h的线程和互斥对象。因为在某种程度上,包含这一点会导致链接器从mfcs100ud.lib链接,这显然包含了它自己版本的DllMain。

这是给我带来麻烦的文件:

dllmain.cpp

代码语言:javascript
复制
#include "stdafx.h"
#include <stdio.h>
#include "NamedPipeLogger.h"

static CNamedPipeLogger m_PipeLogger("Log.txt");

BOOL APIENTRY DllMain(HANDLE hModule, 
                      DWORD  ul_reason_for_call, 
                      LPVOID lpReserved)
{
}

下面是dllmain.cpp包含的stdafx.h文件。

stdafx.h

代码语言:javascript
复制
#pragma once

#define _AFXDLL
#include <Afx.h>

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers

以下是我的错误信息:

错误32错误LNK2005:已在dllmain.obj LNK2005中定义的_DllMain@12

因为我不能将我的Dll入口点的名称更改为DllMain以外的其他内容,所以我在这里被搞砸了吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-09 19:53:47

嗯,我想我在这件上认输了。我至少能解决我所有的问题。我只需要停止使用一些微软类。

我在问题描述中谈到了这一点,但我记得当我开始包括:

代码语言:javascript
复制
#include <afxmt.h>
#include <afxwin.h>

所以我仔细研究了一下,找出了我到底在使用什么--这些都包括。我使用的是AfxBeginThread()方法,以及类CMutexCCriticalSection.所以我想,如果我能摆脱任何私有窗口的东西,也许我的问题就会消失。这意味着删除所有包含的内容,然后用更标准的c++代码解决编译错误。以下是我所做的:

  • 我使用的不是AfxBeginThread(),而是CreateThread()。
  • 我没有使用CMutex和CCriticalSection,而是使用了CRITICAL_SECTION结构及其附带的例程。

在此之后,我能够编译.dll,它运行得很好。

票数 2
EN

Stack Overflow用户

发布于 2015-11-10 04:35:05

在许多情况下,这是由于在预处理程序设置中设置了_USRDLL (应该是_LIB )造成的。这与'MFC扩展dlls‘有关,我不认为现在还会有人做这个,但是VS向导似乎认为当您在向导中签下'Use’时,您确实想要使用它。

票数 11
EN

Stack Overflow用户

发布于 2015-04-23 05:38:10

最近,我遇到了同样的或类似的问题,并找到了解决办法。

背景

我在Visual 2013 Pro中有一个MFC项目,它生成一个DLL。我在这个项目中有几个.c模块,我可以通过有条件地指定'extern“C‘结构禁用预编译标头来实现这些C文件,并且--在我的例子中--禁用继承的强制包括,这是从项目默认值中提取stdafx.h的。

问题

有一天,在几个C文件上成功地使用了这个方法之后,当我尝试再添加一个时,我会得到以下错误。

代码语言:javascript
复制
1>Link:
1>  All outputs are up-to-date.
1>mfcs120d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)
1>     Creating library C:\path\to\project\build_dir\myproj.lib and object C:\path\to\project\build_dir\myproj.exp
1>C:\path\to\project\build_dir\myproj.dll : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.

解决方案

我通过实现微软知识库文章Q148652中的“解决方案一”来解决这个问题,“当LNK2005库和MFC库在C++中按错误的顺序链接时,就会发生LNK2005错误”。这迫使链接器以正确的顺序链接库。

步骤:

  1. 右键单击该项目,选择“属性”。
  2. 确保您正在对所有配置和所有平台进行更改。
  3. 在左侧窗格中,浏览到链接器→输入。
  4. 在右侧窗格中,拉下其他依赖项,选择。
  5. 添加mfcs120d.lib。

基于CodeProject文章MFC项目中已在msvcrtd.lib(dllmain.obj)中定义的DllMain@12“,我想有一天我可能需要在这个列表中添加另一个库,但是现在这对我来说很有用。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9184253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档