Точна ли официальная двоичная несовместимость между приложениями VS2017 и VS2015 и dll? - PullRequest
0 голосов
/ 07 ноября 2018

TL; DR - Документы MS утверждают, что двоичная совместимость между библиотеками VS2015 и VS2017 равна односторонняя , хотя я предположил, что она обязательно двусторонняя. Где подвох?


Сначала для фона:

Предпосылки / связанные вопросы:

Запутывающее ограничение, которое я нахожу:

Есть два исключения из этого правила. Двоичная совместимость не гарантируется в следующих случаях:

...

При использовании библиотек , созданных с использованием набора инструментов, версия которого больше , чем набор инструментов , используемый для компиляции и компоновки приложения . Например, программа, скомпилированная и связанная с версией компилятора 19.12, может использовать библиотеки, скомпилированные с 19.0 до 19.12.

Это предостережение, ИМХО, технически небрежно и запутанно. Какой будет техническая причина для этого?

Я говорю, что он небрежный, потому что он неполный, потому что интерфейс между исполняемым файлом и DLL довольно симметричен, но этот маркер охватывает только «приложение».

В частности, и при условии, что все модули построены на основе динамической версии CRT, и эта динамическая версия CRT является самой новой доступной версией, я вижу следующие комбинации, где двоичное сравнение является проблемой:

  • my_2017.exe <-> my_2015.dll - вроде бы поддерживается
  • my_2015.exe <-> my_2017.dll - казалось бы, не поддерживается
  • my_2017.exe <-> my_2015.dll <-> my_2017_x.dll - что теперь, в каком "направлении" это поддерживается между прочим DLL?

Поскольку бинарное сжатие - чисто с точки зрения бинарного интерфейса / интерфейса - должно выполняться в обоих направлениях , я не совсем понимаю, где мы можем внезапно получить несовместимость: вызовы API могут идти в обоих направлениях (обратные вызовы и т. Д.) .) объекты «перемещаются» в обе стороны, даже порядок загрузки DLL может быть смешанным.

Это важный момент, ИМХО, поскольку он означает двоичную совместимость , как указано равно серьезно ограничено:

  • Если мое приложение хочет использовать какую-либо скомпилированную библиотеку VC14*, я "официально" все равно должен убедиться, что мое приложение построено с "самой новой версией".
  • С другой стороны, если вы не создаете «приложение», но у вас есть DLL, я, похоже, могу использовать любую другую VC14* DLL и быть совместимой?
  • С помощью VCRedist мы имеем точно случай, который, по-видимому, не поддерживается , а именно нам разрешено использовать библиотеку VC2017 (CRT в этот случай) из приложения 2015 года!

Вопрос

Итак, почему (!) Это ограничено тем, как оно есть, и как оно связано с зависимостями между dll, а также с обращенным (!) Требованием к версии CRT-dll.

1 Ответ

0 голосов
/ 21 июня 2019

Microsoft с тех пор обновила свои документы , соответствующий раздел текущей версии https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017 гласит:

C ++ Двоичная совместимость между Visual Studio 2015 и Visual Studio 2019

...

При смешивании двоичных файлов, созданных с различными поддерживаемыми версиями набора инструментов MSVC, распространяемый Visual C ++, на котором работает ваше приложение, не может быть старше чем любая из используемых версий инструментов создать приложение или любые библиотеки, которые оно потребляет.

Разница в https://github.com/MicrosoftDocs/cpp-docs/commit/a505dccfb31eb49c2ffece4dabd24a0a61b1fcb3#diff-d488b4c71be450b2a39cdce495c229bf

Для этого нет прямой проблемы с GitHub / MS-Docs, но это ограничение имеет гораздо больше смысла: в нем просто говорится о требованиях совместимости распространяемого и о том, что требуется версия времени выполнения VC, которая по крайней мере так же актуально, как и новейший используемый модуль.

Это, конечно, может иметь смысл, поскольку речь идет не только о чистой двоичной совместимости.

Конечно, то, что я сказал в этом вопросе, остается в силе: любое (старое) приложение VS2015 должно быть совместимо с (новым) распространяемым VS2019, поэтому я предполагаю, что вся поверхность интерфейса, которую когда-либо выставлял VCRedist-VC14.0, должна быть двоичный код.

...