Makefile学习③:编译流程
学习前准备
实现七个文件的编写,例如:实现加减乘三个函数的.c文件和.h文件的编写加上主函数main.c,方便后续使用Makefile将其分别编译。
博主的demo如下:
使用gcc 命令将所有文件编译出来生成a.out文件,执行a.out(博主的a = 1,b = 2)
使用Makefile进行编译
一:创建一个Makefile文件将编译命令输入并执行。
main:
gcc add.c sub.c multi.c main.c
结果如图所示
二:优化Makefile文件
如一所示的Makefile文件能够实现我们的目标,但是这样的写法对于庞大的项目来说并不完美,我们进行如下的改动:
main:add.o sub.o multi.o
gcc add.o sub.o multi.o main.c -o main
add.o :add.c
gcc -c add.c -o add.o
sub.o :sub.c
gcc -c sub.c -o sub.o
multi.o :multi.c
gcc -c multi.c -o multi.o
进行编译会生成:可执行文件main以及add.o,sub.o,multi.o三个二进制文件
如此修改的目的是为了使得多个文件同时被依赖的时候,若其中仅有一个文件被修改,则无需将全部文件重新编译,而只编译被修改的文件即可,大大节省文件编译的时间,如下图所示,博主修改了加法函数中的运算规则,然后重新编译并执行。
可以看到重新执行make命令,系统仅重新编译了add.o文件
gcc/g++ 编译流程
gcc main.c -o main #直接从源代码到目标可执行文件
把过程拆分:
例如:
预处理:gcc -E main.c 得到 main.i的扩展源代码
编译:gcc -S main.i 得到 main.s的汇编文件
汇编:gcc -c main.s 得到main.o(.obj)的二进制文件
链接:gcc main.o add.o sub.o multi.o 将需要的二进制文件进行链接生成a.out可执行文件
详解可见:C语言的编译过程详解
由此可见使用Makefile进行分别编译,其实就是将汇编和链接的过程进行分部处理,以保证项目的可移植性和模块化。