ошибка LNK2005: _DllMain @ 12 уже определен в MSVCRT.lib

Я получаю эту ошибку компоновщика.

mfcs80.lib (dllmodul.obj): ошибка LNK2005: _DllMain @ 12 уже определен в MSVCRT.lib (dllmain.obj)

Подскажите, пожалуйста, правильный способ устранения этой ошибки. Я читал решение об этой ошибке на сайте поддержки Microsoft, но это не сильно помогло.

Я использую VS 2005 с Platform SDK


person Mahesh    schedule 05.12.2008    source источник


Ответы (17)


Если вы внимательно прочитаете ошибку компоновщика и примените некоторые знания, вы можете добраться туда сами:

Компоновщик связывает вместе несколько скомпилированных объектов и библиотек, чтобы получить двоичный файл.

Каждый объект / библиотека описывает

  • какие символы он ожидает присутствовать в других объектах
  • какие символы он определяет

Если два объекта определяют один и тот же символ, вы получите именно эту ошибку компоновщика. В вашем случае и mfcs80.lib, и MSVCRT.lib определяют символ _DllMain @ 12.

Избавляемся от ошибки:

  1. узнайте, какая из обеих библиотек вам действительно нужна
  2. узнайте, как указать компоновщику не использовать другой (например, используя совет от Джеймса Хопкина)
person xtofl    schedule 05.12.2008
comment
Отсутствующие детали - некоторые библиотеки определяют слабые связи, при определении правильного порядка включения библиотеки сначала будет использоваться mfc, а второй - msvcrt, поэтому слабая связь будет автоматически удалена. - person Greg Domjan; 19.09.2012

У меня было такое же сообщение об ошибке, но ни один из ответов здесь не помог мне. Поэтому, если вы столкнулись с этой проблемой при создании проекта DLL, использующего MFC, ее можно решить, введя следующую строку:

extern "C" { int _afxForceUSRDLL; } 

в файл cpp, где определено DllMain. Тогда используется ваша собственная DllMain реализация, а не реализация из dllmain.obj.

Когда мы пытаемся использовать библиотеку MFC, мы обязательно включим afx.h прямо или косвенно, затем MFC (afx.h) скажет компоновщику найти символ __afxForceUSRDLL и поместить этот объект, который содержит __afxForceUSRDLL, в программу, поэтому компоновщик ищет и помещает dllmodule.obj в нашу программу, потому что __afxForceUSRDLL определен в dllmodule.cpp.

Это обычный сценарий. Когда мы хотим использовать наш собственный DllMain в проекте mfc dll, компоновщик жалуется, что есть два DllMain, один в нашем коде, один в Dllmodule.obj.

Поэтому нам нужно указать компоновщику добавить наш dllmain.obj для __afxForceUSRDLL. Поэтому нам нужно определить __afxForceUSRDLL в нашем собственном файле cpp, где определен наш собственный DllMain, тогда компоновщик проигнорирует dllmodule.obj mfc и увидит только один DllMain и никогда не будет жаловаться.

Источник: http://social.msdn.microsoft.com/Forums/en-US/0d78aa6b-1e87-4c01-a4a7-691335b7351a/how-to-build-mfc-application-dll-in-visual-c-2010

person Constantin    schedule 12.11.2013
comment
У меня работал, у меня был включен AfxWin.h и немного другая библиотека, вызывающая проблему: uafxcwd.lib (dllmodul.obj): error LNK2005: _DllMain @ 12 уже определено - person Grant; 13.11.2013
comment
Работал для меня с VS2008 и DLL, где я вызвал ошибку ссылки, используя коллекции MFC, в частности CMapStringToString. - person osullivj; 09.02.2016
comment
Я удалил //AFX_MANAGE_STATE(AfxGetStaticModuleState()); stackoverflow.com/a/9070135/1641556 - person Elshan; 19.04.2016
comment
Для кода, который должен компилироваться как 32-битный и 64-битный, используйте этот #ifdef X86 extern C {int _afxForceUSRDLL; } #else extern C {int __afxForceUSRDLL; } #endif - person JonDrnek; 02.01.2018
comment
@JonDrnek Это должно быть: #ifdef _WIN64 extern C {int __afxForceUSRDLL; } #else extern C {int _afxForceUSRDLL; } #endif - person Anurag S Sharma; 22.05.2018
comment
Эти параметры также не работают для меня ... теперь я получаю сообщение об ошибке: mfcs140.lib (dllmodul.obj): error LNK2005: DllMain уже определен в xxxMyclassMain.obj - person Manish; 31.07.2020

Если вы определяете свой собственный DllMain, в настройках проекта вам необходимо установить «Использование MFC» в «Свойства конфигурации / Общие» на «Использовать стандартные библиотеки Windows».

Вы должны выполнить чистую перестройку после его изменения.

person James Hopkin    schedule 05.12.2008
comment
У меня есть чистая C, не-MFC DLL, настроенная на использование стандартных библиотек Windows, но ошибка все равно появляется. - person Timothy Gu; 16.03.2015
comment
Я обнаружил, что удаление _WINDOWS из препроцессора определяется в настройках проекта - ›C / C ++ -› Препроцессор избавился от ложной ссылки на MSVCRTD.lib. Я использую VS2010. - person ulatekh; 01.03.2018

