Связать ошибки с Visual Studio 2008
Я только что обновился до Visual Studio 2008 с 2005 года вчера. Ну, я пытаюсь воспользоваться некоторыми из новых классов (в частности, CFrameWndEx), и я получаю ошибки. Объявление дочернего класса CFrameWndEx и последующее добавление afxcmdiframewndex.h в stdafx.h дает мне только одну ошибку. На первый взгляд безобидный. Я просто получаю сообщение об ошибке "Базовый класс COleDropTarget не определен". Хорошо, просто исправьте, добавьте afxole.h в мои списки, и все будет хорошо. Но после того, как я это сделаю, наступит весь ад. Все в выводе хорошо до связывания:
1>LIBCMT.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(tidtable.obj) : error LNK2005: __encode_pointer already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(tidtable.obj) : error LNK2005: __decode_pointer already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(setlocal.obj) : error LNK2005: __configthreadlocale already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(strftime.obj) : error LNK2005: _strftime already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in msvcrtd.lib(cinitexe.obj)
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrtd.lib(cinitexe.obj)
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in msvcrtd.lib(cinitexe.obj)
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in msvcrtd.lib(cinitexe.obj)
1>LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type already defined in msvcrtd.lib(MSVCR90D.dll)
1>msvcrtd.lib(MSVCR90D.dll) : error LNK2005: __setmbcp already defined in LIBCMT.lib(mbctype.obj)
1>LINK : warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
А использование /NODEFAULTLIB, чтобы избавиться от msvcrtd.lib и LIBCMT, просто вызвало кучу проблем. Я бы предположил, что один из способов исправить это - найти библиотеки, конфликтующие с msvcrtd.lib и LIBCMT, но как мне это сделать?
Кто-нибудь видел эту проблему раньше? Это похоже на конфликт с кодом Microsoft, но возможно, что это может быть мой код. Любая помощь приветствуется.
Заранее спасибо.
1 ответ
Ваша проблема в том, что msvcrtd.lib конфликтует с LIBCMT.lib. Они не должны оба использоваться. Библиотека msvcrtd.lib используется при компиляции для многопоточной динамической компоновки, время отладки (/MDd), а LIBCMT используется при компиляции для многопоточной статической компоновки, не отладочная среда выполнения (/MT). Смотрите здесь для некоторого фона.
LIBCMT используется по умолчанию, если переключатель не указан.
Возможно, стоит проверить "Свойства конфигурации" | C/C++ | "Генерация кода" | Параметр "Библиотека времени выполнения" для подтверждения того, что для сборок выпуска установлено значение / MD, а для отладочных сборок - / MDd. Вам нужно проверить этот параметр для проекта и каждый файл cpp в проекте, поскольку отдельные файлы могут иметь разные параметры.
Честно говоря, если бы установка переключателя была неверной, я бы ожидал, что проблема проявится еще до того, как вы включили afxole.h, и я ожидал, что afxver.h выдаст ошибку, запрашивающую использование переключателя / MD, чтобы проблема может быть более тонкой, чем просто неправильная установка переключателя.
Обновление: я удалил ссылку на ключ /ML, это была Visual Studio 2003, а не Visual Studio 2005.
Обновление: Подумайте об этом еще немного, если вы добавили afxframewndex.h
тогда вам не нужно явно включать afxole.h
потому что это должно быть включено для вас.
Если вы включите /showInclude и скомпилируете свою программу, окно вывода должно показать что-то вроде этого...
1>Note: including file: c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxframewndex.h
[snipped all the includes due to afxframeimpl.h and afxcontrolbarutil.h]
1>Note: including file: c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxpopupmenu.h
1>Note: including file: c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxpopupmenubar.h
1>Note: including file: c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtoolbar.h
1>Note: including file: c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtoolbardroptarget.h
1>Note: including file: c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxole.h
Вам нужно избавиться от явного #include в afxole.h и выяснить, почему базовый класс COleDropTarget не определен, несмотря на то, что включен файл afxframewndex.h.