Если clang++ и g++ несовместимы с ABI, что используется для разделяемых библиотек в двоичном формате?
clang++ и g++ являются несовместимыми с ABI, даже для вещей, таких как ядро, как стандартные контейнеры, в соответствии с, например, веб-сайтом clang++.
Debian поставляется с совместно используемыми библиотеками С++, то есть с libboost и т.д., которые скомпилированы с ~ кое-чем и пользовательскими программами, использующими оба компилятора, и имена библиотек не искажены компилятором, который использовался для них. Когда вы устанавливаете clang, debian не идет и не дублирует все библиотеки С++, установленные в вашей системе.
Какая сделка? Является ли способность clang связываться с дистрибутированными С++-библиотеками, намного более мощными, чем описывают это разработчики компилятора (к счастью, осторожно)?
Ответы
Ответ 1
даже для вещей как ядро, как стандартные контейнеры
Стандартные контейнеры - это не все, что "ядро". (Для типичных реализаций) они полностью реализованы в действительных С++ в заголовках, и если вы скомпилируете те же заголовки с g++ и Clang++, вы получите выход, совместимый с ABI. Вы должны получать несовместимости "даже для вещей как ядра как стандартные контейнеры", если вы используете разные версии заголовков контейнеров, а не только с помощью Clang вместо GCC.
Оба GCC и Clang соответствуют кросс-венгерскому кросс-платформенному С++ ABI (первоначально разработанному для архитектуры Itanium, но также используемому для x86, x86_64, SPARC и т.д.). На самом деле основные вещи, такие как макет классов, манипулирование именами, обработка исключений, vtables и т.д., определяются тем, что ABI и Clang и GCC следуют за ним.
Иными словами, если вы скомпилируете тот же источник с GCC и Clang, вы получите ABI-совместимые двоичные файлы.
Если вы хотите понять это, лучше увидеть мой Что такое ABI и почему это так сложно? слайды.
Ответ 2
g++ и Clang для подавляющего большинства полностью совместимы с ABI. Кроме того, несовместимость ABI для стандартных контейнеров является свойствами стандартной реализации библиотеки (libstdС++ или libС++), а не компилятором. Поэтому нет необходимости в какой-либо перекомпиляции.
Clang никогда не мог свалиться с земли, если бы он не был совместим с ABI с g++, поскольку он был бы в принципе непригодным для использования без ранее существовавшего большого числа. Фактически, Clang настолько совместим с GCC, они обезьяны практически полностью используют интерфейс командной строки g++, встроенные функции компилятора, ошибки и т.д., Так что вы можете буквально просто сбрасывать Clang вместо g++ и подавляющее большинство времени, все будет просто работайте.
Ответ 3
Это, вероятно, не будет правильно отвечать на вопрос:
Некоторое время назад я попытался скомпилировать некоторые объектные файлы wih gcc, другие объектные файлы с clang. Наконец я связал все вместе, и он работал правильно.
Я считаю, что в дистрибутивах Linux используется gcc, потому что я рассмотрел некоторые Makefile из Ubuntu и CentOS, и они использовали gcc.