跳至正文

编译clang搞清楚的一些概念(gcc, llvm, clang, libc++, libstdc++)

  • 技术

clang++/llvm

因为开发机的gcc版本太低了,就重新编译了一个clang,大概了解了一下这些底层工具的概念。

clang++和clang都是llvm的一部分,而llvm是一个庞大的、模块化编译器的项目,clang++只是基于llvm的编译器前端。

所以对于一个C++编译过程,从.cpp生成.o,在llvm的这个项目下的流程是:

  1. clang++对源代码进行词法分析,转化成抽象的AST树;
  2. clang++再将AST转化成中间表示(IR)
  3. 生成IR之后,llvm编译框架对这个中间进行优化;
  4. 接着llvm的后端再将编译后的IR转化成目标机器代码,并生成目标文件(.o)

所以我们想编译一个完整的clang++,是在llvm项目,因为clang++依赖llvm作为后端,而clang++只是llvm的一种前端。

libc++

这个是clang实现的一版C++标准,不同于gnu gcc的实现。
再编译了之后,我发现还是无法编译C++20的内容,提示找不到<coroutine>,那很自然是库的问题,我们可以在llvm的官网看到项目包含的子项目:
https://llvm.org/
除了clang,还有libc++, libc++ABI和libc。

我重新编译了之后还是有问题,最终是在加了参数-stdlib=libc++之后才能正常编译,并且编译成功之后还是没办法正常的运行,我手动把/usr/local/lib/x86_64-unknown-linux-gnu/目录下的libc++.so.1用软连接放到/usr/lib下才全部搞定。

标准库的实现

这里我才知道,原来编译器和标准库是拆开的,编译器是clang,标准库可以用gnu gcc的,也可以用clang自己的libc++,这里列一下C++的标准实现:

  • libstdc++: GNU Compiler Collection (GCC) 提供的;
  • libc++: clang++提供的;
  • Microsoft C++ Standard Library (MSVC STL): 微软vs使用的
  • Dinkumware C++: 常用语嵌入式系统以及商业编译器中。

参考

https://developer.huawei.com/consumer/cn/forum/topic/41600287
https://libcxx.llvm.org/
https://llvm.org/
https://llvm.org/docs/CMake.html

End。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

目录