通常我们编译程序是这样的
gcc xxx.c -o test
这样这个可执行文件test就可以直接执行了,编译器帮我们做的东西太多了
我们需要了解一下这个过程
1、预编译
把所有的宏展开
如
#define LED p0^0
LED = 1;
这一步就是将LED替换成p0^0
宏定义可以使得我们代码的可阅读性变强,一定要多用宏定义
gcc -E main.c > main.i
编译器将main.c预处理结果输出 main.i 文件
处理条件编译
#ifdef SENYUN
#ifden HIKCAM
#end if
比如做摄像头的时候
- 如果是森云相机,就编译第一个ifdef
- 如果是海康相机,就编译第二个ifdef
处理includ文件
#include <stdio.h>
这一步电脑直接将头文件里的内容直接替换到这个位置
删除所有注释
2、编译
本来是一个.c文件,这一步生成汇编文件.S
gcc -S main.i -o main.s
.c -->.S
3、汇编
将上一步生成的.S文件翻译成机器码(二进制)
gcc -c main.s -o main.o
生成.o文件
4、链接
gcc main.o -o main
最终生成可执行文件
动态库链接
静态库链接
参考我另一篇博文
https://blog.csdn.net/qq_28258885/article/details/110530168
生成elf文件和bin文件
这两种都是二进制文件,并且是都可以直接读得懂的
- bin:只有二进制的机器码,只有成需要执行的部分
- elf:除了二进制的机器码,还有段的加载地址,运行地址,重定位表,符号表
最后放在flash上的只有bin文件