Первая попытка компиляции простейшего приложения:
Код: Выделить всё
#include <cstdlib>
#include <iostream>
using namespace std;
int main ( int argc, char **argv ) {
std::cout << "Hello Clang!" << endl;
exit( EXIT_SUCCESS );
}
Завершается с серьёзной ошибкой
компиляции:
Код: Выделить всё
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); }
^
/usr/bin/../lib/gcc/i686-redhat-linux/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h:52:38: error: use of undeclared
identifier '__ATOMIC_ACQ_REL'
{ __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
1. Понятно, что это где-то в заголовочных файлах CGG C++ (которые используются для сборки).
2. Происходит это в инсталляции Fedora 17 (из репозитария), с набором инструментов (и определений, библиотек):
Код: Выделить всё
bash-4.2$ clang --version
clang version 3.0 (tags/RELEASE_30/final)
Target: i386-redhat-linux-gnu
Thread model: posix
Код: Выделить всё
bash-4.2$ gcc --version
gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)
Copyright (C) 2012 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.
3. Такая же ошибка
неоднократно цитируется в Интернет (находится, главным образом, в англоязычной части, в сообщениях типа "караул"

).
Это явно
накладка версий ... Смотрим в atomicity.h ... Исправляется определением в
своих .cc файлах:
Код: Выделить всё
#include <cstdlib>
#undef _GLIBCXX_ATOMIC_BUILTINS
#include <iostream>
Почему это так я не знаю ... но это работает!
(вот так просто ларчик открывался ... но крови он попил

)
Прилагается простейший проект, содержащий сборку "приложений" а). на классическом C, б). на C++.
Код: Выделить всё
bash-4.2$ make
clang -xc hello.c -o helloc
clang++ -xc++ hello.cc -o hellocc
bash-4.2$ ./helloc
Hello Clang!
bash-4.2$ ./hellocc
Hello Clang!