标签: llvm

  • 编译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。