В моем проекте мне удалось решить эту проблему, добавив mfcs80.lib и msvcrt.lib в качестве дополнительных зависимостей в настройках проекта. «Дополнительные зависимости» можно найти в Linker -> Input.

В конфигурации отладки это должны быть mfcs80d.lib и msvcrtd.lib соответственно.

Кстати, я работаю с Visual Studio 2010, поэтому в моем случае библиотека MFC называется mfc100.lib.

Я не уверен, почему это сработало. Нет необходимости добавлять эти файлы lib в качестве дополнительных зависимостей, потому что я уже установил для параметра «Использование MFC» значение «Использовать MFC в общей dll». Я предполагаю, что, указав эти библиотеки как дополнительные зависимости, они связаны в другом порядке.

Это решение более или менее похоже на решение, предложенное на сайте Microsoft: http://support.microsoft.com/kb/148652, за исключением того, что мне не нужно было ничего вводить в поле «Игнорировать определенные библиотеки по умолчанию».

person vmb100    schedule 05.07.2012

Для меня прямой причиной действительно было отсутствие ссылки на символ _afxForceUSRDLL, но косвенной причиной было отсутствие определения макроса _USRDLL. Он определяется по умолчанию мастером VC, но иногда разработчики удаляют его по ошибке. Вот несколько слов.

person Ofek Shilon    schedule 06.05.2015
comment
У меня было наоборот! У меня был мошеннический _USRDLL в препроцессоре, который должен был быть _LIB. Дох! - person TinyRacoon; 31.03.2016

Идентификатор базы знаний MSDN Q148652.

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

Причина: Visual C ++ компилирует исходные файлы в алфавитном порядке и передает скомпилированные объектные файлы компоновщику в алфавитном порядке. Если компоновщик сначала обрабатывает DLLDATAX.OBJ, исходный код ссылается на DllMain, который компоновщик загружает из MSVCRTD.LIB (dllmain.obj). Затем компоновщик обрабатывает объектный файл, скомпилированный из файла C ++, который содержит #include «stdafx.h», который ссылается на символ __afxForceUSRDLL, который компоновщик загружает из MFC42D.LIB (dllmodul.obj). Этот объектный модуль также содержит реализацию DllMain, вызывающую конфликт.

person Bill    schedule 06.09.2013

У меня очень похожая проблема. [mfcs110d.lib (dllmodul.obj): ошибка LNK2005: _DllMain @ 12 уже определена в MSVCRTD.lib (dllmain.obj)], и решением было добавить mfcs110d.lib в Дополнительные зависимости

person joseAndresGomezTovar    schedule 24.04.2014
comment
Я также получаю ту же ошибку: mfcs140.lib (dllmodul.obj): error LNK2005: DllMain уже определен в msvcrt.lib (dll_dllmain_stub.obj) Попытался добавить эти библиотеки в «Дополнительные зависимости», но все равно не смог решить .. Я все еще получаю ту же ошибку .. Я создаю dll как конечный результат, а не exe .. - person Manish; 31.07.2020
comment
Хотите скачать простой образец проекта? - person joseAndresGomezTovar; 26.08.2020

Для всех, кто сталкивается с этой ошибкой в ​​проектах ATL (в основном при попытке добавить поддержку MFC), вот решение, которое я нашел после нескольких дней разочарований!

Прежде всего, эта ссылка была для меня более полезной, чем все остальные. Это указывало мне на правильное направление. Проблема возникает, если «сгенерированные файлы» (содержащие код прокси и заглушки, как и идентификаторы типов) по какой-то причине были удалены и прочитаны в проект. Это заставляет Visual Studio добавлять их в неправильном порядке!

Обычно вы сначала сталкиваетесь с ошибкой «ATL требует компиляции C ++», но вы могли исправить это, отключив параметр Yc/Yu (предварительно скомпилированные заголовки) для этого файла.

Что вам нужно сделать дальше, так это выгрузить свой проект и отредактировать его. Найдите группы элементов, которые определяют сборку и порядок включения (ClCompile и ClInclude). Проверьте их порядок и настройки.

Компиляции должны появиться в следующем порядке:

  1. dllmain.cppCompileAsManaged, установленным в false и PrecompiledHeader оставлено пустым).
  2. Исходный код библиотеки (MyLib.cpp, содержащий DllCanUnloadNow и т. Д.)
  3. Код прокси / заглушки (MyLib_i.c; с теми же настройками, что и dllmain.cpp)
  4. stdafx.cppPrecompiledHeader, установленным на 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

Исправив порядок сборки, мой проект был исправлен, и я смог создать новую чистую сборку.

person Carsten    schedule 13.01.2015
comment
Просто хотел прокомментировать, что этот ответ был чрезвычайно полезным; Я не знал, что компоновщик зависит от порядка включения сборки в проект, но на самом деле это устранило проблему для меня. - person Nick; 31.10.2016

