2008-12-05 182 views

回答

14

如果你仔細閱讀鏈接錯誤,並運用一定的瞭解,你可能會得到有自己:

鏈接器鏈接的編譯對象和庫合力得到一個二進制文件。

每個對象/庫描述

  • ,預計什麼符號存在於其他物體
  • 什麼符號,它定義

如果兩個對象定義了相同的符號,你得到的正是這種鏈接器錯誤。在你的情況下,mfcs80.lib和MSVCRT.lib都定義了_DllMain @ 12符號。

擺脫錯誤的:

  1. 找出你真正需要
  2. 這兩個庫的其中找出如何告訴鏈接不使用另一個(使用例如tip from James Hopkin
+3

+1好點 - 我沒有正確閱讀錯誤。當MFC庫選項神祕地打開時,我最近自己也有類似的鏈接器錯誤。 – 2008-12-05 11:20:49

+0

準確的解釋。感謝那。 :) – mahesh 2008-12-05 11:41:12

+2

缺少詳細信息 - 某些庫定義了弱連接,定義正確的庫包含順序將首先使用mfc,然後使用msvcrt,然後悄悄放棄弱連接 – 2012-09-19 16:09:51

9

如果你定義自己的DllMain,在您的項目設置,您需要在「配置屬性/常規」到「用標準來設置「MFC的使用」 Windows庫「。

你應該做一個乾淨的重建後,改變它。

+3

我有一個純C,非MFC DLL設置爲「使用標準Windows庫」,但錯誤仍然彈出。 – 2015-03-15 23:58:08

+0

我也是。 VS2010。 – AlastairG 2018-01-26 14:52:41

+0

我發現從預處理器中刪除_WINDOWS定義在項目設置 - > C/C++ - >預處理器擺脫了MSVCRTD.lib的虛假引用。我正在使用VS2010。 – ulatekh 2018-02-28 21:29:53

6

在我的項目中,我能夠通過在項目設置中添加mfcs80.lib和msvcrt.lib作爲附加依賴項來解決此問題。鏈接器 - >輸入下可以找到'附加依賴關係'。

在必須分別爲mfcs80d.lib和msvcrtd.lib的調試配置中。順便說一下,我正在使用Visual Studio 2010,所以在我的情況下,MFC lib被稱爲mfc100.lib。

我不知道爲什麼這個工作。沒有必要將這些lib文件添加爲額外的依賴項,因爲我已經將'使用MFC'設置爲'在共享DLL中使用MFC'。我想通過將這些庫指定爲附加依賴關係,它們以不同的順序鏈接。

此解決方案與Microsoft網站上建議的解決方案大致相同:http://support.microsoft.com/kb/148652,但我不需要在「忽略特定默認庫」框中鍵入任何內容。

+0

您建議的鏈接幫助我解決問題。值得一讀。 – TinyRacoon 2016-03-31 09:06:40

1

我親自擺脫了這種錯誤是這樣的:在Solution Explorer右擊的項目,從彈出菜單中選擇Properties,點擊Linker選項卡,並添加mfcs71ud.libAdditional Dependencies。如果您使用的是Visual Studio 2005,它應該是「80」而不是「71」等等。

+0

我有一個非常類似的問題。 [mfcs110d.lib(dllmodul.obj):錯誤LNK2005:_DllMain @ 12已經在MSVCRTD.lib(dllmain.obj)中定義]並且解決方案是**將mfcs110d.lib添加到其他依賴項** – joseAndresGomezTovar 2014-04-08 14:24:47

3

MSDN知識庫ID Q148652。

http://support.microsoft.com/kb/148652

原因: 的Visual C++編譯按字母順序排列的源文件,和編譯的對象文件傳遞到以字母順序接頭。 如果鏈接器首先處理DLLDATAX.OBJ,則源代碼引用鏈接器從MSVCRTD.LIB(dllmain.obj)加載的DllMain。 然後,鏈接器處理從包含#include「stdafx.h」的C++文件編譯的目標文件,該文件引用鏈接器從MFC42D.LIB(dllmodul.obj)加載的符號 __afxForceUSRDLL。該對象模塊還包含DllMain的實現,導致衝突的 。

31

我有相同的錯誤消息,但沒有答案在這裏解決了我。 所以,如果你創建一個使用MFC DLL中項目時遇到問題,可以通過輸入以下行解決:

