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以外的其他名称?
在许多情况下,这是由预处理器设置中的_USRDLL引起的,它应该是_LIB.这与'MFC扩展dll'有关,我认为今天任何人都没有这样做,但VS向导似乎假设你在向导中检查'使用MFC'时确实想要使用它.
最近,我遇到了相同或相似的问题,并找到了解决方案。
我在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错误”。这将强制链接器以正确的顺序链接库。
脚步:
基于“代码项目”文章“ 解决错误LNK2005:_DllMain @ 12已经在MFC Projects的msvcrtd.lib(dllmain.obj)中定义”,我认为我可能有一天必须向该列表中添加另一个库,但这对我来说很有用现在。
好吧,我想我在这件事上认输了(某种程度上)。我至少能够解决所有问题。我只得停止使用一些微软的课程。
我在问题描述中提到了这一点,但我记得一开始就开始编译困难,包括:
#include <afxmt.h>
#include <afxwin.h>
Run Code Online (Sandbox Code Playgroud)
所以我仔细检查并弄清楚我到底在使用什么需要这些包含。我使用的是AfxBeginThread()方法以及CMutex和CCriticalSection类。所以我想如果我能摆脱任何专有的 Windows 东西,也许我的问题就会消失。这意味着删除所有包含 、 、 和 的内容,然后使用更标准的 C++ 代码解决编译错误。这是我所做的:
之后我就能够编译 .dll 并且工作正常。
| 归档时间: |
|
| 查看次数: |
15516 次 |
| 最近记录: |