Ошибка компоновщика после переноса приложения C ++ с VC6 на VS2005 - PullRequest
1 голос
/ 10 декабря 2008

Я получаю сообщение об ошибке при переносе приложения из VC6 в Visual Studio 2005.

Кто-нибудь знает, что это значит?

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

Ответы [ 3 ]

2 голосов
/ 19 января 2010

Я уверен, что есть ряд причин, по которым это может произойти - самая худшая, которую я когда-либо обнаруживал, была при попытке интегрировать несколько статических библиотек (наших), которые изначально были DLLS (на самом деле, мы строим проекты как 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)

2 голосов
/ 10 декабря 2008

С http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652

Ошибка LNK2005 возникает при CRT библиотека и библиотеки MFC связаны в неправильном порядке в Visual C ++

Потому что

Библиотеки CRT используют слабый внешний связь для нового, удаления и Функции DllMain. Библиотеки MFC также содержат new, delete и DllMain функции. Эти функции требуют Библиотеки MFC, которые будут связаны до Библиотека ЭЛТ связана.

So

Есть два способа решить эту проблему проблема. Первое решение включает в себя заставляя компоновщик связать библиотеки в правильном порядке. Второе решение позволяет найти модуль, который вызывает проблему и исправить это.

Или

Force Linker to Link Библиотеки в правильном порядке

  1. В меню «Проект» выберите «Настройки».
  2. В окне «Настройки для просмотра» диалогового окна «Настройки проекта» щелкните выберите конфигурацию проекта, которая получает ошибки ссылки.
  3. На вкладке «Ссылка» выберите «Ввод» в поле со списком «Категория».
  4. В поле Игнорировать библиотеки вставьте имена библиотек (например, Nafxcwd.lib; Libcmtd.lib)

    .

    Примечание Эквивалент командной строки компоновщика в /NOD:.

  5. В поле «Объектные / библиотечные модули» введите имена библиотек. Вы необходимо убедиться, что они перечислены в порядке и как первые два библиотеки в строке (например, Nafxcwd.lib Libcmtd.lib).

Чтобы установить этот параметр в Visual C ++ .NET, прочитайте «Настройка проекта Visual C ++ Свойства "онлайн справочная тема.

Или

Найдите и исправьте Проблемный модуль Для просмотра текущего порядок ссылки на библиотеку, следуйте этим шаги:

  1. В меню «Проект» выберите «Настройки».
  2. В окне «Настройки для просмотра» диалогового окна «Настройки проекта» щелкните выберите конфигурацию проекта, которая получает ошибки ссылки.
  3. На вкладке Ссылка введите / verbose: lib в параметрах проекта коробка.
  4. Перестройте свой проект. Библиотеки будут перечислены в выводе окно во время процесса связывания.
0 голосов
/ 26 февраля 2014

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

...