Linux | gcc编译篇
01
为什么学习嵌入式Linux和嵌入式单片机,因为AI未来十几年还无法替代。
gcc 全称(gnu compiler collection)即编译套件,gcc 可以支持多种计算机体系结构,比如 X86、 ARM 、MIPI .我们使用的 ubuntu 默认自带的 gcc。
gcc 选项 文件名
-o 参数为指定生成文件的文件名
举例: gcc hello.c -o hello
如果我们不使用 -o 参数指定我们生成文件的名称,直接输入 gcc hello.c 编译完会得到一个 a.out 文件,执行这个 a.out 的结构和执行 hello 是一样的。
02
file 命令:
功能:查看文件类型
格式: file 文件名
03
编译流程
从 hello.c 编译得到 hello 或者 a.out 要经历四个步骤:预处理,编译,汇编,链接。
-
hello.i 预处理得到的 C 语言代码
-
hello.s 汇编语言文件
-
hello.o 目标文件
第一阶段:预处理阶段,编译器会对头文件或者宏定义进行展开,或者条件编译的选择我们可以使用 -E 参数得到预处理文件
-
-E :只对文件进行预处理,不编译和链接。
使用 gcc -E hello.c -o hello.i 得到预处理后的文件,输入以下命令:
gcc -E hello.c -o hello.i
第二阶段:编译,把文件编译成汇编代码
-S 参数 将 hello.i 文件编译成 hello.s 文件
gcc -S hello.i -o hello.s
第三阶段:汇编,把汇编文件编译机器码
-c 参数 可以把 hello.s 文件编译成 hello.o 文件
gcc -c hello.s -o hello.o
第四阶段:链接
直接把目标文件编译成可执行文件
链接分为静态链接和动态链接,gcc 默认的是动态链接
特点:生成的程序下,但是需要依赖库,
静态链接:使用 -static 参数就是静态链接,因为程序里面包含了需要的库,所以体积比较大,静态链接的可执行文件>动态链接的可执行文件。
gcc hello.o -o hello
// 静态链接
gcc hello.c -o hello1 -static