为什么clang选择gcc安装?

时间:2014-06-22 07:38:17

标签: gcc clang

命令“clang -v”打印:

$ clang -v
clang version 3.4 (tags/RELEASE_34/final)
Target: i386-redhat-linux-gnu
Thread model: posix
Found candidate GCC installation: /usr/bin/../lib/gcc/i686-redhat-linux/4.8.2
Found candidate GCC installation: /usr/lib/gcc/i686-redhat-linux/4.8.2
Selected GCC installation: /usr/bin/../lib/gcc/i686-redhat-linux/4.8.2

“clang选择gcc installatiom”是什么意思?为什么? Clang是否独立于gcc?
谢谢你的帮助。

编辑:
我在页面上找到了一个可能的一般答案(我使用Fedora 20)     https://bbs.archlinux.org/viewtopic.php?id=129760

1 个答案:

答案 0 :(得分:4)

Clang使用主机编译器的几个设置,如果对于这个主机,还有其他默认编译器(在Apple的OSX / macOS和variants of FreeBSD上默认为clang)。获得与其他二进制文件和操作系统库的更多兼容性非常有用。

它经常使用主机binutils(用于链接器和汇编器),用于crt文件和内部编译器头的主机编译器以及用于C ++程序/库中ABI兼容性的c ++库。

工具链选择是clang驱动程序(clang命令)的一部分,在https://github.com/llvm-mirror/clang/blob/master/lib/Driver/ToolChains.cpp文件中实现。

Clang的“Driver Design& Internals”中有一些文档 http://clang.llvm.org/docs/DriverInternals.html

  

工具链

     

gcc驱动程序没有直接了解工具链。每个gcc二进制文件大致对应于嵌入在单个ToolChain中的信息。

     

clang驱动程序旨在可移植并支持复杂的编译环境。所有平台和工具链特定代码都应该受到抽象或定义良好的接口(例如平台是否支持用作驱动程序驱动程序)的保护。

     

Bind:Tool&文件名选择。    从概念上讲,驱动程序执行自顶向下匹配以将操作分配给工具。 ToolChain负责选择执行特定操作的工具;选择后,驱动程序会与工具进行交互,以查看它是否可以匹配其他操作(例如,通过集成预处理器)。

     

驱动程序与ToolChain交互以执行工具绑定。每个ToolChain都包含有关特定体系结构,平台和操作系统的编译所需的所有工具的信息。单个驱动程序调用可以在一次编译期间查询多个ToolChains,以便与用于单独体系结构的工具进行交互。

     

此阶段的结果不是直接计算的,但驱动程序可以通过-ccc-print-bindings选项打印结果。例如:

$ clang -ccc-print-bindings -arch i386 -arch ppc t0.c
# "i386-apple-darwin9" - "clang", inputs: ["t0.c"], output: "/tmp/cc-Sn4RKF.s"
# "i386-apple-darwin9" - "darwin::Assemble", inputs: ["/tmp/cc-Sn4RKF.s"], output: "/tmp/cc-gvSnbS.o"
# "i386-apple-darwin9" - "darwin::Link", inputs: ["/tmp/cc-gvSnbS.o"], output: "/tmp/cc-jgHQxi.out"
# "ppc-apple-darwin9" - "gcc::Compile", inputs: ["t0.c"], output: "/tmp/cc-Q0bTox.s"
# "ppc-apple-darwin9" - "gcc::Assemble", inputs: ["/tmp/cc-Q0bTox.s"], output: "/tmp/cc-WCdicw.o"
# "ppc-apple-darwin9" - "gcc::Link", inputs: ["/tmp/cc-WCdicw.o"], output: "/tmp/cc-HHBEBh.out"
# "i386-apple-darwin9" - "darwin::Lipo", inputs: ["/tmp/cc-jgHQxi.out", "/tmp/cc-HHBEBh.out"], output: "a.out"
     

显示已为此编译序列绑定的工具链,工具,输入和输出。这里使用clang来编译i386架构上的t0.c,并且使用darwin特定版本的工具来组合和链接结果,但是这些工具的通用gcc版本正在PowerPC上使用。