手动构建的GCC和Clang;Clang 查看系统 C++ 路径,而不是我的 GCC 路径

iAd*_*nct 1 gcc clang gnu-toolchain

问题

如何让[我的自定义安装] 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

gcc 的(及其所有依赖项)bin 目录被添加到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,尽管我不应该这样做,因为其他一些答案说他们通过这样做修复了它,我想也许发生了一些奇怪的事情,但这并没有解决它。

问题

如果我编译这个测试文件:

#include <atomic>

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

我得到这个结果:

[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.
Run Code Online (Sandbox Code Playgroud)

在其他一些代码中,我有更长的包含路径,可以产生有关问题的更多信息。其中之一#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; }
Run Code Online (Sandbox Code Playgroud)

这清楚地表明它将进入内置标头,而不是[我已验证]属于 gcc 8.1.0 安装一部分的标头。

其他注意事项

我看到有一个--gnu-toolchain选项configure(截至 2012 年),但在当前版本中似乎不存在。我相信我在运行时看到了相同的选项,但要求用户这样做(当他们已经采购了一些东西来替换整个编译器系统时)并不是一个可接受的解决方案。

iAd*_*nct 5

结果发现该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 ...

然后,这会设置 clang 在构建后查找正确的位置。