Поделиться через


Совместимость двоичного кода C++ между версиями Visual Studio

Наборы инструментов компилятора Microsoft C++ (MSVC) в Visual Studio 2013 и более ранних версиях не гарантируют двоичную совместимость между основными версиями. Невозможно связать файлы объектов, статические библиотеки, динамические библиотеки и исполняемые файлы, созданные различными версиями этих наборов инструментов. Интерфейсы AB, форматы объектов и библиотеки среды выполнения несовместимы.

Это поведение изменилось в Visual Studio 2015 и более поздних версиях. Библиотеки и приложения среды выполнения, скомпилированные любой из этих версий компилятора, совместимы с двоичными файлами. Он отражается в основном номере набора инструментов C++, который начинается с 14 для всех версий с Visual Studio 2015. (Версия набора инструментов версии 140 для Visual Studio 2015, v141 для 2017, v142 для 2019 и версии 143 для 2022 года). Предположим, у вас есть сторонние библиотеки, созданные Visual Studio 2015. Их можно использовать в приложении, созданном Visual Studio 2017, 2019 или 2022. Нет необходимости перекомпилировать с соответствующим набором инструментов. Последняя версия пакета Microsoft Распространяемый компонент Visual C++ (распространяемая версия) работает для всех них.

Ограничения на совместимость двоичных файлов

Существует три важных ограничения на совместимость двоичных файлов между наборами инструментов версии 140, v141, v142 и 143 и дополнительными обновлениями версий:

  • Двоичные файлы, созданные с различными версиями наборов инструментов версии 140, v141, v142 и v143. Ключевое правило заключается в том, что компоновщик должен работать только с входными данными, созданными набором инструментов, который является той же версией (или более ранней), что и сама по себе. Это относится к приложениям, импорту библиотек, статическим библиотекам и другим файлам, как описано в файле ввода LINK. В некоторых случаях библиотека импорта для неявно связанной библиотеки DLL, созданной более поздней версией набора инструментов, может быть связана с более ранней версией набора инструментов, особенно если библиотека импорта строго используется extern "C" для импорта и экспорта. Ниже приведены некоторые примеры того, что все это означает:
    • Приложение, скомпилированное с набором инструментов 2017 (версия 141 версии 15.0 до 15.9), можно связать со статической библиотекой, скомпилированной с помощью Visual Studio 2022 версии 17.8 (версия 143), но связывание должно выполняться с помощью набора инструментов версии 17.8 или более поздней версии.
    • Приложения и библиотеки, созданные с помощью VS 2015, 2017, 2019 или 2022, могут быть связаны друг с другом, но связывание должно выполняться с помощью версии набора инструментов, который является последним, как и более поздние, чем, последний набор инструментов, используемый для создания любого из двоичных файлов, которые вы передаете компоновщику. Например, учитывая три двоичных файла, созданных с наборами инструментов из VS 2015 версии 14.3, VS 2017 версии 15.9 и VS 2019 версии 16.11, можно связать их с помощью любой версии набора инструментов, которая составляет 16.11 или более поздней.
    • Если библиотека DLL создается с помощью более нового набора инструментов, библиотека импорта иногда может использоваться со старыми наборами инструментов, если все экспорты соответствуют соглашению о вызове языка C (extern "C"). Однако единственным официально поддерживаемым случаем является использование более нового пакета SDK для Windows с более старым набором инструментов.
  • Распространяемое приложение использует аналогичное ограничение совместимости с двоичными файлами. При сочетании двоичных файлов, созданных различными поддерживаемыми версиями набора инструментов, распространяемая версия должна быть по крайней мере новой, как и последний набор инструментов, используемый любым компонентом приложения.
  • Статические библиотеки или файлы объектов, скомпилированные с помощью переключателя компилятора (оптимизация всей программы) или связанного с /GL использованием/LTCG (создание кода link-time), не совместимы с двоичными версиями, включая дополнительные обновления версий. Все файлы объектов и библиотеки, скомпилированные с помощью /GL , и /LTCG должны использовать точно тот же набор инструментов для компиляции и окончательной ссылки. Например, код, созданный с помощью /GL набора инструментов Visual Studio 2019 версии 16.7, нельзя связать с кодом, созданным с помощью /GL набора инструментов Visual Studio 2019 версии 16.8. Компилятор выдает неустранимая ошибка C1047.

Обновление Microsoft Распространяемый компонент Visual C++ из Visual Studio 2015 и более поздних версий

Мы сохранили основной номер версии Microsoft Распространяемый компонент Visual C++ одинаково для Visual Studio 2015, 2017, 2019 и 2022. Это означает, что одновременно можно установить только один экземпляр распространяемого компонента. Более новая версия перезаписывает уже установленную более раннюю версию. Например, одно приложение может установить распространяемый компонент из Visual Studio 2015. Затем другое приложение устанавливает распространяемый компонент из Visual Studio 2022. Версия 2022 перезаписывает старую версию, но так как она совместима с двоичными файлами, более раннее приложение по-прежнему работает нормально. Мы убедитесь, что последняя версия распространяемого компонента содержит все новейшие функции, обновления системы безопасности и исправления ошибок. Поэтому мы всегда рекомендуем обновить до последней доступной версии.

Аналогичным образом невозможно установить более раннюю распространяемую версию, если новая версия уже установлена. Установщик сообщает об ошибке при попытке. При установке распространяемой версии 2017 или 2019 на компьютере, который уже имеет версию 2022, появится ошибка:

0x80070666 - Another version of this product is already installed. Installation of this version cannot continue. To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel.

Эта ошибка выполняется по проектированию. Рекомендуется установить последнюю версию. Убедитесь, что установщик может восстановиться после этой ошибки автоматически.

Внимание

Поддержка библиотеки среды выполнения для Windows XP больше не доступна в последних Распространяемый компонент Visual C++ для Visual Studio. Последняя распространяемая версия Windows XP — версия 16.7 (версия 14.27.29114.0). Если приложения Windows XP развернуты или обновлены до более поздней версии распространяемого компонента, приложения не будут работать. Дополнительные сведения и сведения о том, как получить версию распространяемого компонента, поддерживающую Windows XP, см. в разделе "Настройка программ для Windows XP".

См. также

Журнал изменений Visual C++
Последние поддерживаемые загрузки Распространяемый компонент Visual C++