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


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

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

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

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

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

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

Аналогичным образом невозможно установить более раннюю распространяемую версию, если новая версия уже установлена. Установщик сообщает об ошибке при попытке. Например, вы увидите ошибку, если установите Redistributable 2022 на компьютере, который уже имеет версию 2026.

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++
Аудит использования версии среды выполнения Visual C++
Часто задаваемые вопросы о жизненном цикле — распространяемые библиотеки Visual C++ и библиотеки среды выполнения