8.7.1 makefile实例——项目中的总makefile

来源:互联网 发布:二手交易 wap源码 编辑:程序博客网 时间:2024/05/16 09:38

《Linux C程序设计王者归来》第8章构建makefile文件,makefile相当于一种脚本编程语言,用户在编写makefile的过程中可以使用变量、控制结构语句和函数等一般编程语言的特性,同时也可以执行shell指令。makefile诞生的本质目的是实现自动化编译,因此makefile区别于其他编程语言的最大特点是,其执行是由所编译文件的依赖关系驱动的。本章将说细介绍编写makefile的方法。本节为大家介绍makefile实例——项目中的总makefile。

AD:

8.7  makefile实例

本节演示两个makefile的实例,以使读者加深对makefile的理解。通过实例总结本章中涉及到的编写makefile的知识点。

8.7.1  makefile实例——项目中的总makefile

若某个项目的源代码按模块分类分别存储在多个目录下,每个模块的目录内都有各自的makefile文件。其源程序存储的目录结构如下所示。

project目录如下:
 

  1. hello(目录)  include(目录)  list(目录)  Makefile(makefile文件) 

project/hello目录如下:
 

  1. hello.c(源代码文件)  Makefile(makefile文件) 

project/include目录如下:
 

  1. hello.h(头文件)  list.h(头文件) 

project /list目录如下:
 

  1. list.c(源代码文件)  Makefile(makefile文件) 

由此可以分别写出各目录内的makefile文件。使用该makefile就可以将所有的源文件进行编译,并且生成一个可执行程序。在该makefile中借鉴了shell编程的思想,使用了许多shell命令来帮助makefile执行操作。

(1)在vi编辑器中编辑hello目录下的makefile文件如下。

程序清单8-36  hello目录下的makefile文件
 

  1. hello: hello.o  # 生成hello  
  2.     gcc hello.o -o hello  
  3. hello: hello.c  # 生成hello.o  
  4.     gcc -c hello.c  
  5. clean:  
  6.     rm -rf hello *.o  
  7. .PHONY: clean 

(2)在vi编辑器中编辑list目录下的makefile文件如下。

程序清单8-37  list目录下的makefile文件
 

  1. list: list.o    # 生成list  
  2.     gcc list.o -o list  
  3. list.o: list.c  # 生成list.o  
  4.     gcc -c list.o  
  5. clean:  
  6.     rm -rf list *.o  
  7. .PHONY: clean 

现在需要编写project目录中的makefile文件,执行该makefile文件后,可以自动执行每个子目录下的makefile文件。其内容如下,读者可以根据shell脚本来理解该makefile文件。

(3)在vi编辑器中编辑project目录中的makefile文件如下。

程序清单8-38  project目录中的makefile文件
 

  1. SUBDIRS :list hello                       # 子目录  
  2. all : modules  
  3. .PHONY:all  
  4. modules:  
  5. #进入每个文件夹并执行文件夹中的makefile  
  6.     for dir in $(SUBDIRS);do make -C $$dir || exit 1;done      
  7. .PHONY:modules  
  8. clean:  
  9. #进入每个文件夹并调用makefile中的clean  
  10.     for dir in $(SUBDIRS);do make -C $$dir clean;done  
  11. .PHONY: clean 

(4)执行该makefile文件。

  1. $make -s 

(5)查看当前每个子目录下的文件变化情况。

  1. $ls ./hello  
  2. hello  hello.c  hello.o  Makefile  
  3. $ls ./include:  
  4. hello.h  list.h  
  5. $ls ./list:  
  6. list  list.c  list.o  Makefile 

(6)再次执行该makefile文件,不过这次执行clean目标。
 

  1. $make -s clean 

(7)再次查看当前每个子目录下的文件变化情况。

  1. $ls ./hello  
  2. hello  hello.cMakefile  
  3. $ls ./include:  
  4. hello.h  list.h  
  5. $ls ./list:  
  6. list  list.c  Makefile 





FROM:  http://book.51cto.com/art/201503/470223.htm

0 0