【发布时间】:2018-12-17 09:35:21
【问题描述】:
我在我的 conda 环境中安装了 clang 和 gcc。他们的版本是
gcc 7.2.0
clang 7.0.0
libcxx 7.0.0
然后我创建了一个hello world src 文件a.cpp
-
如果我使用
clang++ a.cpp编译文件。错误读取a.cpp:1:10: fatal error: 'iostream' file not found #include <iostream> ^~~~~~~~~~ 1 error generated. 使用
clang++ a.cpp --stdlib=libstdc++,报错是一样的-
使用
clang++ a.cpp --stdlib=libc++,错误变为~/conda/envs/test/bin/ld: cannot find crtbegin.o: No such file or directory ~/conda/envs/test/bin/ld: cannot find -lgcc clang-7: error: linker command failed with exit code 1 (use -v to see invocation) -
使用
clang++ a.cpp -I$HOME/conda/envs/test/include/c++/7.2.0In file included from a.cpp:1: /site/home/shliu/conda/envs/test/include/c++/7.2.0/iostream:38:10: fatal error: 'bits/c++config.h' file not found #include <bits/c++config.h> ^~~~~~~~~~~~~~~~~~ 1 error generated.
我使用共享计算机,因此无法安装系统范围的编译器和头文件。
问题:
- 我应该怎么做才能让它工作?
- 如果
clang没有自带头文件,我需要使用gcc提供的,我应该考虑clang version和gcc version的兼容性吗? - 是否需要在同一个 conda 环境中安装
libc++才能使用clang++?
经过一些测试,我找到了在 conda 中执行此操作的方法,并将其作为答案发布。但是,我仍然不明白clang 是如何工作的,尤其是它与gcc 的关系。如果有人能回答,我将不胜感激(我会接受作为这篇文章的答案):
-
clang是否会将所有作业转发给gcc,所以我们总是需要安装gcc工具链才能使用clang? - 我找到了
clang的包含文件夹,即$HOME/conda/envs/test/include/c++/v1以及来自gcc的$HOME/conda/envs/test/include/c++/7.2.0。但是如果--gcc-toolchain已经指定了,v1文件夹就不会搜索headers了,(从输出中可以看出-v到编译器。那么v1包含文件有什么用?
【问题讨论】:
-
你也安装了 libc++ 吗?如果你告诉 clang 使用它,那么是的,你需要安装它!
-
bits/c++config.h是 libstdc++ 的一个实现细节,不要指望在 libc++ 中有它! -
使用 conda 我没有找到 libc++。但我尝试了
libcxx并没有改变结果 -
相同。 libc++ 和 libcxx 是 clang 可以使用的同一个后端。如果 conda 没有提供它,那么坚持使用 libstdc++。
-
然后我安装了它,我得到了同样的错误。如何“坚持使用 libstdc++”?