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

时间:2012-02-07 21:29:04

标签: c++ dll compilation compiler-errors 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)
{
}

这是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 \ xxxxx \ xxxxxx \ mfcs100ud.lib(dllmodul.obj)

我刚刚搞砸了,因为我无法将Dll入口点的名称更改为DllMain以外的其他名称?

4 个答案:

答案 0 :(得分:6)

在许多情况下,这是由预处理器设置中的_USRDLL引起的,它应该是_LIB。这与MFC扩展dll&#39;我不认为今天任何人仍然会做,但VS向导似乎假设你确实想要在检查“使用MFC”时使用它。在向导中。

答案 1 :(得分:4)

Recently, I experienced the same or a similar issue, and found a solution.

Background

I have an MFC project in Visual Studio 2013 Pro, which generates a DLL. I have several .c modules in the project, which I'm able to do by conditionally specifying the 'extern "C"' construct, disabling precompiled headers for those C files, and - in my case - disabling inherited forced includes, which was pulling-in stdafx.h from the project defaults.

Problem

One day, after having used this method successfully on several C files, when I'd try to add just one more, I'd get the following error.

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.

Solution

I resolved this by implementing "Solution One" from Microsoft Knowledge Base article Q148652, "A LNK2005 error occurs when the CRT library and MFC libraries are linked in the wrong order in Visual C++". This forces the linker to link the libraries in the correct order.

Steps:

  1. Right-click the project, choose Properties.
  2. Ensure you're making changes for All Configurations, and All Platforms.
  3. In the left pane, browse to Linker → Input.
  4. In the right pane, pull down Additional Dependencies, choose <Edit...>.
  5. Add mfcs120d.lib.

Based on the Code Project article Solve error LNK2005: _DllMain@12 already defined in msvcrtd.lib(dllmain.obj) in MFC Projects", I figure I might have to add another library to that list someday, but this much works for me for now.

答案 2 :(得分:1)

好吧,我想我在这个(有点)上扔了一块毛巾。我能够至少解决所有问题。我只是不得不停止使用一些Microsoft类。

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

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

所以我经历了并确定了我正在使用的是什么,这些包括。我使用的是 AfxBeginThread()方法,以及类 CMutex CCriticalSection 。所以我想如果我可以摆脱任何专有的窗口东西,也许我的问题会消失。这意味着删除所有包含的,然后使用更标准的c ++代码解决编译错误。这是我做的:

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

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

答案 3 :(得分:0)

当我将#include afxdllx.h从dllmain.cpp移动到StdAfx.h时出现错误。我的项目没有这个包括