无法通过"DllMain已定义"错误获取

Ult*_*nks 6 c++ dll compiler-errors compilation linker-errors

我正在尝试为.dll注入写一个.dll库.而且由于这个事实,它必须有一个名为DllMain的例程,因为这将被用作入口点.我认为我的问题可能源于这样一个事实,即我在一个静态库中进行链接,该库使用了afxmt.h中的线程和互斥锁.因为在某个地方,包含这个导致链接器从mfcs100ud.lib链接,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)
{
}
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

这是我的错误消息:

错误32错误LNK2005:_DllMain @ 12已在dllmain.obj中定义D:\ xxxxx\xxxxx\xxxxxx\mfcs100ud.lib(dllmodul.obj)

我只是搞砸了,因为我不能将我的Dll入口点的名称更改为DllMain以外的其他名称?

Roe*_*oel 7

在许多情况下,这是由预处理器设置中的_USRDLL引起的,它应该是_LIB.这与'MFC扩展dll'有关,我认为今天任何人都没有这样做,但VS向导似乎假设你在向导中检查'使用MFC'时确实想要使用它.


cp.*_*ngr 5

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

背景

我在Visual Studio 2013 Pro中有一个MFC项目,该项目会生成DLL。我在项目中有几个.c模块,我可以通过有条件地指定'extern“ C”'结构禁用这些C文件的预编译头,以及-在我的情况下-禁用继承的强制包含来完成。从项目默认值导入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:\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.
Run Code Online (Sandbox Code Playgroud)

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

脚步:

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

基于“代码项目”文章“ 解决错误LNK2005:_DllMain @ 12已经在MFC Projects的msvcrtd.lib(dllmain.obj)中定义”,我认为我可能有一天必须向该列表中添加另一个库,但这对我来说很有用现在。


Ult*_*nks 2

好吧,我想我在这件事上认输了(某种程度上)。我至少能够解决所有问题。我只得停止使用一些微软的课程。

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

#include <afxmt.h>
#include <afxwin.h>
Run Code Online (Sandbox Code Playgroud)

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

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

之后我就能够编译 .dll 并且工作正常。

  • 嗯,它不需要应用程序框架扩展标头 (afx),这在链接期间给我带来了神秘 dll 的麻烦。这就是我的意思。 (3认同)
  • 我嘲笑“CreateThread”和“CRITICAL_SECTION”比您使用的“更标准”的想法。你所做的一切都不是标准的;它从头到尾都是特定于 Windows 的。(这没有什么*错误*,但您应该意识到这一点。) (2认同)

归档时间:

查看次数:

15516 次

最近记录:

8 年,10 月 前