Подтвердить что ты не робот

Библиотеки времени выполнения GCC vs Распространяемые среды выполнения Microsoft Visual С++

Может ли кто-нибудь пролить свет на версию и распространение библиотек на С++

  • Библиотека GCC (libgcc, libstdС++,..?)
  • Библиотеки времени исполнения Microsoft Visual С++ (6.0, 2005, 2008, 2010, 2012, 2013, 2015,....)

С моим ограниченным доступом к программированию GCC я никогда не видел, чтобы библиотеки времени исполнения С++ распространялись вместе с программой. Это часто случается с программами MS Windows.

Может ли относительно старая Linux-система запускать более новую программу С++ 14 (которая скомпилирована на более новой системе и затем скопирована в старую систему)?

У программистов GCC распространяются библиотеки времени выполнения вместе с программами? Если нет, то почему программы Windows распространяют их? Как дистрибутивы GCC гарантируют, что программа С++ всегда работает при установке?

Как насчет таких фреймворков, как Qt, как Qt обрабатывает управление версиями и дистрибутивом в Linux и Windows? Qt также распространяет время выполнения для разных версий?

Может быть, это связано с платформой, как разрабатывается Linux и как разрабатывается Windows.

Что так принципиально отличается в подходах GCC и MS Windows?

4b9b3361

Ответ 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.