Ошибки связи с Visual Studio 2008 - PullRequest
1 голос
/ 28 июля 2011

Я только что обновился до 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 Ответ

0 голосов
/ 29 июля 2011

Ваша проблема в том, что 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 Studio2005.

Обновление : Подумайте об этом еще немного, если вы добавили 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 of afxole.h и выясните, почему базовый класс COleDropTarget не определен, несмотря на то, что включен файл afxframewndex.h.

...