переход с GCC на Clang (вопросы совместимости)

Модератор: Модераторы разделов

Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

переход с GCC на Clang

Сообщение Olej »

См. детали Clang :

- при компиляции приложений С++, нормально компилирующихся GCC, компилятором Clang ...

Код: Выделить всё

bash-4.2$ gcc --version
gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)
Copyright (C) 2012 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.

bash-4.2$ clang --version
clang version 3.0 (tags/RELEASE_30/final)
Target: i386-redhat-linux-gnu
Thread model: posix


- вылазят очень странные ошибки, типа:

Код: Выделить всё

bash-4.2$ make
clang++ -xc++ hello.cc -o hellocc
In file included from hello.cc:1:
In file included from /usr/bin/../lib/gcc/i686-redhat-linux/4.7.2/../../../../include/c++/4.7.2/ostream:39:
In file included from /usr/bin/../lib/gcc/i686-redhat-linux/4.7.2/../../../../include/c++/4.7.2/ios:42:
In file included from /usr/bin/../lib/gcc/i686-redhat-linux/4.7.2/../../../../include/c++/4.7.2/bits/ios_base.h:40:
/usr/bin/../lib/gcc/i686-redhat-linux/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h:48:45: error: use of undeclared
      identifier '__ATOMIC_ACQ_REL'
  { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }


- такие сообщения довольно много обсуждаются на англоязычных блогах ... на русских не встречал...

- понятно, что это ругань на заголовочные файлы GCC, и относятся они к <iostream> ...

- если записать начальные include как-то так:

Код: Выделить всё

#include <cstdlib>
#undef _GLIBCXX_ATOMIC_BUILTINS
#include <iostream>


- то ошибки прекращаются и сборка идёт до конца.

Что это? как это понимать? (эффект конкретных версий GCC & Clang)

Поскольку Clang всё-равно заменит GCC повсеместно, рано или поздно, предлагаю сюда скидывать вопросы по несовместимости проектов GCC & Clang, которые у кого будут наблюдаться.
Нужно готовиться загодя :rolleyes:
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: переход с GCC на Clang

Сообщение NickLion »

clang 3.2 — нет никаких проблем.

Судя по логам clang немного неправильно понял заголовочные файлы GCC. Возможно потому, что atomic operations были добавлены в 3.1.
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: переход с GCC на Clang

Сообщение Olej »

NickLion писал(а):
31.03.2013 17:30
clang 3.2 — нет никаких проблем.


А откуда 3.2? - ставился из исходников?


Вопрос №2

Clang может линковаться а). со стандартной библиотекой из GCC (опция -stdlib=libstdc++) и б). с новой библиотекой C++ (опция -stdlib=libc++), которая делается в составе проекта Clang, и утверждается, что она лучше (чем GCC) уже на сейчас, а дальше будет всё лучше и лучше...

Но компиляция с libc++ сразу прерывается по включаемым файлам:

Код: Выделить всё

bash-4.2$ make
clang++ -xc++  -stdlib=libc++ hello.cc -o hellocc
hello.cc:1:10: fatal error: 'cstdlib' file not found
#include <cstdlib>


Можно детальнее посмотреть вывод диагностики Clang по опции -v, и найти чего ему не хватает (каких include) ... например так:

Код: Выделить всё

bash-4.2$ make
clang++ -xc++  -stdlib=libc++ -I /usr/include/c++/4.7.2 -I /usr/include/c++/4.7.2/i686-redhat-linux hello.cc -o hellocc
/usr/bin/ld: cannot find -lc++
clang: error: linker command failed with exit code 1 (use -v to see invocation)


После чего детализация (-v) покажет:

Код: Выделить всё

bash-4.2$ make
clang++ -xc++ -v -stdlib=libc++ -I /usr/include/c++/4.7.2 -I /usr/include/c++/4.7.2/i686-redhat-linux hello.cc -o hellocc
...
/usr/bin/ld: cannot find -lc++
...

Но это и есть libc++.so !
Этой библиотеки у меня в RFR 17 явно нет... (оттуда и проблемы с -I ...) ... или она не установлена (в качестве пакета).

В Debian (который, вроде бы как :rolleyes: , всегда сильно отстаёт по срокам от Fedora) для использования libc++ устанавливают дополнительные пакеты :
Available in Debian Experimental, this new packages provides both the runtime libraries (libc++abi1) and the C++ headers (libc++-dev).

(там же показаны примеры использования ... полезная заметка )

