我正在尝试编写一个.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.obj LNK2005中定义的_DllMain@12
因为我不能将我的Dll入口点的名称更改为DllMain以外的其他内容,所以我在这里被搞砸了吗?
发布于 2012-02-09 19:53:47
嗯,我想我在这件上认输了。我至少能解决我所有的问题。我只需要停止使用一些微软类。
我在问题描述中谈到了这一点,但我记得当我开始包括:
#include <afxmt.h>
#include <afxwin.h>所以我仔细研究了一下,找出了我到底在使用什么--这些都包括。我使用的是AfxBeginThread()方法,以及类CMutex和CCriticalSection.所以我想,如果我能摆脱任何私有窗口的东西,也许我的问题就会消失。这意味着删除所有包含的内容,然后用更标准的c++代码解决编译错误。以下是我所做的:
在此之后,我能够编译.dll,它运行得很好。
发布于 2015-11-10 04:35:05
在许多情况下,这是由于在预处理程序设置中设置了_USRDLL (应该是_LIB )造成的。这与'MFC扩展dlls‘有关,我不认为现在还会有人做这个,但是VS向导似乎认为当您在向导中签下'Use’时,您确实想要使用它。
发布于 2015-04-23 05:38:10
最近,我遇到了同样的或类似的问题,并找到了解决办法。
背景
我在Visual 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.解决方案
我通过实现微软知识库文章Q148652中的“解决方案一”来解决这个问题,“当LNK2005库和MFC库在C++中按错误的顺序链接时,就会发生LNK2005错误”。这迫使链接器以正确的顺序链接库。
步骤:
基于CodeProject文章MFC项目中已在msvcrtd.lib(dllmain.obj)中定义的DllMain@12“,我想有一天我可能需要在这个列表中添加另一个库,但是现在这对我来说很有用。
https://stackoverflow.com/questions/9184253
复制相似问题