LLVM 编译安装
- 克隆代码到本地
git clone https://github.com/llvm/llvm-project.git
# 需要时间比较长 如果不需要做额外的操作可以只克隆最新的commit
git clone --depth 1 https://github.com/llvm/llvm-project.git
- 配置编译选项
cd llvm-project
cmake -S llvm -B build -G <generator> [options]
generator一般使用Ninja,而 options 中必须要传入的参数是构建类型CMAKE_BUILD_TYPE
不同的CMAKE_BUILD_TYPE区别如下:
Build Type | Optimization | Debug Info | Assertion |
---|---|---|---|
Release | For Speed | No | No |
Debug | None | Yes | Yes |
RelWithDebInfo | For Speed | Yes | No |
MinSizeRel | For Size | No | No |
- Release适合LLVM和Clang的用户,针对运行速度进行了优化,基本没有任何调试信息和断言信息。
- Debug适合LLVM的开发者,输出的信息最丰富,但没有进行任何方面的优化。
- RelWithDebInfo适合有部分开发需求的用户,该构建方式针对速度进行了优化,且会输出调试信息。
- MinSizeRel适合空间硬盘空间受限的用户,该构建方式同样没有任何调试信息和断言信息,但是针对占用空间大小进行了优化。
综上所述,一般的构建可以通过下面的命令进行:
cmake -S llvm -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
cmake --build build
编译报错解决
编译LLVM时报错:
[3223/3502] Linking CXX executable bin/llvm-c-test
FAILED: bin/llvm-c-test
: && /usr/bin/c++ -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -fno-lifetime-dse -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-nonnull -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wno-comment -Wno-misleading-indentation -fdiagnostics-color -g -Wl,-rpath-link,/home/shanlin/llvm-project/build/./lib tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/attributes.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/calc.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/debuginfo.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/diagnostic.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/disassemble.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/echo.cpp.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/helpers.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/include-all.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/main.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/module.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/metadata.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/object.c.o tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/targets.c.o -o bin/llvm-c-test -Wl,-rpath,"\$ORIGIN/../lib:/usr/local/lib:" lib/libLLVMAArch64AsmParser.a lib/libLLVMAMDGPUAsmParser.a lib/libLLVMARMAsmParser.a lib/libLLVMAVRAsmParser.a lib/libLLVMBPFAsmParser.a li
.....
lib/libLLVMBitstreamReader.a lib/libLLVMTextAPI.a lib/libLLVMDebugInfoMSF.a lib/libLLVMDebugInfoBTF.a lib/libLLVMARMDesc.a lib/libLLVMARMInfo.a lib/libLLVMARMUtils.a lib/libLLVMHexagonDesc.a lib/libLLVMHexagonInfo.a lib/libLLVMLanaiDesc.a lib/libLLVMLanaiInfo.a lib/libLLVMLoongArchDesc.a lib/libLLVMLoongArchInfo.a lib/libLLVMRISCVDesc.a lib/libLLVMRISCVInfo.a lib/libLLVMSystemZDesc.a lib/libLLVMSystemZInfo.a lib/libLLVMWebAssemblyDesc.a lib/libLLVMWebAssemblyInfo.a lib/libLLVMMCDisassembler.a lib/libLLVMCodeGenTypes.a lib/libLLVMMC.a lib/libLLVMBinaryFormat.a lib/libLLVMTargetParser.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMSupport.a lib/libLLVMDemangle.a -lrt -ldl -lpthread -lm /usr/local/lib/libz.so /usr/lib/x86_64-linux-gnu/libtinfo.so && :
collect2: fatal error: ld terminated with signal 9 [Killed]
compilation terminated.
查了一下网上给出的解决方法和原因,
这种情况很可能是OOM了,因为默认情况下所有的可执行文件都是静态链接的,所以会需要很多RAM
解决方法如下:
- 减少链接时的并行,通过添加
-DLLVM_PARALLEL_LINK_JOBS=1
编译选项来控制链接的并行。 - 通过
-Wl, no-keep-memory
和-Wl,--reduce-memory-overheads
两个或其中一个加入CMAKE_EXE_LINKER_FLAGS
来减少内存的消耗。 - 更换链接器,通过添加
-fuse-ld=gold
或者-fuse-ld=lld
到CMAKE_EXE_LINKER_FLAGS
来更换链接器。
尝试了方法1,直接解决了:
cmake -S llvm -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DLLVM_PARALLEL_LINK_JOBS=1
cmake --build build
cmake 参数:
- -S : path to the source
- -B : path to the build
- –build : build a CMake-generate project binary tree.