C语言学习013:通过make编译C源代码

时间:2021-07-15 03:57:23

编译多个C源代码文件

  当程序文件越来越多,修改了其中的一部分代码文件,我们并不需要全部重新编译,只需要编译其中一部分就可以,下面我们创建了一个launch程序,除了主程序,我们创建了3个功能代码文件reaction.c pitch.c engine.c

1 #include <stdio.h>
2 #include "lac.h"
3
4 void reaction(){
5 printf("reaction \n");
6 }
1 #include <stdio.h>
2 #include "lac.h"
3
4 void pitch(){
5 printf("pitch \n");
6 }
1 #include <stdio.h>
2 #include "lac.h"
3
4 void engine(){
5 printf("engine \n");
6 }
1 #include <stdio.h>
2 #include "lac.h"
3
4 int main(){
5 reaction();
6 pitch();
7 engine();
8 return 0;
9 }

  首先将源代码编译为目标文件

  gcc -c *.c

  *.c会匹配当前目录下的所有C源文件,-c会告诉编译器为所有源文件创建目标文件

C语言学习013:通过make编译C源代码

  然后通过下面的命令,编译器会过滤掉代码文件,将目标文件链接起来,行程launch程序

  gcc *.o -o launch

  如果我们修改了其中一个文件,只需要编译修改的文件,然后再将目标文件连接起来,这样就可以不必编译所有的文件了

C语言学习013:通过make编译C源代码

用make工具自动化构建

  那么问题来了,如果修改的文件很多,编译的时候我们就很难记得修改了哪些文件,当然也可以把所有文件都重新编译,但是那样效率很低,有没有什么办法让它自动编译呢?下面我们就通过make工具自动化构建

  make编译的文件叫目标,对每个目标它需要知道两件事情:依赖项(生成文件需要用哪些文件)和生成方法(生成该文件时需要哪些指令);依赖项和生成方法合起来就构成了规则,有了规则,make就知道如何生成目标

  比如,要将reaction.c编译成目标文件reaction.o;那么reaction.o就是目标,reaction.c是依赖项,生成方法就是将reaction.c转化为reaction.o的编译命令 gcc -c reaction.c;创建完目标文件后,我们需要将所有目标文件链接在一起,就是通过 gcc *.o -o launch命令,*.o匹配所有目标文件;如果只是需要链接一部分目标文件,就需要将要链接的目标文件逐个列出来,像这样: gcc launch.o reaction.o  -o launch

  现在我们就将所有的目标、依赖项和生成方法保存到makefile(或者是Makefile)文件,然后将该文件放在源程序文件同目录中

 1 launch.o: launch.c lac.h
2 gcc -c launch.c
3 reaction.o: lac.h reaction.c
4 gcc -c reaction.c
5 pitch.o: lac.h pitch.c
6 gcc -c pitch.c
7 engine.o: lac.h engine.c
8 gcc -c engine.c
9 launch: launch.o reaction.o pitch.o engine.o
10 gcc *.o -o launch

  需要注意的是,生成方法都是tab开头

C语言学习013:通过make编译C源代码

  现在可以打开控制台开始编译代码了;在unix系统中我们可以用make命令,而在windows系统中MinGW版的make写作 mingw32-make

C语言学习013:通过make编译C源代码

  当在我们修改了其中一个源代码文件(pitch.c),重新编译,你会看到make只编译了修改的文件

C语言学习013:通过make编译C源代码

  使用make工具的目的是快速编译多个源文件程序,如果你写的只是单个源代码文件,那就直接编译来得省事