编译llvm源码

起因


最近几天因为公司服务器的libstdc++.so版本太低,导致我想用clangd进行代码不全的时候没法运行,因为官网上的clangd 14二进制包需要glibc2.28的东西,所以索性就自己用llvm的源码编译clangd和配套的东西,基本上花了一个多星期,主要事件就在等编译了,中间遇到了一些很坑的地方,记录下方便别人躲坑。
llvm cmake编译官网链接

编译llvm的基本流程

mkdir ~/llvm-release

1.下载llvm的源代码

git clone https://gitee.com/mirrors/LLVM.git LLVM

2.编译一个第一阶段的 clang 什么是第一阶段的clang

cd LLVM
mkdir clang-1ststage-build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_LLVM_DYLIB=TRUE -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -S llvm -B clang-1ststage-build
cd clang-1ststage-build
make -j
CMAKE_BUILD_TYPE 设置编译类型,一般选Release 就行
LLVM_TARGETS_TO_BUILD 编译器支持的架构平台,这里我只配置了x86
----
LLVM_BUILD_LLVM_DYLIB 设置是否使用llvm的动态库,强烈建议打开,不然编译出来的第一阶段的二进制超级大,而且运行起来十分慢
----
LLVM_ENABLE_PROJECTS 要编译的二进制


----
3.编译libcxx
上面的编译完以后就有了一个可用的clang二进制,然后我想编译c++库,让clang通过使用libc++来支持高版本的c++

回到llvm源码根目录
```bash
mkdir libcxx-build
cmake -DCMAKE_INSTALL_PREFIX=~/llvm-release -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_LLVM_DYLIB=TRUE -DLLVM_ENABLE_RUNTIMES="libc;libcxx;libcxxabi" -S runtimes -B libcxx-build
make -j
make install

4.编译第二阶段的clang
回到llvm源码根目录

export LD_LIBRARY_PATH=~/llvm-release/lib
mkdir clang-2ndstage-build
cmake -DCMAKE_BUILD_TYPE=Release  -DLLVM_TARGETS_TO_BUILD=X86  -DLLVM_BUILD_LLVM_DYLIB=TRUE -DLLVM_ENABLE_LIBCXX=TRUE  -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -S llvm -B clang-2ndstage-build
cd clang-2ndstage-build
make -j
make install

说明

编译编译器的几个阶段

1.阶段1
阶段1编译出来的编译器主要是提供一个基本的编译功能,这个编译器依赖的一些动态库还是来自于你编译阶段编译器所用到的本机编译器,因为跟你本机的编译器相关,所以这个阶段编译出来的编译器二进制可能执行效率不是很好。同时因为依赖本机编译器支持的语言标准版本,如果你不去编译llvm的libcxx的话,但是你的代码使用的语言版本过高,这个阶段的编译器也是没办法编译的。同时因为这个编译器是从llvm源码编译的,所以在生成二进制方面可能会比你本机的老版本编译器好点。
2.阶段2
阶段2的编译器是使用阶段1的编译器编译出来的,阶段1的编译器二进制生成以后,用这个二进制去再次编译llvm,就会得到干净的,只依赖llvm库的编译器,跟本机的那个编译器已经没有关系了。

posted on 2022-04-18 01:42  lsyb  阅读(467)  评论(0编辑  收藏  举报

导航