clang++/llvm
因为开发机的gcc版本太低了,就重新编译了一个clang,大概了解了一下这些底层工具的概念。
clang++和clang都是llvm的一部分,而llvm是一个庞大的、模块化编译器的项目,clang++只是基于llvm的编译器前端。
所以对于一个C++编译过程,从.cpp生成.o,在llvm的这个项目下的流程是:
- clang++对源代码进行词法分析,转化成抽象的AST树;
- clang++再将AST转化成中间表示(IR)
- 生成IR之后,llvm编译框架对这个中间进行优化;
- 接着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。