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

Если clang++ и g++ несовместимы с ABI, что используется для разделяемых библиотек в двоичном формате?

clang++ и g++ являются несовместимыми с ABI, даже для вещей, таких как ядро, как стандартные контейнеры, в соответствии с, например, веб-сайтом clang++.

Debian поставляется с совместно используемыми библиотеками С++, то есть с libboost и т.д., которые скомпилированы с ~ кое-чем и пользовательскими программами, использующими оба компилятора, и имена библиотек не искажены компилятором, который использовался для них. Когда вы устанавливаете clang, debian не идет и не дублирует все библиотеки С++, установленные в вашей системе.

Какая сделка? Является ли способность clang связываться с дистрибутированными С++-библиотеками, намного более мощными, чем описывают это разработчики компилятора (к счастью, осторожно)?

4b9b3361

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