编译多个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会告诉编译器为所有源文件创建目标文件
然后通过下面的命令,编译器会过滤掉代码文件,将目标文件链接起来,行程launch程序
gcc *.o -o launch
如果我们修改了其中一个文件,只需要编译修改的文件,然后再将目标文件连接起来,这样就可以不必编译所有的文件了
用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开头
现在可以打开控制台开始编译代码了;在unix系统中我们可以用make命令,而在windows系统中MinGW版的make写作 mingw32-make
当在我们修改了其中一个源代码文件(pitch.c),重新编译,你会看到make只编译了修改的文件
使用make工具的目的是快速编译多个源文件程序,如果你写的只是单个源代码文件,那就直接编译来得省事