Вопросы о «двоичной совместимости между Visual Studio 2015 и Visual Studio 2017»

https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=vs-2017 говорит, что двоичная совместимость C ++ между Visual Studio 2015 и Visual Studio 2017 гарантирована, за исключением:

1) Когда статические библиотеки или объектные файлы компилируются с помощью параметра компилятора / GL.

2) При использовании библиотек, созданных с использованием набора инструментов, версия которого больше, чем набор инструментов, использованный для компиляции и компоновки приложения. Например, программа, скомпилированная и связанная с версией компилятора 19.12, может использовать библиотеки, скомпилированные с 19.0 до 19.12. Кроме того, двоичная совместимость существует только между Visual Studio 2015 и Visual Studio 2017; связывание программ 19.x с библиотеками, созданными Visual Studio 2013 или более ранней версии, не поддерживается.

Исключение 2 сбивает меня с толку. Почему двоичная совместимость не может быть гарантирована в этом случае?

Давайте сделаем это более конкретным. Предоставляется папка, которая содержит пользовательский исполняемый файл, пользовательскую библиотеку DLL и часть библиотеки DLL vc_toolset (v140 или v141). И пользовательский exe, и пользовательский dll динамически связаны с частью dll vc_toolset, которая включает в себя CRT dll, msvcp140.dll, vcruntime140.dll. Кроме того, опция / GL не включена.

Я перечислю несколько комбинаций ниже. Я удивляюсь бинарной совместимости каждого из них.

1) exe, собранный vs2015 + dll, собранный vs2015 + v140, набор инструментов dll из vs2015

Я думаю, что двоичная совместимость может быть гарантирована в этом случае.

2) exe, созданный vs2015 + dll, созданный vs2015 + v141 dll из vs2017

на основании случая 1, кроме того, dll набора инструментов были заменены более новой версией, которая поставляется с vs2017.

Кроме того, я думаю, что двоичная совместимость может быть гарантирована в этом случае.

3) exe построен на vs2015 + dll перестроенный vs2017 + v140 инструментарий dlls vs2015

Основываясь на случае 1, пользовательская библиотека DLL была перестроена с использованием vs2017. Тогда есть два варианта:

а) просто замените dll, и exe не будет перестроен с использованием новой библиотеки импорта dll

б) заменить DLL и перестроить исполняемый файл с использованием новой библиотеки импорта DLL.

Согласно исключению 2 вышеупомянутой ссылки, двоичная совместимость не может быть гарантирована в a) и b) случае. Но почему ? Все интерфейсы и зависимости пользовательского dll не изменены, и это не зависит от новой функции v141.

4) exe построен на vs2015 + dll перестроенный vs2017 + набор инструментов dll vs2017 vs1

На основании случая 3, кроме того, dll набора инструментов были заменены более новой версией, которая поставляется с vs2017.

5) EXE перестроенный vs2017 + dll, построенный vs2015 + набор инструментов dll vs2015 v140

основанный на случае 1, пользовательский exe-файл был перестроен с использованием vs2017 и связан с импортом lib пользовательского dll, который был ранее собран vs2015

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

6) EXE перестроенный vs2017 + dll, созданный vs2015 + набор инструментов dll из vs2017 vs2017

на основании случая 5, кроме того, dll набора инструментов были заменены более новой версией, которая поставляется с vs2017.
если случай 5 и случай 2 могут быть гарантированы, я думаю, что это также гарантировано в этом случае.

Правильно ли мое понимание?

1

Решение

Поскольку вы явно вызываете

… CRT DLL …

Я отвечу на эту часть:

Обратная совместимость между CR201 VS2017 и CRT VS2015 гарантируется на 100%! (По модулю М.С. Баги, конечно.)

Как я могу это сказать? Метод развертывания по умолчанию для CRT MSVC — развертывание всех файлов CRT в System32Таким образом, существует один (1) глобальный набор библиотек CRT, которые будут использовать большинство приложений. (По крайней мере, AFAIKT, многие приложения используют MS CRT в форме DLL, но не связывают все библиотеки CRT в своем каталоге приложений.)

А с VS 2017 против 2015 все библиотеки CRT имеют одни и те же имена файлов, то есть msvcp140.dll, vcruntime140.dllнет 141 файлы! (Так Пуля Пойнт 6 не существует.)

Таким образом, данная система Windows может иметь не более одного глобального набора файлов CRT140, и, поскольку ни одно приложение не управляет этим, более новые версии CRT140 должны быть обратно совместимы с приложениями, созданными на основе более старых версий.


Учитывая это, я бы просто не делать случаи 3 а также 5 (в отношении ЭЛТ) из вашего вопроса: всегда развертывать новейший MS CRT, на который полагаются ваши компоненты.

Даже нашел запись в блоге относительно этот (2017/03/07):

… VCRedist совместим только с обратной совместимостью, поэтому вам нужно будет распространить последний VCRedist 140, доступный в VS 2017, вместе с вашим приложением. …


Что касается пул 3 и 4 ситуации 2015.exe <-> 2017.dllЯ создал новый вопрос: Точна ли официальная двоичная несовместимость между приложениями VS2017 и VS2015 и dll? потому что это действительно странно, ИМХО.

1

Другие решения

Суть статьи, которую вы цитируете, заключается в том, что Microsoft имеет ВЫРОСЛА вероятность совместимости между двоичными файлами MSVS 2015 и MSVS 2017.

В нем перечислены только два исключения:

https://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017?view=vs-2017

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

В предыдущих версиях Visual Studio двоичная совместимость между
объектные файлы (OBJ), статические библиотеки (LIB), динамические библиотеки
(DLL) и исполняемые файлы (EXE), созданные с использованием различных версий
набор инструментов компилятора и библиотеки времени выполнения не гарантировались.

Это изменилось в Visual Studio 2017. В Visual Studio 2015 и Visual
Studio 2017, основной номер набора инструментов C ++ — 14 (v140 для Visual
Studio 2015 и v141 для Visual Studio 2017). Это отражает тот факт,
что библиотеки времени выполнения и приложения, скомпилированные с
любая версия компилятора — по большей части — двоичная
совместимы.

Это означает, например, что если у вас есть DLL в Visual
Studio 2015, вам не нужно перекомпилировать его, чтобы использовать
из приложения, созданного с помощью Visual Studio 2017.

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

  1. Когда статические библиотеки или объектные файлы компилируются с помощью параметра компилятора / GL.

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector