<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Clang vs Gcc: две компиляторных системы в одном дистрибутиве</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html</link>
    <description>  Компилятор - это помимо собственно фронтенда/оптимизаций/кодогенератора еще binutils, библиотеки runtime-поддержки и стандартные библиотеки. У gcc - это, например, gas/ld, glibc, libstdc++. По мере своего развития длительное время компилятор clang использовал binutils и библиотеки от компилятора gcc. Но разработчики clang последовательно движутся к полной замкнутости своего проекта. У них есть свой ассемблер (llvm-as), они активно развивают свой линкер, сделали свой аналог libstdc++ с названием libc++ и разрабатывают свой аналог glibc с названием libc. Наличие стандарта C/C++ должно гарантировать компиляцию программ обоими компиляторами, но никак не гарантирует совпадение хедеров из двух разных реализаций библиотек. (Например, errno может быть переменной, а может быть макросом, раскрывающимся в вызов функции и т.д. и т.п.) У двух независимо-разрабатываемых библиотек неизбежно будут библиотеки без бинарной совместимости.&lt;br&gt;  Рассмотрим теперь Unux-дистрибутив, который собран некоторой версией компилятора gcc.</description>

<item>
    <title>Clang vs Gcc: две компиляторных системы в одном дистрибутиве (sidtver)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html#16</link>
    <pubDate>Thu, 08 Oct 2020 20:11:37 GMT</pubDate>
    <description>firefox/rust/llvm&lt;br&gt;python/numba/llvm&lt;br&gt;Mesa/llvm&lt;br&gt;...&lt;br&gt;&lt;br&gt;llvm сам по себе становится частью многих и многих проектов, при этом долгое время clang/llvm использовали glibc/libstdc++, но теперь у них появляется автономность от gcc: libc/libc++&lt;br&gt;&lt;br&gt;И дело здесь не в elf&apos;е, который по сути стандарт, поэтому соблюдаемый всеми. Дело в бинарной (возможность динамической линковки) совместимости/несовместимости библиотек, о чем в частности и говорится в нижеследующих постах&lt;br&gt;https://www.opennet.ru/openforum/vsluhforumID9/10333.html#9&lt;br&gt;https://www.opennet.ru/openforum/vsluhforumID9/10333.html#14&lt;br&gt;</description>
</item>

<item>
    <title>Clang vs Gcc: две компиляторных системы в одном дистрибутиве (sidtver)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html#15</link>
    <pubDate>Thu, 08 Oct 2020 19:40:17 GMT</pubDate>
    <description>&amp;gt; Есть binutils-config, который управляет симлинками на используемую системную версию. &lt;br&gt;&amp;gt; Её можно переключать, также как и компилятор по-умолчанию (gcc-config). Но компилятор &lt;br&gt;&amp;gt; и линкер можно задать переменными окружения вроде CC и LD.&lt;br&gt;&lt;br&gt;Чтобы не дублировать, просто сошлюсь на посты #9 и #14, приведенные чуть выше&lt;br&gt;https://www.opennet.ru/openforum/vsluhforumID9/10333.html#9&lt;br&gt;https://www.opennet.ru/openforum/vsluhforumID9/10333.html#14&lt;br&gt;&lt;br&gt;На мой взгляд binutils-config - это про удобство что-то собрать одним компилятором и запустить потом все, собранное одним компилятором. Но исходный вопрос не про это.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Clang vs Gcc: две компиляторных системы в одном дистрибутиве (sidtver)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html#14</link>
    <pubDate>Thu, 08 Oct 2020 19:28:52 GMT</pubDate>
    <description>&amp;gt; Я не говорил, что собирать с одной, а исполнять с другой. Я &lt;br&gt;&amp;gt; хотел сказать, что на этапе сборки можно линковаться с чем угодно &lt;br&gt;&amp;gt; (конечно используя соответствующие хидеры) , и с тем и выполнять.&lt;br&gt;&lt;br&gt;Рассматриваю такую ситуацию&lt;br&gt;  libY уже установлена в дистрибутиве (это какая-нибудь lipthread, libz или что-нибудь еще), пакет с libY уже кто-собрал и он загружен что-то типа &quot;apt install ...&quot;)&lt;br&gt;&lt;br&gt;Затем собирается X, которой требуется libY (и еще cто пятьсот библиотек), но чтобы собрать с помощью clang - это что получается нужно пересобрать эти сто пятьсот библиотек, что не только потребует кучу времени вместо загрузки пакетов, так еще и сама по себе порой нетривиальная задача (много ли разработчиков готовы ковыряться в сборке кучи разных проектов, согласовать версию, продраться через системы сборки, ведь создать дистрибутив насколько понимаю задача очень и очень не простая)?&lt;br&gt;&lt;br&gt;P.S. Иногда приходиться и ковыряться, но именно что иногда. Речь про то, что как штатное решение это не годится.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Clang vs Gcc: две компиляторных системы в одном дистрибутиве (Аноним)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html#13</link>
    <pubDate>Thu, 08 Oct 2020 19:25:20 GMT</pubDate>
    <description>Ещё можно выставить вот эти, но вроде это излишне, и можно спокойно использовать гнутые&lt;br&gt;&lt;br&gt;AR=&quot;llvm-ar&quot;&lt;br&gt;NM=&quot;llvm-nm&quot;&lt;br&gt;RANLIB=&quot;llvm-ranlib&quot;&lt;br&gt;</description>
</item>

