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

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

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

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


person vijay.j    schedule 10.12.2008    source источник
comment
Я получаю сообщение об ошибке во время связывания, чего у меня не было в vc6,   -  person vijay.j    schedule 10.12.2008
comment
Этот вопрос едва ли можно терпеть из-за большого редактирования Rich B. Вопрос очень локализован.   -  person mmcdole    schedule 10.12.2008
comment
Извините за вопрос, но зачем вам переносить технологию 10-летней давности на еще более старую?   -  person Joachim Sauer    schedule 10.12.2008
comment
Спрашивающий не имеет в виду VC5 - mfcs80.lib показывает, что он использует VS2005.   -  person ChrisN    schedule 10.12.2008
comment
Я понимаю. Я сам не являюсь пользователем MS, но LNK2005 должен был быть намеком на это.   -  person Joachim Sauer    schedule 11.12.2008
comment
saua .. портирование с vs6 на vs2005 действительно имеет смысл .. В ide с 6 по 2005 г. произошли большие (реальные) изменения. быть почти не событием.   -  person baash05    schedule 17.12.2008


Ответы (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.

So

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

Либо

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

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

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

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

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

Or

Найдите и исправьте проблемный модуль Чтобы просмотреть текущий порядок ссылок библиотеки, выполните следующие действия:

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

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

person Ruddy    schedule 19.01.2010

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

person Jak    schedule 26.02.2014