Ошибка компоновщика после переноса приложения C ++ с VC6 на VS2005

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

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

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

10.12.2008 12:52:57
я получаю сообщение об ошибке во время компоновки, которого я не получил в vc6,
vijay.j 10.12.2008 12:58:57
Этот вопрос едва терпим из-за большого редактирования Рича Б. Вопрос очень локализован.
mmcdole 10.12.2008 13:02:40
Извините за вопрос, но зачем вам переходить с 10-летней технологии на более старую?
Joachim Sauer 10.12.2008 14:03:55
Опрашивающий не имеет в виду VC5 - mfcs80.lib показывает, что он использует VS2005.
ChrisN 10.12.2008 20:33:56
Понимаю. Я сам не пользователь MS, но «LNK2005» должен был быть намеком на это.
Joachim Sauer 10.12.2008 21:25:17
3 ОТВЕТА

С 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 будет связана.

Так

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

Или

Заставить линкер связывать библиотеки в правильном порядке

  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. Перестрой свой проект. Библиотеки будут перечислены в окне вывода в процессе связывания.
2
10.12.2008 20:49:15

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

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

0
26.02.2014 15:06:11