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). И пользовательский исполняемый файл, и пользовательский dll динамически связаны с частью dll vc_toolset, которая включает в себя библиотеки CRT, 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 dll из vs2015
На основании случая 1, пользовательская DLL была перестроена с использованием vs2017. Тогда есть два варианта:
a) просто замените dll, и exe-файл не будет перестроен с использованием новой библиотеки импорта dll
b) замените dll и пересоберите exe с использованием новой библиотеки импорта dll.
Согласно исключению 2 вышеупомянутой ссылки, двоичная совместимость не может быть гарантирована в a) и b) случае. Но почему ? Все интерфейсы и зависимости пользовательского dll не изменены, и это не зависит от новой функции v141.
4) exe, созданный vs2015 + dll , перестроен vs2017 + набор инструментов dll vs2017
основано на случае 3, кроме того, dll набора инструментов были заменены на более новую версию, поставляемую с vs2017.
5) exe перестроен vs2017 + dll построен vs2015 + v140 инструментарий dlls vs2015
На основании случая 1, пользовательский exe был перестроен с использованием vs2017 и связан с импортом lib из пользовательского dll, который был ранее собран vs2015
По приведенной выше ссылке, я думаю, что двоичная совместимость может быть гарантирована в этом случае.
6) exe перестроен vs2017 + dll, собранный vs2015 + v141 dll из vs2017
на основании случая 5, кроме того, dll набора инструментов были заменены более новой версией, которая поставляется с vs2017.
если случай 5 и случай 2 могут быть гарантированы, я думаю, что это также гарантируется в этом случае.
Правильно ли мое понимание?