Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160964
  • 博文数量: 42
  • 博客积分: 996
  • 博客等级: 准尉
  • 技术积分: 705
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-09 19:41
文章分类
文章存档

2012年(42)

我的朋友

分类: C/C++

2012-04-26 12:38:20

如果不写makefile文件的话,要改动某一个源文件或头文件的话就又要进行全部编译,一般一个大型项目往往有几千个源文件组成,全部编译一次要几小时,只改一个源文件就要重新全部编译一次肯定是不合理的。makefile文件可以进行自动的判断哪些源文件需要重新编译和链接。我们假设有3个源文件和3个头文件组成: main.c  stack.c  maze.c  main.h  stack.h  maze.h
    写一个makefile文件格式(保存为makefile或Makefile)
main: main.o stack.o maze.o
    gcc main.o stack.o maze.o -o main
main.o: main.c main.h stack.h maze.h
    gcc -c main.c
stack.o: stack.c stack.h main.h
    gcc -c stack.c
maze.o: maze.c maze.h main.h
    gcc -c maze.c

通常makefile文件中都会有一个clean规则,用于清除编译过程中产生的二进制文件保留源文件。
clean:
    @echo "cleaning project"
    -rm main *.o
    @echo "clean completed"
.PHONY: clean
makefile文件编写好后,把它和源代码放在同一个目录下,用make命令执行。

注意1. makefile文件中每一指令行都必须是一个Tab开头而不能是空格
      2. make执行的命令前面加了@表示不显示命令本身只显示命令结果
      3. 如果命令前面加了-号表示即使这条命令出错,make也会继续执行后续指令。通常rm和mkdir这两条指令前都要加-号,因为可能要删除的文件不存在或要创建的目录已存在,这两个命令都有可能出错。
    
上述makefile还可以写得更简单一点,一个目标依赖的所有条件不一定要写在一天规则中。如:
main.o: main.h stack.h maze.h
main.o: main.c
    gcc -c main.c
就相当于:main.o: main.c main.h stack.h maze.h
              gcc -c main.c
并且可以利用make的内在隐含规则,把提取出来的部分省略去写得更简单:
main.o: main.h stack.h maze.h

所以上述makefile文件可以写成更简单的形式,如下:
main: main.o stack.o maze.o
    gcc -c main.o stack. maze.o
main.o: main.h stack.h maze.h
stack.o: stack.h main.h
maze.o: maze.h main.h
clean:
    -rm main *.o
.PHONY: clean
阅读(1421) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~