8.7 makefile实例
本节演示两个makefile的实例,以使读者加深对makefile的理解。通过实例总结本章中涉及到的编写makefile的知识点。
8.7.1 makefile实例——项目中的总makefile
若某个项目的源代码按模块分类分别存储在多个目录下,每个模块的目录内都有各自的makefile文件。其源程序存储的目录结构如下所示。
project目录如下:
- hello(目录) include(目录) list(目录) Makefile(makefile文件)
project/hello目录如下:
- hello.c(源代码文件) Makefile(makefile文件)
project/include目录如下:
- hello.h(头文件) list.h(头文件)
project /list目录如下:
- list.c(源代码文件) Makefile(makefile文件)
由此可以分别写出各目录内的makefile文件。使用该makefile就可以将所有的源文件进行编译,并且生成一个可执行程序。在该makefile中借鉴了shell编程的思想,使用了许多shell命令来帮助makefile执行操作。
(1)在vi编辑器中编辑hello目录下的makefile文件如下。
程序清单8-36 hello目录下的makefile文件
- hello: hello.o # 生成hello
- gcc hello.o -o hello
- hello: hello.c # 生成hello.o
- gcc -c hello.c
- clean:
- rm -rf hello *.o
- .PHONY: clean
(2)在vi编辑器中编辑list目录下的makefile文件如下。
程序清单8-37 list目录下的makefile文件
- list: list.o # 生成list
- gcc list.o -o list
- list.o: list.c # 生成list.o
- gcc -c list.o
- clean:
- rm -rf list *.o
- .PHONY: clean
现在需要编写project目录中的makefile文件,执行该makefile文件后,可以自动执行每个子目录下的makefile文件。其内容如下,读者可以根据shell脚本来理解该makefile文件。
(3)在vi编辑器中编辑project目录中的makefile文件如下。
程序清单8-38 project目录中的makefile文件
- SUBDIRS := list hello # 子目录
- all : modules
- .PHONY:all
- modules:
- #进入每个文件夹并执行文件夹中的makefile
- for dir in $(SUBDIRS);do make -C $$dir || exit 1;done
- .PHONY:modules
- clean:
- #进入每个文件夹并调用makefile中的clean
- for dir in $(SUBDIRS);do make -C $$dir clean;done
- .PHONY: clean
(4)执行该makefile文件。
- $make -s
(5)查看当前每个子目录下的文件变化情况。
- $ls ./hello
- hello hello.c hello.o Makefile
- $ls ./include:
- hello.h list.h
- $ls ./list:
- list list.c list.o Makefile
(6)再次执行该makefile文件,不过这次执行clean目标。
- $make -s clean
(7)再次查看当前每个子目录下的文件变化情况。
- $ls ./hello
- hello hello.cMakefile
- $ls ./include:
- hello.h list.h
- $ls ./list:
- list list.c Makefile