2015-08-04 2 views
0

Я понимаю, что попытка связать объекты/библиотеки, которые были скомпилированы с различными версиями набора инструментов Visual C++, приведет к сбою, как описано здесь error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj.Несовместимость связей между различными объектами Visual C++ и DirectX SDK

Однако при работе с DirectX SDK 2010, похоже, нет проблем с привязкой к этим старым библиотекам (например, d3d11.lib и т. Д.), Даже если мы используем VC++ 12/13/15.

Почему мы можем ссылаться на эти старые библиотеки DirectX, но не на те, которые были созданы более ранними версиями VC++. Кроме того, если не VC++, что было использовано для компиляции этих библиотек DirectX в первую очередь?

+0

Обратите внимание, что с VC++ 12/13/15 Вы не должны использовать наследие DirectX SDK для '' d3d11.lib '' и тому подобное. Вы должны использовать его - если вообще - для устаревшей библиотеки '' d3dx11.lib'' или нижнего уровня '' xaudio2.lib'', которая работает в Windows 7. См. [MSDN] (https: // msdn.microsoft.com/en-us/library/windows/desktop/ee663275.aspx) и [это сообщение в блоге] (http://blogs.msdn.com/b/chuckw/archive/2013/07/01/where -is-the-directx-sdk-2013-edition.aspx) –

ответ

0

Библиотеки DirectX представляют собой библиотеки C (с изображением COM). C традиционно имеет платформенные ABI-соглашения.

Ваши библиотеки/объекты - C++. C++ обычно не имеет стабильной ABI даже на той же платформе. Связывание кода, скомпилированного с разными компиляторами, разные версии одного и того же компилятора, такие же версии компилятора, но с разными флагами компиляции, не поддерживаются. То же самое верно для разных стандартных библиотек и стандартных версий библиотек.

Microsoft обычно поддерживает бинарную совместимость C++ между основными версиями компилятора Visual Studio. Для переносного кода Microsoft рекомендует использовать C или COM.

Смотрите также:

+0

А, я понял, спасибо! Я должен был заметить, что вопрос о C и C++ имеет значение. – Dominic

+0

C++ и C - проблема, но суть проблемы заключается в различии между _static library_ и библиотекой _import_. Библиотека _import_ - это всего лишь заглушка '.lib'', которая содержит C ABI ссылки со всеми кодами в DLL. Обычно вы можете легко использовать библиотеку _import_, созданную из разных версий инструментов, поэтому «d3d11.lib'' работает. Что не работает, это смешивание _static library_ между различными наборами инструментов. Вот где вещи становятся беспорядочными, и когда вещь '' detect_mismatch'' действительно срабатывает. –

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