2012-02-07 60 views
2

我想爲.dll注入目的編寫一個.dll庫。由於這個事實,它必須有一個名爲DllMain的例程,因爲這將被用作入口點。我認爲我的問題可能源自這樣一個事實,即我正在使用我編寫的靜態庫進行鏈接,該庫使用來自afxmt.h的線程和互斥體。因爲在某個位置,包含這個會導致鏈接器從mfcs100ud.lib鏈接,這顯然包含它自己的DllMain版本。不能通過「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)

我剛剛搞砸了,因爲我無法更改名稱o f我的Dll入口點不是DllMain?

+0

什麼項目的文件'dllmodul(e)'來自?很可能你的靜態庫包含一個DllMain並且是問題,而不是MFC。這種特殊的錯誤幾乎只會在你做一種項目並在稍後改變它時發生,或者以其他方式丟失一些設置或代碼;它不僅僅出現在新項目中,並且一旦找到源代碼就很容易解決。 – ssube 2012-02-07 21:48:03

+0

我不確定dllmodul(e)是什麼意思,但是NamedPipeLogger.h文件的代碼來自我寫的一個靜態庫。它是一個連接到命名管道的線程日誌文件編寫器。它使用互斥體和線程,所以我必須包含,。如何檢查我的靜態庫是否包含DllMain?我寫了這個東西,所以我知道我沒有聲明或者引用一個DllMain,所以我不知道它是如何來自這個庫的。 – Ultratrunks 2012-02-07 21:56:12

+0

你的靜態庫鏈接到MFC?如果是這樣,配置屬性中的「使用MFC」的設置是什麼? – 2012-02-07 21:59:53

回答

1

嗯,我想我扔在這一個(有點)毛巾。我能夠至少解決所有的問題。我不得不停止使用一些Microsoft類。

我的問題描述談到了這一點,但我記得開始有困難,儘快編制我一開始包括:

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

於是我就通過與想通了,我用什麼,需要這些包括。我正在使用AfxBeginThread()方法,以及類別CMutexCCriticalSection。所以我想,如果我可以擺脫任何專有的Windows東西,也許我的問題就會消失。這意味着刪除所有包含,,然後用更多標準C++代碼來解決編譯錯誤。這是我做的:

  • 而不是使用AfxBeginThread()我用CreateThread()。
  • 而不是使用CMutex和CCriticalSection我用CRITICAL_SECTION結構及其伴隨的例程。

之後,我能夠編譯.dll,它工作正常。

+0

我在嘲笑'CreateThread'和'CRITICAL_SECTION'這個概念比你使用的更「標準」。沒有什麼是標準的;它是從A到Z的Windows專用的。(沒有什麼*錯誤*,但你應該知道它。) – zwol 2012-02-09 19:58:00

+0

那麼它不需要應用程序框架eXtention頭(afx),這給了我麻煩鏈接期間的神祕dll。這就是我所掌握的。 – Ultratrunks 2012-02-10 07:23:14

3

最近,我遇到了相同或類似的問題,並找到了解決辦法。

背景

我在Visual Studio 2013 MFC項目臨,生成一個DLL。我有一些 。c模塊,對於這些C文件,我可以通過conditionally specifying the 'extern "C"' construct,disabling precompiled headers來完成,在我的情況下 - 禁用繼承的forced includes,這是從項目默認值中引入stdafx.h。

問題

有一天,在已經用這種方法成功地在幾個C文件,當我嘗試添加只是多了一個,我會得到下面的錯誤。

1>Link: 
1> All outputs are up-to-date. 
1>mfcs120d.lib(dllmodul.obj) : error LNK2005: [email protected] 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. 

我通過實施從Microsoft Knowledge Base article Q148652「解決方案的一個」解決了這個,「當CRT庫和MFC庫中在Visual C錯誤的順序被連接時,會發生錯誤LNK2005 ++」。這會強制鏈接器以正確的順序鏈接庫。

步驟:

  1. 右鍵單擊該項目,選擇屬性。
  2. 確保您正在對所有配置和所有平臺進行更改。
  3. 在左側窗格中,瀏覽到鏈接器→輸入。
  4. 在右側窗格中,下拉附加依賴項,選擇<編輯... >。
  5. 添加mfcs120d.lib。

根據代碼項目文章Solve error LNK2005: [email protected] already defined in msvcrtd.lib(dllmain.obj) in MFC Projects",我想我可能不得不在某一天添加​​另一個庫到這個列表中,但現在這對我來說很有用。

1

在許多情況下,這是由預處理器設置中的_USRDLL引起的,它應該是_LIB。這與'MFC extension dlls'有關,我認爲現在還沒有人會這樣做,但VS嚮導似乎假設你在嚮導中選中「使用MFC」時想要使用它。

0

當我將#include afxdllx.h從dllmain.cpp移動到StdAfx.h時,出現錯誤。我的項目沒有這個工作,也包括