C代码是如何变成可以执行程序的过程:
1、由预处理器把程序员所编写的C代码翻译成标准C代码,可以得到以.i结尾的预处理文件。gcc -E code.c
gcc -E code.c -o code.i
2、由汇编器把标准的C代码生成汇编代码,可以得到以.s结尾的汇编文件。
gcc -S code.i
3、由翻译器把汇编文件生成二进制的文件,得到.o结尾的目标文件。
gcc -c code.s
4、由链接器把若干个目标文件合并在一起生成可执行文件,默认得到a.out。
gcc code1.o code2.o code3.o
单文件编程:
当只有一个.c文件,例如test.c 这时只要输入
gcc test.c -o test
此时生成可执行文件test,只要输入./test就可以执行程序并得到结果了
多文件编程 :
1、把一个项目分解成不同的模块,会有若干个.c,一个.c文件会生成一个.o文件,然后再最终合并成一个可以执行程序。
2、各个.c文件各司其职,负责实现功能代码,如果相互之间需要调用,先用.h文件中的内容解决编译错误,然后在链接过程中各自寻找需要的代码。
3、.h文件中具要负责的内容有,函数的声明,变量的声明,等一些不需要占用内存的声明语句。
4、一般一个.h对应一个.c文件,要.c中把.h引入,如果.h与.c声明的函数不相符,会有错误提示。
Makefile脚本编写:
1.用来编译代码的脚本程序,里面记录的是编译代码的步骤。
2.在终端的命令行中执行make命令,系统会自动调用Makefile文件中的内容执行(make)。
3.在执行make时,不是所有的.c文件都会被重新编译,只有被修改的.c文件才会再次编译(它是通过监控文件的修改时间来提高编译效率)
Makefile的主要内容:
定义变量
CC
STD
SRC
OBJ
BIN
FLAG
入口目标:目标名
默认位置排列在第一个的目标是入口目标,默认只执行它。
普通目标
好比自定义函数,可以通过被依赖,达到被执行的目的。
普通目标也可以依赖其它普通目标,达到多个目标被执行的目的。
清理目标:
默认不执行,当程序编译成功时,把目标文件清理掉。
或者系统时间出现问题,需要重新编译所有文件时。
make 目标名
示例:
CC = gcc
STD = -std = gnu99
BIN = start
OBJ = main.o function.o extra_func.o
FLAG = -g
all:$(OBJ)
$(CC) $(STD) $(FLAG) $(OBJ) -o $(BIN)
$.o:%.c
$(CC) $(STD) -c $< -o $@
clean:
rm $(OBJ) $(BIN)
CC为编译器 选择gcc
STD为编译标准 这里选择gnu99
BIN为可执行文件名称
OBJ为目标文件 也就是后缀为.o的文件
FLAG 为编译参数,-g为在编译的时候,产生调试信息
$()会自动替换为对应的值
clean会在每次make编译后清理目标文件和可执行文件