LLVM 7.1.0 gnueabihf版本编译记录
LLVM连同组件一起编译
对LLVM有初步了解的话,会发现LLVM可以被描述为编译器的“中后端”。也就是说,LLVM本身不是一个完整的编译器,需要与编译器前端等组件配合使用才能完成完整的编译过程。作为可选组件形式与LLVM一同发布的配件就有配置的讲究了。 根据CMakeList文件对组件的配置,加上网上其他人对于编译过程的总结,对组件及其位置罗列如下:
文件名 | 对应组件 | 对应位置 |
---|---|---|
llvm- |
LLVM本体 | ./ |
cfe- |
Clang | ./tools/clang |
compiler-rt- |
Compiler-RT | ./projects/compiler-rt |
libcxx- |
libcxx | ./projects/libcxx |
libcxxabi- |
libcxxabi | ./projects/libcxxabi |
libunwind- |
libunwind | ./projects/libunwind |
lld- |
LLVM连接器 | ./tools/lld |
lldb- |
LLVM调试器 | ./tools/lldb |
openmp- |
OpenMP支持 | ./projects/openmp |
polly- |
(暂时不懂) | ./tools/polly |
clang-tools-extra- |
Clang附加工具 | ./tools/clang/tools/extra |
test-suite- |
测试程序(相当大) | ./projects/test-suite |
编译时遇到错误:r7 cannot be used in asm here
https://tls.mbed.org/kb/development/arm-thumb-error-r7-cannot-be-used-in-asm-here
根据上述网站叙述,该问题在于gcc对于arm处理器中寄存器的使用方式与arm自身对编译过程的优化中产生了冲突。arm优化的函数在汇编中显式地使用了编号为r7
的寄存器,而在不经优化的情况下,r7
被gcc用作帧指针寄存器,不允许被显示地用作其他用途,从而报错。
在解决这个问题时,发现另一个问题:理论情况来说,发布的稳定版的软件源码在编译时会默认设置为发布版本Release
,在该模式下,编译器将会对目标软件进行大幅优化以加快运行速度(比如常见的开启-O2
或-O3
选项),删除不必要的调试信息从而缩小软件大小。而LLVM却将其默认设置为了调试版本Debug
,在该模式下,将保留较多的源代码信息,能够在出错时较好地帮助开发人员进行调试,也会相比发布版本有着更加接近原代码的二进制逻辑过程,而这也正是上面在直接编译LLVM时遇到错误的原因。
因而解决方法十分清晰了:将CMake中决定编译版本的参数设置为Release即可。
cd /path/to/llvm/src
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
然后再加上其他需要的参数配置完以后,使用make进行编译即可。
若是只想解决该问题并编译调试版本的话,在编译器参数中加上-fomit-frame-pointer
选项即可。