Почему нет библиотеки в Fedora 17 после установки Clang?
Что нужно дополнительно доустановить?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: переход с GCC на Clang

Сообщение NickLion »

Olej писал(а):
02.04.2013 15:23
А откуда 3.2? - ставился из исходников?

Стандартный в openSUSE 12.3.

Olej писал(а):
02.04.2013 15:23
Вопрос №2

Что нужно установить в Fedora — не подскажу. Но в принципе, нужны заголовочные файлы и библиотеки clang'а, а не gcc. Тогда не нужно лишних опций -I — это совсем неверно (никто не гарантирует эквивалентность реализации, допустим, std::string в gcc и clang версиях).
И не забывайте, что при линковке с libc++, невозможно использовать C++ интерфейс для взаимодействия с программами и библиотеками, которые используют libstdc++.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: переход с GCC на Clang

Сообщение NickLion »

Зашёл на сайт clang, собственно там и подтверждение:
ABI compatibility with gcc's libstdc++ for some low-level features such as exception objects, rtti and memory allocation.

Т.е. гарантируют только совместимость этих объектов. А остальные — лучше не рассчитывать.

UPD: их же результаты тестирования этой библиотеки для Linux пока совсем не утешительные.
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: переход с GCC на Clang

Сообщение Olej »

NickLion писал(а):
02.04.2013 18:28
Что нужно установить в Fedora — не подскажу. Но в принципе, нужны заголовочные файлы и библиотеки clang'а, а не gcc. Тогда не нужно лишних опций -I — это совсем неверно (никто не гарантирует эквивалентность реализации, допустим, std::string в gcc и clang версиях).

