前提
这两天因为工作需要,要编译一个Debug版本的llvm。这里对编译安装过程进行一个简单的记录,同时也记录下这个过程中遇到的几个问题。
下载源码并编译
有关llvm
编译安装的官方文档在这里。
-
从
git
仓库clone llvm的源码。git clone https://github.com/llvm/llvm-project.git
这样拉取下来的源码肯定是最新的,如果你想安装之前版本的
llvm
,可以先使用git branch
察看都有哪些版本,然后git checkout xxx
切换对应的版本即可。 -
编译。
cd llvm-project/ mkdir build cd build cmake ../llvm -G Ninja -DCMAKE_BUILD_TYPE=Debug -DLLVM_TARGETS_TO_BUILD="RISCV" -DLLVM_USE_LINKER=lld -DCMAKE_INSTALL_PREFIX=/home/wjq/workspace/llvm ninja check-llvm
这里有几点要注意的:
- 使用了
Ninja
构建系统,这比使用make
要快一点。 -DCMAKE_BUILD_TYPE=Debug
:编译类型是Debug
。DLLVM_TARGETS_TO_BUILD="RISCV"
:目标平台是RISCV
。- 使用
lld
来加快链接速度。 - 安装
llvm
时的根目录是/home/wjq/workspace/llvm
。 - 没有添加任何的子项目,因此只会编译
llvm
。 - 没有使用官网上的
-S llvm
的方式,而是使用了../llvm
,使用第一种方式的话如果编译失败的话会在llvm-project/
目录下产生很多中间文件,第二种就算失败了也只是在llvm-project/build/
目录下,不会影响源码。 - 想要了解更多有关
cmake
的先项,请看官网这里。
- 使用了
-
安装。
如果上面的步骤都没有问题的话,接下来就可以安装了。ninja install
这会将编译出的
llvm
安装到/home/wjq/workspace/llvm
目录下。一共有四个文件夹:bin
,include
,lib
,share
。 -
将
llvm
添加到环境变量。
使用vim ~/.bashrc
打开~/.bashrc
,然后添加export PATH=/home/wjq/workspace/llvm/bin:$PATH
,保存退出然后重新source ~/.bashrc
即可。
如果想为所用用户添加llvm
的话,就在/etc/profile
文件中添加。 -
察看环境变量是否添加成功
在终端输入llvm-as --version
,若输出llvm
的版本则代表安装成功。
以上就是llvm
编译安装的所有步骤。
一些可能出现的Bug
git clone
速度慢
解决方案:如果你使用的是代理的话,请打开TNU模式。这会代理所有的应用,包括WSL2中的网络。
编译中途卡死
现象:如果你编译过程中的link
阶段总是无源无故卡死。
原因:我当时安装了starship
这个bash美化工具,编译时间太长就会卡死没有反应。
解决方案:我是直接卸载了这个工具。
collect2: fatal error: ld terminated with signal 9 [Killed]
原因:如果在link
阶段出现这个错误,则很有可能是内存不够用。
解决方案:设置-DLLVM_PARALLEL_LINK_JOBS=1
来控制链接的并行度,然后重新cmake
即可。
g++: internal compiler error: Killed (program cc1plus)
原因:如果出现这个问题的话,可能是因为交换区太小了。
解决方案:扩大交换区,如下:
为了更方便,可以将第一行代码更换为sudo dd if=/dev/zero of=/swapfile bs=1024 count=50000000
,意思是将swap交换区扩大到50G。可以使用free -m
察看交换区大小。
参考链接
- https://zhuanlan.zhihu.com/p/431519638
- https://stackoverflow.com/questions/30887143/make-j-8-g-internal-compiler-error-killed-program-cc1plus
- https://blog.csdn.net/weixin_43669978/article/details/132480778