无法通过"DllMain already defined"错误

Can't get by "DllMain already defined" error

本文关键字:already defined 错误 DllMain      更新时间:2023-10-16

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

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

dllmain.cpp

#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

#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@12已在中定义dllmain.obj D:\xxxxx\xxxxxx\mfcs100ud.lib(dllmodul.obj)

我是不是因为无法将Dll入口点的名称更改为DllMain以外的名称而搞砸了?

在许多情况下,这是由预处理器设置中有_USRDLL引起的,其中它应该是_LIB。这与"MFC扩展dll"有关,我认为现在还没有人制作它,但当您在向导中选中"使用MFC"时,VS向导似乎认为您确实想使用它。

最近,我遇到了相同或类似的问题,并找到了解决方案。

背景

我在Visual Studio 2013 Pro中有一个MFC项目,它生成了一个DLL。我在项目中有几个.c模块,我可以通过有条件地指定'extern"c"'构造,禁用这些c文件的预编译头,以及在我的情况下,禁用继承的强制includes来实现这一点,即从项目默认值中引入stdafx.h。

问题

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

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:pathtoprojectbuild_dirmyproj.lib and object C:pathtoprojectbuild_dirmyproj.exp
1>C:pathtoprojectbuild_dirmyproj.dll : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.

解决方案

我通过实现Microsoft知识库文章Q148652中的"解决方案一"解决了这个问题,该文章"当CRT库和MFC库在Visual C++中以错误的顺序链接时,会发生LNK2005错误"。这将强制链接器按正确的顺序链接库。

步骤:

  1. 右键单击项目,选择"属性"
  2. 确保您正在对所有配置和所有平台进行更改
  3. 在左侧窗格中,浏览到Linker&rar;输入
  4. 在右侧窗格中,下拉"其他依赖项",选择<编辑>
  5. 添加mfcs120d.lib

基于代码项目文章解决错误LNK2005:_DllMain@12已经在MFC项目的msvcrtd.lib(dllmain.obj)中定义了",我想有一天我可能不得不向该列表中添加另一个库,但目前这对我来说很有效

好吧,我想我在这个问题上认输了。我至少能解决所有的问题。我只是不得不停止使用一些Microsoft类。

我在问题描述中谈到了这一点,但我记得我一开始就很难编译,包括:

#include <afxmt.h>
#include <afxwin.h>

所以我仔细检查了一下,弄清楚我到底在用什么,需要这些内容。我使用的是AfxBeginThread()方法,以及类CMutexCCcriticalSection。所以我想,如果我能摆脱任何专有窗口的东西,也许我的问题就会消失。这意味着删除的所有包含,然后用更标准的c++代码解决编译错误。以下是我所做的:

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

在这之后,我能够编译.dll,它工作得很好。

当我将#include afxdllx.h从dllmain.cpp移动到StdAfx.h时,我收到了错误。我的项目在没有这个的情况下工作,还包括