Visual Studio Связывание ошибок.Порядок, в который входят MFC, CRT? - PullRequest
4 голосов
/ 27 августа 2010

Этот вопрос неоднократно поднимался, но Visual Studio не перестает меня оспаривать.

У нас есть приложение, которое должно быть самодостаточным, то есть не зависеть от сторонних библиотек. Вот почему мы строим все статически, используя MT(d) флаги генерации кода.

Приложение зависит от Qt, zlib, OpenSSL и DCMTK. Все эти библиотеки были созданы как статические библиотеки с MT(d). Приложение также использует некоторый связанный с MFC код, поэтому мы также должны ссылаться на него.

MFC включен через

#include <afxwin.h>

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

Вот ошибки, связанные со ссылкой:

Error 24 error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj) uafxcwd.lib
Error 22 error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) uafxcwd.lib
Error 23 error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj) uafxcwd.lib
Error 21 error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) uafxcwd.lib

Вот вывод компоновщика .

Я прочитал много тем на многих сайтах, а также эту статью из КБ MSDN. Но они не помогают мне, поскольку все они продолжают говорить, что библиотеки MFC должны быть связаны до CRT, но я не могу найти способ изменить порядок ссылок.

Любая помощь очень ценится.

Редактировать 1 : Используя трюк из этот поток фактически решает проблему, но я все еще хочу знать, что здесь не так.

Редактировать 2 : Использование Visual Studio 2008 SP1 в Windows 7 и Qt 4.6.3

Ответы [ 2 ]

4 голосов
/ 27 августа 2010

Проблема ясна: вы компилируете код CRT и MFC вместе.

Когда вы используете библиотеки MFC, вы должны убедиться, что они связаны, прежде чем библиотека CRT будет связана.Вы можете сделать это, убедившись, что каждый файл в вашем проекте сначала содержит Msdev \ Mfc \ Include \ Afx.h, либо напрямую (#include), либо косвенно (#include).Включаемый файл Afx.h устанавливает правильный порядок библиотек, используя директиву:

#pragma comment (lib,"<libname>")

У Microsoft есть статья (ссылка сейчасушел, , но посмотрите здесь ), описывающий эту проблему и предлагающий 2 решения шаг за шагом ( следующие шаги основаны на Visual C ++ 6.0 ):

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

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

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

В модуле Объект / библиотека (VS2008: Свойства-> Свойства конфигурации-> Компоновщик-> Ввод-> Дополнительные зависимости ) введите имена библиотек. Убедитесь, что они перечислены впорядок и первые две библиотеки в строке (например, Nafxcwd.lib Libcmtd.lib).

Решение второе: найдите и исправьте проблемный модуль

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

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

Это было разъяснено мне на форуме MSDN: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/4e331cb3-e566-4ca6-b7d4-118c3bebd31a

...