Linux系统下开发C语言程序使用的gcc编译器,编译过程一般由Makefile脚本结合make程序实现. 基于Makefile脚本的编译过程自动化, 只要在终端输入make命令, 就可以完成整个编译过程. 本文面向一简单的代码结构,说明Makefile的编写,从而实现编译过程的自动化.

图1 代码结构

图1所示为代码结构, 文件夹src存放main.c, add.c, sub.c, mul.c和div.c等c源代码文件, common.h文件放在include目录, 生成的中间文件放在obj目录(编译过程中生成),最终编译成功的可执行文件放在bin目录。源代码中的main.c是程序的入口, 其调用add.c, sub.c, mul.c和div.c中的四个函数, 关于函数的声明都放置在common.h中.另外,要求Makefile中提供clean选项,只要输入命令”make clean”,可以将所有生成的.o文件和可执行文件删除。

满足上述要求的Makefile脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CC=gcc
objects=obj/main.o obj/add.o obj/sub.o obj/mul.o obj/div.o
target=bin/main
$(target):$(objects)
    $(CC) -o $(target) $(objects)
obj/main.o:src/main.c
    $(CC) -o $@ -c $< -I  include
obj/add.o:src/add.c
    $(CC) -o $@ -c $<
obj/sub.o:src/sub.c
    $(CC) -o $@ -c $<
obj/mul.o:src/mul.c
    $(CC) -o $@ -c $<
obj/div.o:src/div.c
    $(CC) -o $@ -c $<
clean:
    rm -rf $(objects) $(target)

简要说明下,上述脚本中的特殊符号

1
2
3
4
"$@": 表示目标文件;
"$<": 表示依赖文件;
比如最后一条" $(CC) -o $@ -c $<"
其中的"$@"表示obj/div.o,而"$<"表示src/div.c。

将上述内容的Makefile脚本放置到src文件夹所在的目录,然后在命令行端敲击make命令,回车即可. 图2是windows下模拟linux的Cygwin系统下运行Makefile脚本后的结果.

图2 Makefile执行后的效果

C语言代码和Makefile脚本下载链接如下:

https://github.com/tfzhang55/testmkfile