【问题标题】:Manually-Built GCC and Clang; Clang looks at System C++ Paths, not My GCC's手动构建的 GCC 和 Clang; Clang 查看系统 C++ 路径,而不是我的 GCC 的
【发布时间】:2018-11-03 18:10:00
【问题描述】:

问题

我如何使 [我的自定义安装] 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 &lt;mutex&gt; 会产生此错误:

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 安装的一部分。

其他说明

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

【问题讨论】:

  • 在构建 Clang 之前尝试设置 C_INCLUDE_DIRS CMake 变量?
  • 理论上这会影响构建Clang 本身,而不是生成的Clang 寻找库的地方;对吗?
  • 该选项的文档显示Colon separated list of directories clang will search for headers。如果是关于CMAKE_C_COMPILER,我怀疑它会被称为Clang,因为它也可以使用GCC编译。
  • 我没有注意到这一点。之后,我在config.h 文件中找到了GCC_INSTALL_PREFIX,当我正确设置它时它开始工作。如果您想将其发布为答案,我会接受 - 如果您没有提到这一点,我就不会找到它。 -- cmake ... -DGCC_INSTALL_PREFIX=/path/to/gcc/install/prefix/ 其中前缀有通常的binlibinclude
  • 好吧,如果CMAKE_C_COMPILER 没有帮助你应该自己发布答案并接受它。

标签: gcc clang gnu-toolchain


【解决方案1】:

原来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 以查看正确的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2011-09-13
    • 2015-02-03
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多