2008-12-10 2 views
1

Я получаю сообщение об ошибке при переносе моего приложения от VC6 в Visual Studio 2005.Linker ошибки после портирования приложения C++ из VC6 в VS2005

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

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

+0

Я получаю сообщение об ошибке при связывании, которое я получил в vc6, – 2008-12-10 12:58:57

ответ

2

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

LNK2005 ошибка возникает, когда библиотеки библиотек CRT связаны между собой в неправильном порядке в Visual C++

Поскольку

библиотеки CRT использовать слабое внешнее связь для нового, удалять и DllMain функции. В библиотеках MFC также содержатся новые, удаленные и DllMain функции. Эти функции требуют, чтобы библиотеки МФУ связывались до того, как связалась библиотека CRT .

Так

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

Либо

Force компоновщик Ссылка Библиотеки в Правильном Порядке

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

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

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

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

Или

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

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

Я уверен, что есть целый ряд причин этого может произойти - самый худший я когда-либо найденную был при попытке интегрировать ряд статических библиотек (наших), которые были первоначально DLLS (на самом деле, мы строить проекты как статические библиотеки DLL &).

Наша библиотека C++/CLI DLL использовала статические версии этих библиотек (Чтобы избежать проблем с зависимостью DLL, вызывающих проблемы с загрузкой ASP.NET при использовании Dll C++/CLI), и изначально была обнаружена такая же ошибка компоновщика.

Проблема заключалась в использовании макроса AFX_MANAGE_STATE (AfxGetStaticModuleState()), который был необходим, когда код был создан как DLL, но фактически не нужен для вызова статической библиотеки.

Чтобы решить эту проблему, я добавил следующий код в stdafx.h каждого проекта.

#ifdef OMUTILITIES_LINK_STATIC 
    #undef AfxGetStaticModuleState 
    #define AfxGetStaticModuleState AfxGetModuleState 
#endif 

Это, конечно же, не может быть вашей конкретной проблемой. Но в конце концов я понял, что это, включив опцию/VERBOSE для компоновщика и увидев, кто, что, где &, когда он вытягивал библиотеки времени выполнения. (Свойства проекта/Свойства конфигурации/Linker/Show Progress в vs2005)

0

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

Смежные вопросы