<item>
    <title>Clang vs Gcc: две компиляторных системы в одном дистрибутиве (Аноним)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html#12</link>
    <pubDate>Thu, 08 Oct 2020 19:22:59 GMT</pubDate>
    <description>Есть binutils-config, который управляет симлинками на используемую системную версию. Её можно переключать, также как и компилятор по-умолчанию (gcc-config). Но компилятор и линкер можно задать переменными окружения вроде CC и LD.&lt;br&gt;</description>
</item>

<item>
    <title>Clang vs Gcc: две компиляторных системы в одном дистрибутиве (Павел Отредиез)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html#11</link>
    <pubDate>Thu, 08 Oct 2020 19:19:41 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; Запускаем X, работает динамический загрузчик. Далее X использует f1 из libc, libY &lt;br&gt;&amp;gt; использует f1 из glibc. По правилам (текущим) линковки глобальный символ f1 &lt;br&gt;&amp;gt; должен быть взят один раз. И X и libY начнут использовать &lt;br&gt;&amp;gt; f1 из одной библиотеки.&lt;br&gt;&amp;gt; Что касается api и стандарта C/C++.&lt;br&gt;&amp;gt; Есть по стандарту errno. Но в одной библиотеке это переменная (кажется так &lt;br&gt;&amp;gt; было в старых версиях glibc), а в другой - макрос, раскрывающейся &lt;br&gt;&amp;gt; в вызов функции. Соответственно, уже нельзя компилировать с одной C-библиотекой, а &lt;br&gt;&amp;gt; запускать с другой.&lt;br&gt;&amp;gt; Возможно с C-библиотекой ситуация значительно проще. Но есть еще C++-библиотека.&lt;br&gt;&lt;br&gt;Я не говорил, что собирать с одной, а исполнять с другой. Я хотел сказать, что на этапе сборки можно линковаться с чем угодно (конечно используя соответствующие хидеры) , и с тем и выполнять. &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Clang vs Gcc: две компиляторных системы в одном дистрибутиве (sidtver)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html#10</link>
    <pubDate>Thu, 08 Oct 2020 19:14:00 GMT</pubDate>
    <description>&amp;gt; binutils &lt;br&gt;&amp;gt; правда придётся вручную переключать&lt;br&gt;&lt;br&gt;  Если правильно понимаю, то фактически ручное переключение означает, что есть несколько (небольших) кусочков дистрибутива, т.е. библиотеки, собранные разными компиляторными системами. И ручное переключение и требуется для того, чтобы библиотеки при запуске собирались из одного кусочка. Но обычное штатное использование не особо подразумевает ручное управление.&lt;br&gt;  Вот и получается нужна два экземпляра дистрибутива, один собран gcc, другой - clang&apos;ом, и при запуске приложения выбирается один из комплектов в &quot;автоматическом&quot; режиме?&lt;br&gt;</description>
</item>

<item>
    <title>Clang vs Gcc: две компиляторных системы в одном дистрибутиве (sidtver)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html#9</link>
    <pubDate>Thu, 08 Oct 2020 19:07:58 GMT</pubDate>
    <description>&amp;gt; Если две разные реализации libc, то их so должны отличаться в названии, &lt;br&gt;&amp;gt; приложение слинкуется с нужной.&lt;br&gt;&amp;gt; И почему апа под clang libc.so собранная gcc  не будет работать? &lt;br&gt;&amp;gt; Что этому мешает? Тот же эльф, хочешь и линкуйся.&lt;br&gt;&lt;br&gt;(libY собрана gcc и слинкована с glibc)&lt;br&gt;libY -&amp;gt; glibc&lt;br&gt;&lt;br&gt;(X собрана clang&apos;ом и слинкована с libc, кроме того она использует libY)&lt;br&gt;X -&amp;gt; libc&lt;br&gt;  -&amp;gt; libY&lt;br&gt;&lt;br&gt;Запускаем X, работает динамический загрузчик. Далее X использует f1 из libc, libY использует f1 из glibc. По правилам (текущим) линковки глобальный символ f1 должен быть взят один раз. И X и libY начнут использовать f1 из одной библиотеки. &lt;br&gt;&lt;br&gt;Что касается api и стандарта C/C++.&lt;br&gt;Есть по стандарту errno. Но в одной библиотеке это переменная (кажется так было в старых версиях glibc), а в другой - макрос, раскрывающейся в вызов функции. Соответственно, уже нельзя компилировать с одной C-библиотекой, а запускать с другой.&lt;br&gt;&lt;br&gt;Возможно с C-библиотекой ситуация значительно проще. Но есть еще C++-библиотека.&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Clang vs Gcc: две компиляторных системы в одном дистрибутиве (Аноним)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/10333.html#8</link>
    <pubDate>Thu, 08 Oct 2020 16:05:59 GMT</pubDate>
    <description>У меня штук 20 разных компиляторов с разными либами стоит, гента. Можно любой системны пакет собрать произвольным системным компилятором любой версии, binutils правда придётся вручную переключать (зачем использовать не последнюю версию?), переключение шланг/гцц вообще без проблем переменной окружения. Проблем не замечал, но я массово и не собираю шлангом -- он всегда хуже при ближайшем рассмотрении (что-то простое он может соптимизировать лучше). Или собрать какой-нибудь пакет и все зависимости с другой libc или вообще для другой архитектуры. В частности, собираю софт для венды, когда я проверял, он потом работал в 7, 8 и 10 на системной libc (без cygwin).&lt;br&gt;</description>
</item>

</channel>
</rss>