Я лично избавился от этой ошибки следующим образом: щелкнул правой кнопкой мыши проект в Solution Explorer, выбрал Properties во всплывающем меню, щелкнул вкладку Linker и добавил mfcs71ud.lib в Additional Dependencies. Если вы используете Visual Studio 2005, оно должно быть «80» вместо «71» и так далее.

person izogfif    schedule 20.04.2013
comment
У меня очень похожая проблема. [mfcs110d.lib (dllmodul.obj): ошибка LNK2005: _DllMain @ 12 уже определен в MSVCRTD.lib (dllmain.obj)], и решением было добавить mfcs110d.lib в Дополнительные зависимости - person joseAndresGomezTovar; 08.04.2014

В моем случае у меня возникла проблема с директивами препроцессора. По какой-то причине _USRDLL был определен, хотя этого не должно было быть.

Чтобы проверить это, перейдите в меню Project, выберите Project Properties, затем выберите фрагмент Configuration Properties -> Preprocessor .

Здесь вы найдете директивы препроцессора.

person joan    schedule 19.08.2014
comment
Этот совет необходимо немного обновить для Visual Studio 2107. Выберите свой проект в обозревателе решений, щелкните правой кнопкой мыши и выберите «Свойства». Теперь перейдите в C / C ++ ›Препроцессор› Определения препроцессора и удалите _USRDLL. - person user1741137; 01.04.2019
comment
user1741137 - В общем, прав, но вместо того, чтобы ждать 86 лет, чтобы узнать, совет действует уже около 4 лет [snarky: 2017, а не 2107] :) - person David V. Corbin; 31.01.2021

Просто #undef _USRDLL перед включением afx.h или, что еще лучше, отредактируйте конфигурацию проекта и удалите макрос.

Это обычная конфигурация библиотеки DLL расширения MFC: Параметры сборки для библиотеки DLL MFC

person mgruber4    schedule 02.12.2015

Убедитесь, что вы включили «Stdafx.h» в начало каждого файла .cpp. Я получал ту же ошибку, и у меня был единственный файл .cpp, который вообще не включал этот заголовок. Добавление #include решило проблему.

person Matt Davis    schedule 10.06.2016

Я нашел решение здесь Порядок связывания библиотеки Visual Studio 2010

это: / FORCE: MULTIPLE в параметрах компоновщика

Мне пришлось смешать ATL и MFC вместе, чтобы использовать [module (name = "mymodule")]; конструкция в приложении MFC вместе с ключевым словом "__hook"

person Danil    schedule 23.05.2014

Я обнаружил, что это мне помогло: http://support.microsoft.com/kb/148652

В основном порядок компоновщика был неправильным. библиотеки CRT связывались раньше, чем библиотеки MFC. Оказывается, библиотеки MFC нужно было связать СНАЧАЛА, а затем можно было связать библиотеки CRT.

Юко, Microsoft !!

person C Johnson    schedule 22.10.2014

Объявите mfc80ud.lib и mfcs80ud.lib в поле Additional Dependancies в Project Properties -> Linker Tab -> Input of Visual Studio, чтобы исправить проблему.

person Avishek Bose    schedule 09.10.2015
comment
Хотя кто-то дал такой же ответ годом ранее, этот самый лучший, поэтому я оставлю свои 5 центов здесь. Кажется, что msvcrt.dll импортирует dllmain только в том случае, если он не был объявлен ранее. Добавление mfc * .dll к дополнительным зависимостям ускоряет его обработку и решает проблему. Как уже упоминал кто-то другой, / FORCE: MULTIPLE также накладывает компоновщик, но в моем случае созданный .dll вылетал во время выполнения. - person Maciek; 08.03.2016

Здесь есть общая тема, проходящая через некоторые ответы.

Авишек Бозе: -

Объявите mfc80ud.lib и mfcs80ud.lib в поле «Дополнительные зависимости» в «Свойства проекта» -> «Вкладка компоновщика» -> «Входные данные» Visual Studio, чтобы устранить проблему.

vmb100: -

Я работаю с Visual Studio 2010, поэтому в моем случае библиотека MFC называется mfc100.lib.

joseAndresGomezTovar: -

У меня очень похожая проблема. [mfcs110d.lib (dllmodul.obj): ошибка LNK2005: _DllMain @ 12 уже определена в MSVCRTD.lib (dllmain.obj)], и решением было добавить mfcs110d.lib в Дополнительные зависимости

Таким образом, в общем случае кажется, что сначала нужно найти имя добавляемой библиотеки ...

Название библиотеки

а потом добавить ....

Добавить библиотеку в зависимости

Обратите внимание, что, похоже, есть некоторые предварительные требования и / или альтернативные решения.

person Ivan    schedule 06.06.2019

Это также может произойти, если в вашем решении несколько проектов, экспортирующих одни и те же символы. Например, если у вас есть подпроект, который строит foo.dll с файлом foo.def, который экспортирует DoFoo и подпроект для bar.dll с файлом bar.def, который экспортирует DoFoo, произойдет коллизия, и это будет ошибку вы увидите при ссылке.

person dmedine    schedule 03.08.2020