Я получаю сообщение об ошибке при переносе приложения с VC6 на Visual Studio 2005.
Кто-нибудь знает, что это значит?
mfcs80.lib (dllmodul.obj): ошибка LNK2005: _DllMain @ 12 уже определен в MSVCRT.lib (dllmain.obj)
Я получаю сообщение об ошибке при переносе приложения с VC6 на Visual Studio 2005.
Кто-нибудь знает, что это значит?
mfcs80.lib (dllmodul.obj): ошибка LNK2005: _DllMain @ 12 уже определен в MSVCRT.lib (dllmain.obj)
Из http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652
Ошибка LNK2005 возникает, когда библиотека CRT и библиотеки MFC связаны в неправильном порядке в Visual C ++
Так как
Библиотеки CRT используют слабую внешнюю связь для функций new, delete и DllMain. Библиотеки MFC также содержат функции new, delete и DllMain. Эти функции требуют, чтобы библиотеки MFC были связаны до связывания библиотеки CRT.
So
Есть два способа решить эту проблему. Первое решение заключается в том, чтобы заставить компоновщика связывать библиотеки в правильном порядке. Второе решение позволяет найти модуль, вызывающий проблему, и исправить ее.
Либо
Заставить компоновщик связывать библиотеки в правильном порядке
- В меню "Проект" выберите "Настройки".
- В разделе «Параметры для просмотра» диалогового окна «Параметры проекта» щелкните, чтобы выбрать конфигурацию проекта, в которой возникают ошибки связи.
- На вкладке «Ссылка» щелкните, чтобы выбрать «Ввод» в поле со списком «Категория».
В поле Игнорировать библиотеки вставьте имена библиотек (например, Nafxcwd.lib; Libcmtd.lib).
Примечание. Эквивалент командной строки компоновщика в / NOD :.
- В поле Модули объектов / библиотек вставьте имена библиотек. Вы должны убедиться, что они перечислены по порядку и как первые две библиотеки в строке (например, Nafxcwd.lib Libcmtd.lib).
Чтобы установить этот параметр в Visual C ++ .NET, прочтите раздел интерактивной справки «Настройка свойств проекта Visual C ++».
Or
Найдите и исправьте проблемный модуль Чтобы просмотреть текущий порядок ссылок библиотеки, выполните следующие действия:
- В меню "Проект" выберите "Настройки".
- В разделе «Параметры для просмотра» диалогового окна «Параметры проекта» щелкните, чтобы выбрать конфигурацию проекта, в которой возникают ошибки связи.
- На вкладке «Ссылка» введите / verbose: lib в поле «Параметры проекта».
- Восстановите свой проект. Библиотеки будут перечислены в окне вывода во время процесса связывания.
Я уверен, что это могло произойти по ряду причин - худшая из тех, что я когда-либо обнаружил, была при попытке интегрировать несколько статических библиотек (наших), которые изначально были DLL (фактически, мы создаем проекты как DLL, так и статические библиотеки). библиотеки).
Наша C ++ / CLI DLL использовала статические версии этих библиотек (чтобы избежать проблем с зависимостями DLL, которые вызывали проблемы с загрузкой ASP.NET при использовании C ++ / CLI Dll) и изначально обнаруживала ту же ошибку компоновщика.
Проблема оказалась в использовании макроса AFX_MANAGE_STATE (AfxGetStaticModuleState ()), который был необходим, когда код был построен как DLL, но фактически не нужен для вызова статической библиотеки.
Чтобы решить эту проблему, я добавил следующий код в stdafx.h каждого проекта.
#ifdef OMUTILITIES_LINK_STATIC
#undef AfxGetStaticModuleState
#define AfxGetStaticModuleState AfxGetModuleState
#endif
Это, конечно, может быть не вашей конкретной проблемой. Но в конечном итоге я понял, что это было включением параметра / VERBOSE для компоновщика и просмотром того, кто, что, где и когда загружал библиотеки времени выполнения. (Свойства проекта / Свойства конфигурации / Компоновщик / Показать прогресс в vs2005)
Вы можете настроить вход компоновщика так, чтобы он игнорировал вызывающую проблему библиотеку в свойствах проекта, но это может работать, а может и не работать.