【发布时间】: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 <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 安装的一部分。
其他说明
我看到configure 上有一个--gnu-toolchain 选项(截至 2012 年),但它似乎在当前版本中不存在。我相信我在运行时看到了相同的选项,但要求用户这样做(当他们已经采购了一些东西来替换他们的整个编译器系统时)不是一个可接受的解决方案。
【问题讨论】:
-
在构建 Clang 之前尝试设置
C_INCLUDE_DIRSCMake 变量? -
理论上这会影响构建
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/其中前缀有通常的bin、lib、include等 -
好吧,如果
CMAKE_C_COMPILER没有帮助你应该自己发布答案并接受它。
标签: gcc clang gnu-toolchain