首页 > 解决方案 > 手动构建的 GCC 和 Clang;Clang 查看系统 C++ 路径,而不是我的 GCC 的

问题描述

问题

我如何让 [我的自定义安装] 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 ,即使我不应该这样做,因为其他一些 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 安装的一部分。

其他注意事项

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

标签: gccclanggnu-toolchain

解决方案


原来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 ...

然后,这会在它建成后发出叮当声以寻找正确的位置。


推荐阅读