Это то всё понятно:
- заголовочные файлы и библиотеки clang'а ... а если быть совсем точным - заголовочные файлы библиотеки libc++ (у самого clang'а нет пользовательских заголовочных файлов, у него есть только заголовочные файлы собственного синтаксического парсера в /usr/include/clang/*)
- но эти заголовочные файлы библиотеки libc++ ставятся вместе с самой библиотекой libc++
- а пакета RPM библиотеки libc++ - нет (это совершенно отдельный, автономный проект от LLVM и Clang)
- после установки библиотеки libc++ и не нужно никаких опций -I

Что-то мне подсказывает :rolleyes:, что целесообразно снести нафиг все RPM-ы для LLVM & Clang + установить из исходников LLVM & Clang & libc++.
Уж больно это стремительно развивающийся проект LLVM, чтобы пользоваться устаревающими реализациями от майнтейнеров.
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: переход с GCC на Clang

Сообщение Olej »

Olej писал(а):
02.04.2013 18:53
Уж больно это стремительно развивающийся проект LLVM, чтобы пользоваться устаревающими реализациями от майнтейнеров.


Всё, что касается Clang - очень интересно.
Это один из радикальных "переломов тенденций" в IT технологиях ... таких, как за последнее время стали:
- Android;
- UEFI загрузка;
- GPT диски взамен MBR;
... теперь вот:
- Clang взамен GCC :laugh:

Это те вещи, которые в считанные месяцы изменят облик IT индустрии.
Только все эти вещи не очень сильно на сегодня занимают рядового пользователя ... известное дело: "пока гром не грянет - мужик не перекрестится". :rolleyes:

Всё, что касаемо Clang - очень интересно.

Я не все вопросы и не все соображения по Clang выписываю здесь, кому будет интересно, может посмотреть ещё и вот здесь: что-то здесь - что-то там...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: переход с GCC на Clang

Сообщение NickLion »

Olej писал(а):
02.04.2013 18:53
Уж больно это стремительно развивающийся проект LLVM, чтобы пользоваться устаревающими реализациями от майнтейнеров.

Ну, в openSUSE есть devel (тут clang обитает) репозиторий, где стараются обновлять до последних версий.
А по теме, пока не думаю, что стоит морочить голову со сборкой, раз даже у разработчиков проблема со сравнением строк в libc++ при кодировке отличной от C (даже en!).

UPD OBS позволяет создавать репозитории не только для openSUSE, а в том числе и для Fedora. Можете попробовать взять пакет llvm, скопировать его в домашний репозиторий и настроить билд для Fedora. Я так yasm последний для RHEL собирал.
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: переход с GCC на Clang

Сообщение Olej »

NickLion писал(а):
02.04.2013 19:36
Ну, в openSUSE есть devel (тут clang обитает) репозиторий, где стараются обновлять до последних версий.
А по теме, пока не думаю, что стоит морочить голову со сборкой, раз даже у разработчиков проблема со сравнением строк в libc++ при кодировке отличной от C (даже en!).


Легко собрал LLVM+Clang 3.2 + так же легко собирается LLVM+Clang из SVN проекта - то, что есть релиз-кандидат 3.3.

Проверяю собранное (C и C++ код):

Код: Выделить всё

bash-4.2$ clang -xc  hello.c -o helloc
bash-4.2$ clang++ -xc++   hello.cc -o hellocc

Это сборка с закомментаренным:

Код: Выделить всё

#include <cstdlib>
//#undef _GLIBCXX_ATOMIC_BUILTINS
#include <iostream>

т.е. 1-й вопрос- снимается.
Но это сборка с библиотекой libstdc++ (GCC).

Но libc++ собрать не получается ... и ошибка там их, внутренняя, в коде:

Код: Выделить всё

bash-4.2$ time make
[  4%] Building CXX object lib/CMakeFiles/cxx.dir/__/src/memory.cpp.o
In file included from /home/olej/Загрузки/LLVM/libcxx/include/memory:588:0,
                 from /home/olej/Загрузки/LLVM/libcxx/src/memory.cpp:11:
/home/olej/Загрузки/LLVM/libcxx/include/__config:147:22: ошибка: отсутствует двоичный оператор перед токеном «(»
make[2]: *** [lib/CMakeFiles/cxx.dir/__/src/memory.cpp.o] Ошибка 1
make[1]: *** [lib/CMakeFiles/cxx.dir/all] Ошибка 2
make: *** [all] Ошибка 2

real    0m2.217s
user    0m0.354s
sys     0m0.111s

Но на их странице проекта libc++ (ссылка выше) пишется так:
Platform Support
libc++ is known to work on the following platforms, using g++-4.2 and clang (lack of C++11 language support disables some functionality).
Mac OS X i386
Mac OS X x86_64


NickLion, вы уверены, что в вашей инсталляции есть библиотека именно libc++ ?
что проходит сборка именно вот с такой строкой сборки?:

Код: Выделить всё

bash-4.2$ clang++ -xc++  -stdlib=libc++ hello.cc -o hellocc

покажите...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: переход с GCC на Clang

Сообщение NickLion »

Olej писал(а):
03.04.2013 20:56
Но на их странице проекта libc++ (ссылка выше) пишется так:
Platform Support
libc++ is known to work on the following platforms, using g++-4.2 and clang (lack of C++11 language support disables some functionality).
Mac OS X i386
Mac OS X x86_64


Ну да, пока поддержка только макоси, а linux официально не готов.

Olej писал(а):
03.04.2013 20:56
NickLion, вы уверены, что в вашей инсталляции есть библиотека именно libc++ ?

Нет, библиотека libc++ в opensuse отсутствует. На сайте llvm упоминается, что они тестируют на Debian.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: переход с GCC на Clang

Сообщение NickLion »

Кстати, скачал исходники, скомпилировались без проблем. Вы ошиблись в том, что пытались собрать при помощи GCC. Там код со спецификой clang.

Код: Выделить всё

svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
cd libcxx
mkdir build
cd build
CC=clang CXX=clang++ cmake ..
make
Спасибо сказали:
Аватара пользователя
Olej
Сообщения: 659
ОС: Fedora, Mint, Debian, QNX

Re: переход с GCC на Clang

Сообщение Olej »

NickLion писал(а):
03.04.2013 22:29
Кстати, скачал исходники, скомпилировались без проблем. Вы ошиблись в том, что пытались собрать при помощи GCC. Там код со спецификой clang.

Код: Выделить всё

svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
cd libcxx
mkdir build
cd build
CC=clang CXX=clang++ cmake ..
make


Собрал:

Код: Выделить всё

bash-4.2$ make
clang++ -xc++  -stdlib=libc++ hello.cc -o hellocc
bash-4.2$ ldd hellocc
        linux-gate.so.1 =>  (0xb7731000)
        libc++.so.1 => /lib/libc++.so.1 (0xb7655000)
        libm.so.6 => /lib/libm.so.6 (0x43d4d000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x44f67000)
        libc.so.6 => /lib/libc.so.6 (0x41fb2000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x42162000)
        /lib/ld-linux.so.2 (0x41f8f000)
        librt.so.1 => /lib/librt.so.1 (0x42185000)

Спасибо сказали: