GCC и Clang, построенные вручную;Clang смотрит на пути System C ++, а не на мой GCC - PullRequest
0 голосов
/ 24 мая 2018

Вопрос

Как сделать так, чтобы [моя пользовательская установка] clang смотрела в нужное место для заголовков C ++ (т.е. моя пользовательская установка gcc)?

Система

В настоящее время я работаю на компьютере RHEL 6 со всеми библиотеками по умолчанию.

В несистемном каталоге я [успешно]скомпилированные mpc, mpfr, gmp, cmake, python, gcc (4.9.3 и 8.1.0) и clang (5.0.0 с использованием gcc 4.9.3 и 6.0.0 с использованием gcc 8.1.0).

gcc был сконфигурирован с --prefix=... --with-gmp=... --with-mpfr=... --with-mpc=... --disable-multilib

bin каталоги gcc (и все его зависимости) были добавлены в PATH, его каталоги lib / lib64 добавлены в LD_LIBRARY_PATH, а CC / CXX установлен в [my] gcc / g ++ соответственно.

Тогда clang был настроен на cmake ../llvm -DCMAKE_INSTALL_PREFIX=... -DCMAKE_BUILD_TYPE=Release -DLLDB_DISABLE_LIBEDIT=True -DCMAKE_C_COMPILER=${CC} -DCMAKE_CXX_COMPILER=${CXX}.Обратите внимание, что я установил CMAKE_C_COMPILER / CMAKE_CXX_COMPILER, хотя мне и не нужно было этого делать, потому что какой-то другой SO-ответ сказал, что они это исправили, и я подумал, что, может быть, происходит что-то странное, но это не исправило.

Проблема

Если я скомпилирую этот тестовый файл:

#include <atomic>

int main ( int , char const** )
{
    std::atomic<int> i (0) ;
    i.fetch_add ( 2 ) ;
    return 0 ;
}

Я получу такой результат:

[redacted]~/Temporary% g++ -std=c++11 main.cpp
[redacted]~/Temporary% clang++ -std=c++11 main.cpp
main.cpp:2:10: fatal error: 'atomic' file not found
#include <atomic>
         ^~~~~~~~
1 error generated.

В некотором другом кодеЯ больше включаю пути, которые дают больше информации о проблеме.Один из них #include <mutex>, который выдает эту ошибку:

In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/mutex:45:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/system_error:163:28: error: incompatible operand types ('void (*)()' and 'bool')
    { return _M_value != 0 ? &__not_bool_type : false; }

, который ясно показывает, что он идет на встроенные заголовки, а не те, которые [я проверял], являются частью установки gcc 8.1.0.

Другие заметки

Я видел, что есть опция --gnu-toolchain для configure (по состоянию на 2012 г.), но она, кажется, отсутствует втекущие версии.Я полагаю, что видел такую ​​же опцию во время выполнения, но требование к пользователям (когда они уже что-то поставили для замены всей своей системы компилятора) не является приемлемым решением.

1 Ответ

0 голосов
/ 25 мая 2018

Оказывается, необходимо обновить файл clang/Config/config.h, который автоматически генерируется процессом cmake.

В частности, необходимо установить GCC_INSTALL_PREFIX.

Если вы настроилиВаш gcc устанавливается как ../gcc/configure --prefix=/path/to/my/gcc ..., тогда вы должны сделать cmake ../llvm -DGCC_INSTALL_PREFIX=/path/to/my/gcc ...

. Затем он установит лязг, чтобы он смотрел в правильном месте после его сборки.

...