首页 > 代码库 > makefile 学习(一)

makefile 学习(一)

1. 使用 makefile 的原因

假如每次都手动输入, 可能会写出这样的编译命令

?
1
2
3
4
5
6
7
gcc -c main.c
 
gcc -c mytool1.c
 
gcc -c mytool2.c
 
gcc -o main main.o mytool1.o mytool2.o

那么, 可不可以将这个命令写成 shell 脚本呢, 这样就不需要费事打命令了

但是, 使用脚本有一个弊端, 假设只有一个源文件被修改, 那么 shell 命令会把整个项目重新编译一遍

所以, 为了简化编译同时兼顾高效, make 命令应运而生, 但用 make 需要先编写 makefile 文件, makefile 告诉 make 编译规则

 

2. makefile 编写规则

makefile 注释以 # 开头

规则

target: componet // 第一行, 依赖关系

TAB rules // 第二行, 规则

一个 makefile 例子

?
1
2
3
4
5
6
7
8
9
#此行为注释
main: main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o: main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o: mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o: mytool2.c mytool2.h
gcc -c mytool2.c

 

3. makefile 文件的简化

三个常用变量

$@ 目标文件

$^ 所有依赖对象

$< 第一个依赖文件

有这三个变量, 上面的 makefile 可以简化为

?
1
2
3
4
5
6
7
8
9
#这是简化后的Makefile
main: main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o: main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o: mytool1.c mytool1.h
gcc -c $<
mytool2.o: mytool2.c mytool2.h
gcc -c $<

 

..c.o: makefile 的缺省规则, 这个规则表示所有的 .o 文件都依赖于响应的 .c 文件

这样, makefile 又可以简化为

?
1
2
3
4
5
#这是再一次简化后的Makefile
main: main.o mytool1.o mytool2.o
gcc -o $@ $^
..c.o:
gcc -c $<

 

4. linux 下, makefile 编写带 boost 程序

 

 

Reference 

[1] http://blog.csdn.net/livelylittlefish/article/details/3854220

[2]