我收到此鏈接器錯誤。錯誤LNK2005:_DllMain @ 12已在MSVCRT.lib中定義
mfcs80.lib(dllmodul.obj) : error LNK2005: [email protected] already defined in MSVCRT.lib(dllmain.obj)
請告訴我消除此錯誤的正確方法。我在微軟支持網站上閱讀了關於這個bug的解決方案,但它沒有多大幫助。
我使用VS 2005平臺SDK
我收到此鏈接器錯誤。錯誤LNK2005:_DllMain @ 12已在MSVCRT.lib中定義
mfcs80.lib(dllmodul.obj) : error LNK2005: [email protected] already defined in MSVCRT.lib(dllmain.obj)
請告訴我消除此錯誤的正確方法。我在微軟支持網站上閱讀了關於這個bug的解決方案,但它沒有多大幫助。
我使用VS 2005平臺SDK
如果你仔細閱讀鏈接錯誤,並運用一定的瞭解,你可能會得到有自己:
鏈接器鏈接的編譯對象和庫合力得到一個二進制文件。
每個對象/庫描述
如果兩個對象定義了相同的符號,你得到的正是這種鏈接器錯誤。在你的情況下,mfcs80.lib和MSVCRT.lib都定義了_DllMain @ 12符號。
擺脫錯誤的:
如果你定義自己的DllMain,在您的項目設置,您需要在「配置屬性/常規」到「用標準來設置「MFC的使用」 Windows庫「。
你應該做一個乾淨的重建後,改變它。
在我的項目中,我能夠通過在項目設置中添加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,但我不需要在「忽略特定默認庫」框中鍵入任何內容。
您建議的鏈接幫助我解決問題。值得一讀。 – TinyRacoon 2016-03-31 09:06:40
我親自擺脫了這種錯誤是這樣的:在Solution Explorer
右擊的項目,從彈出菜單中選擇Properties
,點擊Linker
選項卡,並添加mfcs71ud.lib
到Additional Dependencies
。如果您使用的是Visual Studio 2005,它應該是「80」而不是「71」等等。
我有一個非常類似的問題。 [mfcs110d.lib(dllmodul.obj):錯誤LNK2005:_DllMain @ 12已經在MSVCRTD.lib(dllmain.obj)中定義]並且解決方案是**將mfcs110d.lib添加到其他依賴項** – joseAndresGomezTovar 2014-04-08 14:24:47
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的實現,導致衝突的 。
我有相同的錯誤消息,但沒有答案在這裏解決了我。 所以,如果你創建一個使用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.
我有一個非常類似的問題。 [mfcs110d.lib(dllmodul.obj):錯誤LNK2005:_DllMain @在MSVCRTD.LIB已經定義12(dllmain.obj)]以及溶液添加mfcs110d.lib到附加依賴
我發現溶液這裏 Visual Studio 2010 library linking order
這是:/ FORCE:在連接選項MULTIPLE
我不得不混合在一起ATL和MFC,使用 [模塊(名稱= 「MyModule的」)];在MFC應用程序中使用「__hook」關鍵字構造
在我的情況中,我遇到了預處理器指令的問題。 由於某種原因,_USRDLL
被定義,當它不應該。
要進行檢查,進入菜單項目,選擇項目屬性,然後選擇片段配置屬性 - >預處理。
預處理指令將在那裏找到。
我發現這裏面幫我: http://support.microsoft.com/kb/148652
基本上連接順序是不正確的。 CRT庫在MFC庫之前被鏈接。事實證明,MFC庫必須連接FIRST,然後才能連接CRT庫。
Yucko Microsoft!
對於所有在ATL項目中遇到此錯誤的人(主要是在嘗試添加MFC支持時),以下是我在挫折之後找到的解決方案!
首先,this link對我來說比其他人更有幫助。它指出我正確的方向。如果出於某種原因「生成的文件」(包含代理和存根代碼,就像類型GUID)已被刪除並讀入項目,則會出現問題。這會導致Visual Studio以錯誤的順序添加它們!
通常你首先想出了「ATL需要C++編譯」的錯誤,但是你可能已經通過爲該文件設置了Yc/Yu
(預編譯頭文件)設置來解決這個問題。
接下來你應該做的是卸載你的項目並編輯它。搜索定義構建和包括訂單的項目組(ClCompile
和ClInclude
)。檢查他們的順序和設置。
的編譯應該出現在這個順序:
dllmain.cpp
(與CompileAsManaged
設置爲false
和PrecompiledHeader
空)。MyLib.cpp
,含有DllCanUnloadNow
等)MyLib_i.c
;具有相同的設置dllmain.cpp
)stdafx.cpp
(與PrecompiledHeader
集到Create
)xdlldata.c
(使用相同的設置作爲dllmain.cpp
)將包括然後應責令這樣的:
dllmain.h
MyLib_i.h
Resource.h
stdafx.h
targetver.h
xdlldata.h
解決生成訂單固定我的項目,我能夠創建一個新的乾淨構建。
對我來說,直接原因確實是缺少_afxForceUSRDLL符號引用,但間接原因是缺少_USRDLL宏定義。它由VC嚮導默認定義,但偶爾會由開發人員錯誤地將其擦除。 Here it is in more words。
在Project Properties -> Linker Tab -> Input of Visual Studio
的Additional Dependancies
字段中聲明mfc80ud.lib
和mfcs80ud.lib
以解決該問題。
只需#undef
_USRDLL
在包括afx.h
之前,甚至更好,編輯您的項目配置並刪除宏。
這是一個MFC擴展DLL通常的配置:Build Settings for an MFC DLL
確保您有「的Stdafx.h」在每個.cpp文件的頂部。我得到了完全相同的錯誤,並有一個.cpp文件根本沒有包含這個頭文件。添加#include解決了這個問題。
+1好點 - 我沒有正確閱讀錯誤。當MFC庫選項神祕地打開時,我最近自己也有類似的鏈接器錯誤。 – 2008-12-05 11:20:49
準確的解釋。感謝那。 :) – mahesh 2008-12-05 11:41:12
缺少詳細信息 - 某些庫定義了弱連接,定義正確的庫包含順序將首先使用mfc,然後使用msvcrt,然後悄悄放棄弱連接 – 2012-09-19 16:09:51