extern "C" { int _afxForceUSRDLL; } 

DllMain定義cpp文件。然後使用您自己的DllMain實現,而不是來自dllmain.obj的實現。

When we try to use MFC library, we surely will include afx.h directly or indirectly, then MFC(afx.h) tell the linker to find the symbol of __afxForceUSRDLL and put that object which contains __afxForceUSRDLL into the program, so linker searches and puts dllmodule.obj into our program, because __afxForceUSRDLL is defined in dllmodule.cpp.

That’s the common scenario. When we want to use our own DllMain in a mfc dll project, linker complains that there are two DllMain, one in our code, one in Dllmodule.obj.

So we need to tell the linker to add our dllmain.obj for __afxForceUSRDLL. So we need to define __afxForceUSRDLL in our own cpp file where our own DllMain is defined, then the linker will ignore mfc’s dllmodule.obj and see only one DllMain and never complains.

來源:http://social.msdn.microsoft.com/Forums/en-US/0d78aa6b-1e87-4c01-a4a7-691335b7351a/how-to-build-mfc-application-dll-in-visual-c-2010

1

我有一個非常類似的問題。 [mfcs110d.lib(dllmodul.obj):錯誤LNK2005:_DllMain @在MSVCRTD.LIB已經定義12(dllmain.obj)]以及溶液添加mfcs110d.lib到附加依賴

0

我發現溶液這裏 Visual Studio 2010 library linking order

這是:/ FORCE:在連接選項MULTIPLE

我不得不混合在一起ATL和MFC,使用 [模塊(名稱= 「MyModule的」)];在MFC應用程序中使用「__hook」關鍵字構造

2

在我的情況中,我遇到了預處理器指令的問題。 由於某種原因,_USRDLL被定義,當它不應該。

要進行檢查,進入菜單項目,選擇項目屬性,然後選擇片段配置屬性 - >預處理

預處理指令將在那裏找到。

0

我發現這裏面幫我: http://support.microsoft.com/kb/148652

基本上連接順序是不正確的。 CRT庫在MFC庫之前被鏈接。事實證明,MFC庫必須連接FIRST,然後才能連接CRT庫。

Yucko Microsoft!

3

對於所有在ATL項目中遇到此錯誤的人(主要是在嘗試添加MFC支持時),以下是我在挫折之後找到的解決方案!

首先,this link對我來說比其他人更有幫助。它指出我正確的方向。如果出於某種原因「生成的文件」(包含代理和存根代碼,就像類型GUID)已被刪除並讀入項目,則會出現問題。這會導致Visual Studio以錯誤的順序添加它們!

通常你首先想出了「ATL需要C++編譯」的錯誤,但是你可能已經通過爲該文件設置了Yc/Yu(預編譯頭文件)設置來解決這個問題。

接下來你應該做的是卸載你的項目並編輯它。搜索定義構建和包括訂單的項目組(ClCompileClInclude)。檢查他們的順序和設置。

的編譯應該出現在這個順序:

  1. dllmain.cpp(與CompileAsManaged設置爲falsePrecompiledHeader空)。
  2. 庫源(MyLib.cpp,含有DllCanUnloadNow等)
  3. 代理/存根碼(MyLib_i.c;具有相同的設置dllmain.cpp
  4. stdafx.cpp(與PrecompiledHeader集到Create
  5. 所有其他庫源文件(你的實際庫中的內容)
  6. xdlldata.c(使用相同的設置作爲dllmain.cpp

將包括然後應責令這樣的:

  1. dllmain.h
  2. MyLib_i.h
  3. Resource.h
  4. stdafx.h
  5. targetver.h
  6. ...(實際庫頭)
  7. xdlldata.h

解決生成訂單固定我的項目,我能夠創建一個新的乾淨構建。

6

對我來說,直接原因確實是缺少_afxForceUSRDLL符號引用,但間接原因是缺少_USRDLL宏定義。它由VC嚮導默認定義,但偶爾會由開發人員錯誤地將其擦除。 Here it is in more words

0

Project Properties -> Linker Tab -> Input of Visual StudioAdditional Dependancies字段中聲明mfc80ud.libmfcs80ud.lib以解決該問題。

0

確保您有「的Stdafx.h」在每個.cpp文件的頂部。我得到了完全相同的錯誤,並有一個.cpp文件根本沒有包含這個頭文件。添加#include解決了這個問題。