Ответ 1
Библиотеки времени выполнения GCC, такие как библиотека GNU C, обеспечивают стабильный бинарный интерфейс (небольшая сноска: тип GCC 5.1 взорвался из-за новых возможностей С++, которые должны были быть реализованы). В библиотеках Microsoft нет, и каждая небольшая разница версий может и, возможно, нарушит ABI (двоичный интерфейс приложения). Кроме того, компиляторы Microsoft также изменяют свой ABI с добавлением версии, что делает плохую идею комбинировать код, созданный различными версиями своих инструментов. Также здесь GCC поддерживает строгую ABI, что делает объектный код совершенно совместимым (если, конечно, не указаны опции ABI break codenen).
Этот ABI состоит из размера и макета объекта, который использует компилятор при генерации кода. Поэтому запуск кода, созданного для одной версии, но использующего другую версию во время выполнения, может привести к неожиданным результатам, поскольку расположение и использование памяти просто разные.
GNU/Linux достаточно силен в этом отношении и, как правило, может поддерживать сильную обратную совместимость. Пока скомпилированная программа была скомпилирована против более старой версии библиотеки, она будет работать отлично, если будет загружена более новая версия, установленная пользователем. То же самое касается Qt, который только разбивает ABI между основными номерами версий (Qt 4 и Qt 5 не могут быть загружены во время взаимозаменяемости).
Есть некоторые небольшие исключения, GCC 5 libstdС++ - большая проблема. Однако я не знаю больших обломков ABI. Новый Microsoft Universal CRT пытается решить эту проблему, предоставив стабильный интерфейс времени выполнения C, и по мере того, как история заставила бы нас поверить, обеспечить стабильность библиотеки ABIB в стиле glibc. Этот UCRT доступен для Windows Vista и выше, но приложения должны быть скомпилированы специально для этого. Первая версия VS, которая имеет эту возможность, - VS2015.