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

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

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

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

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

ИЗМЕНИТЬ

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


person ForeverLearning    schedule 31.05.2017    source источник
comment
msdn.microsoft.com/en-us/library/ee956429.aspx   -  person Hans Passant    schedule 01.06.2017
comment
@HansPassant Извините, я не понимаю. Вы говорите, что статические библиотеки, созданные, скажем, с VS2013, автоматически помещают директиву pragma_detect без моего ведома, поэтому, если я попытаюсь связать ее из другого компилятора, появится ошибка компоновщика? (т.е. никакого вмешательства с моей стороны?)   -  person ForeverLearning    schedule 01.06.2017
comment
Автоматический - не совсем правильное слово. Эта #pragma появляется в файлах #include, которые вы используете в своей программе. Это общий механизм, включаемые файлы компилятора просто используют его для обнаружения грубых несоответствий. Он встраивает директиву компоновщика / FAILIFMISMATCH foo = bar в объектный файл, компоновщик просто собирает все foo и проверяет, что все они являются bar. Просто выполните поиск файлов в каталоге vc / include для #pragma, чтобы увидеть, как они используются.   -  person Hans Passant    schedule 01.06.2017
comment
@HansPassant В самом деле! Теперь я это вижу. Как я сказал в своем EDIT выше, я включил WPO / LTCG, на котором были созданы промежуточные объектные файлы, которые не работают с dumpbin. Так что я не мог видеть ни одного из этих символов. Чтобы завершить мое понимание, вы говорите, что VS 2017 игнорирует эти проверки FAILIFMISMATCH? VS 2017 все равно будет жаловаться, если я попытаюсь использовать статическую библиотеку, созданную с помощью VS 2013, верно?   -  person ForeverLearning    schedule 01.06.2017
comment
Компоновщик VS2017 их не игнорирует. У вас нет гарантии, что включаемые файлы старого компилятора уже сгенерировали нужный / FAILIFMISMATCH. Механизм относительно новый (VS2010 и новее), и с каждым выпуском добавляются разновидности foo.   -  person Hans Passant    schedule 01.06.2017
comment
@HansPassant Я не могу сказать, что у меня есть дзен, но я приближаюсь. Я создал статическую библиотеку на VS 2015 и убедился, что видел /FAILIFMISMATCH:_MSC_VER=1900 в получившемся файле .obj. Теперь я создал EXE с VS 2017 и связался с этой статической библиотекой. Все построено красиво. Так что либо VS 2017 все равно, _MSC_VER = 1900 или что-то еще происходит.   -  person ForeverLearning    schedule 01.06.2017
comment
Вот что означает двоичная совместимость. Конкретно VS2017 против VS2015, сомнительно, что следующий выпуск также будет бинарно совместимым. Посмотрим.   -  person Hans Passant    schedule 01.06.2017
comment
@HansPassant Спасибо за отличное обсуждение. Я кое-что узнал сегодня.   -  person ForeverLearning    schedule 01.06.2017


Ответы (2)


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

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

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

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

- Эндрю Пардо, MSVC tools

person apardoe    schedule 01.06.2017
comment
Спасибо, Эндрю. Суть вопроса WPO / LTCG заключалась в том, что я не был уверен, заботится ли двоичная совместимость даже о формате промежуточного объектного файла. Поскольку IIUC, помимо двоичной совместимости, проблема с WPO / LTCG заключается в том, что формат объектного файла варьируется в зависимости от инструментальных средств. - person ForeverLearning; 01.06.2017
comment
Да, как я уже сказал: вы можете связать некоторый код между выпусками, но в конечном итоге вы столкнетесь с чем-то, что ломается. - person apardoe; 03.06.2017
comment
А как насчет v141 и v140_xp? Я конвертирую проект v140_xp в v141 и внезапно сталкиваюсь с сбоями, вызванными dll asp.net, у которой нет определенного набора инструментов версии, насколько я могу видеть - person T.S; 15.11.2017
comment
v140 и v141 должны быть совместимы. варианты _xp - это те же инструменты, которые используются с другим SDK. - person apardoe; 16.11.2017

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/

person Bengt Gustafsson    schedule 01.06.2017
comment
Я не могу отметить ваш ответ как принятый, но спасибо за ссылку! Я прочитал этот пост еще в марте, но совершенно забыл об этом. - person ForeverLearning; 01.06.2017