Двоичная совместимость между VS2017 и VS2015

Этот пост: совместим ли Visual-C++-2017 с двоичным кодом VC++-2015? ясно говорит, что VS 2017 двоично совместим с VS 2015. Это даже выглядит как официальная позиция.

Мой вопрос в прошлом, я отчетливо помню, как сталкивался с ошибками компоновщика (я не помню конкретный набор ошибок) каждый раз, когда я пытаюсь связать статическую библиотеку, которая была скомпилирована с другой версией MSVC, в EXE-файл, который строится с более новой версией MSVC.

Тем не менее, двоичная (не) совместимость звучит как нечто, что взорвется вам в лицо во время выполнения, а не во время соединения.

Может кто-нибудь сказать мне, действительно ли предыдущие версии MSVC действительно производили ошибки компоновщика производителя при несовпадении версий? Как это было достигнуто?

РЕДАКТИРОВАТЬ

Как это влияет на статические библиотеки, созданные с включенным WPO/LTCG? Я считаю, что они создают промежуточные объектные файлы (в отличие от COFF), и Microsoft не гарантировала, что формат этих промежуточных файлов останется неизменным в разных версиях компилятора.

2 ответа

Решение

Как я уже ответил на связанный вопрос, набор инструментов v140 в VS 2015 и набор инструментов v141 в VS 2017 совместимы в двоичном формате. v141 был создан как член того же "семейства", поскольку все обновления v140 (например, VS 2015 Update 1, 2, 3) были в одном семействе. Это было намеренное дизайнерское решение, которое помогает разработчикам переходить на новую версию VS, не беспокоясь о необходимости вносить изменения в свой исходный код.

VS 2017 может поддерживать несколько наборов инструментов. Следующий набор инструментов не будет двоично совместимым с v140/v141. Но вы все равно сможете установить v141, когда ваш код будет совместим с новыми функциями C++ в следующем наборе инструментов.

Обратите внимание, что мы никогда не поддерживали бинарную совместимость между основными версиями. Нельзя связать двоичный файл, созданный с v140, и двоичный файл, созданный с v130, независимо от WPO/LTCG/ и т. Д. Да, это часто работает - мы стараемся свести к минимуму критические изменения в наших библиотеках, поэтому часто бывает так, что связывание некоторого кода между основными версиями не приводит к ошибкам. Но в конце концов вы столкнетесь с чем-то, что изменилось, и вы увидите ошибку.

Относительно того, видите ли вы ошибку ссылки или ошибку времени выполнения, зависит от того, какой API-интерфейс несовместимой библиотеки вы вызвали. Если экспортированная форма API изменилась - имя функции, количество параметров - тогда компоновщик не сможет ее найти. Если форма такая же, но поведение изменилось, может произойти сбой во время выполнения.

- Андрей Пардо, MSVC инструменты

Microsoft утверждает, что они совместимы, и это подтверждается версионным номером компилятора, который на этот раз был увеличен с 1400 до 1410:

https://blogs.msdn.microsoft.com/vcblog/2017/03/07/binary-compatibility-and-pain-free-upgrade-why-moving-to-visual-studio-2017-is-almost-too-easy/

Другие вопросы по тегам