本周主要学习在Linux系统下使用Makefile对多个C语言源程序进行编译。
对于多个C语言源程序编译的时候,可以进行合并编译,例如下:
$ gcc main.c stack.c maze.c -o main
但是这种办法并不是很好,由于一般大型软件大多由上千个源程序组成,所以当其中的一个出错,还需把所有源文件重新编译一遍,而全部编译一遍需要几个小时,所以这种方法并不是首选,除非源程序数量极少。
还有一种方法如下:
$ gcc -c main.c
$ gcc -c stack.c
$ gcc -c maze.c
$ gcc main.o stack.o maze.o -o main
如果编译之后又对maze.c做了修改,要重新编译只需要做两步:
$ gcc -c maze.c
$ gcc main.o stack.o maze.o -o main
然而这样也与上一种方法有着类似的弊端,比如说寻找错误困难,重新编译耗时长。
所以使用Makefile对C语言进行编译不失为一种首选方法。
make 程序利用Makefile的数据和每个文件最新一次更改的时间来确定哪些文件需要更新;对每个需要更新的文件,make程序使用Makefile中定义的命令来更新它。
Makefile一般格式:
target(要生成的文件): dependencies(被依赖的文件)
#命令前面用的是“tab”而非空格。误用空格是初学者容易犯的错误!
命令1
命令2
命令3
.
.
.
命令n
目标和条件之间的关系是:欲更新目标,必须首先更新它的所有条件;所有条件中只要有一个条件被更新了,目标也必须随之被更新。所谓“更新”就是执行一遍规则中的命令列表,命令列表中的每条命令必须以一个Tab开头,注意不能是空格,Makefile的格式不像C语言的缩进那么随意,对于Makefile中的每个以Tab开头的命令,make会创建一个Shell进程去执行它。
所以将源程序和头文件放在同一目录下,在该目录下运行make命令即可进行编译。