对程序中的编译预处理指令(非c语言指令,以#开头,不以;结尾)进行处理
- #define 宏定义
- #include 文件包含,这里一般包含.h头文件 头文件和源文件的区别是什么?
- #if() 条件编译
将源代码(高级语言)翻译为汇编代码(低级语言)
编译程序的组成
这里的目标程序就是汇编代码
将汇编语言翻译为机器语言,汇编语言将二进制码(例如11000010)表示为人容易理解的形式(例如LOAD),因此汇编过程也相对简单
4、链接: 将c语言经过汇编之后生成的二进制文件,和系统组件(比如标准库、动态链接库等)结合起来,组合成一个可执行文件。
如果将编写的程序分散到多个源文件中,编译器每次只能编译一个源文件,生成一个目标文件,这个时候,链接器除了将目标文件和系统组件组合起来,还需要将编译器生成的多个目标文件组合起来。
综合来说就是将当前文件#include的.h头文件所对应的.c源文件组合起来。
clang hello.c #生成目标文件.out
clang -E hello.c #生成预处理文件hello.i
clang -S hello.c #生成汇编文件hello.s
clang -c hello.c #生成二进制文件hello.o
clang -Oi hello.c #编译优化等级i,级别为1~3
clang hello.c -o hello #指定输出文件的文件名为hello
2、llvm IR学习
clang -fmodules -fsyntax-only -Xclang -dump-tokens hello.c #词法分析
clang -S -emit-llvm hello.c #生成IR字节码文件hello.ll
llc hello.ll #编译IR中间代码hello.ll生成汇编文件hello.s
3、交叉编译到树莓派
使用安装过程安装的clang进行交叉编译
# hello.c->hello可执行文件
`brew --prefix llvm`/bin/clang \
--target=arm-linux-gnueabihf \
--sysroot=$HOME/sysroot \
-isysroot=$HOME/sysroot \
-isystem=$HOME/sysroot/usr/include \
-isystem=$HOME/sysroot/usr/include/arm-linux-gnueabihf \
-L$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
-B$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
--gcc-toolchain=`brew --prefix arm-linux-gnueabihf-binutils` \
-o hello \
hello.c
# hello.c->hello.s
`brew --prefix llvm`/bin/clang \
-S \
--target=arm-linux-gnueabihf \
--sysroot=$HOME/sysroot \
-isysroot=$HOME/sysroot \
-isystem=$HOME/sysroot/usr/include \
-isystem=$HOME/sysroot/usr/include/arm-linux-gnueabihf \
-B$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
--gcc-toolchain=`brew --prefix arm-linux-gnueabihf-binutils` \
-o hello.s \
hello.c
# hello.c->hello.ll
`brew --prefix llvm`/bin/clang \
-S -emit-llvm \
--target=arm-linux-gnueabihf \
--sysroot=$HOME/sysroot \
-isysroot=$HOME/sysroot \
-isystem=$HOME/sysroot/usr/include \
-isystem=$HOME/sysroot/usr/include/arm-linux-gnueabihf \
-B$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
--gcc-toolchain=`brew --prefix arm-linux-gnueabihf-binutils` \
hello.c
# hello.ll->hello.s
`brew --prefix llvm`/bin/llc \
-march=arm \
hello.ll
# hello.s->hello
`brew --prefix llvm`/bin/clang \
--target=arm-linux-gnueabihf \
--sysroot=$HOME/sysroot \
-L$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
-B$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
--gcc-toolchain=`brew --prefix arm-linux-gnueabihf-binutils` \
-o hello \
hello.s
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)