Makefile带来直接好处就是——“自动化编译”。一旦写好,只需要一个make命令,整个工程完全自动编译,所以十分方便。而Makefile文件就是告诉make命令怎么样地去编译和链接程序。但是想要比较灵活的运用它,还是先要熟悉一些关于系统对程序编译和链接的知识。
1.一个简单的makefile例子
假设一个程序有两个文件file1.c,file2.c,每个文件都包含head.h,生成file可执行文件
file:file1.o file2.o 附属行(文件的依存关系)
gcc -o file1.o file2.o 命令行
file1.o:file1.c head.h
gcc -c file1.c
file2.o:file2.c head.h
gcc -c file2.c
从file最终的目标文件开始倒推,依次列出文件的依存关系,make在执行时:
(1)判断file可执行文件是否存在,若不存在,则执行命令行,向下寻找依存关系
(2)若file存在,则检查依靠文件,是否存在更新,若存在更新则执行命令行,若没有更新则给出提示:
make:'file' is up to date.
2.makefile中的宏定义及内部变量
宏定义:
OBJS = file1.o file2.o
CC = gcc
CFLAGS = -wall -O -g
引用:
file:$(OBJS)
$(CC) $(OBJS) -o file
file1.o:file1.c head.h
$(CC) $(FLAGS) -c file1.c
file2.o:file2.c head.h
$(CC) $(FLAGS) -c file2.c
内部变量:
$^ 代表所有的依赖文件
$@ 代表所有的目标文件
$< 代表第一个依赖文件
file:$(OBJS)
$(CC) $^ -o $@
file1.o:file1.c head.h
$(CC) $(FLAGS) -c $< -o $@
file2.o:file2.c head.h
$(CC) $(FLAGS) -c $< -o $@
"(CC) **(FLAGS) -c **< -o @"是隐含规则,可以不写,默认使用此规则ww
3.假象
假设一个项目要生成两个可执行文件file1和file2,这两个文件是独立的,则在makefile开始处:
all:file1 file2
make总是假设all要生成,去检查它的依赖文件
4.清除由make产生的文件
clean:
rm *.o
rm file
执行:
make clean
则会清除由make生成的*.o和file文件
如果有clean文件存在,则清除不会执行(因clean没有可依赖的文件,永远是最新的)
使用PHONY目标,避免同名文件相冲突,不会检查clean文件存在与否,都要执行清除操作
.PHONY : clean
clean:
rm *.o
rm file
5.makefile函数
搜索当前目录,生成由*.c结尾的文件列表,wildcard--函数名
SOURCE = $(wildcard *.c)
用%.o替换$(SOURCE)中的%.c文件
OBJS = $(patsubst %.c,%.o,$(SOURCE))
6.产生新规则
SOURCE = $(wildcard *.c)
depends:$(SOURCE)
gcc -M $(SOURCE) > depends
(为每一个.c文件产生规则,c文件和相关头文件为依靠)
在makefile文件中:
include depends
7.一个有效的makefile文件
可以完成大部分我们所需要的依靠检查,不用做太多的修改就可用在大多数项目里
功能:搜索当前目录,寻找源码文件,放入SOURCE变量里,利用patsubst产生目标文件(*.o)
CC = gcc
CFLAGS = -Wall -O -g
SOURCE = $(wildcard *.c,*.cc)
OBJS = $(patsubst %.c,%.o,$(patsubst,%.cc,%.o,$(SOURCE)))
file:$(OBJS)
$(CC) $^ -o $@
用默认规则产生目标文件(*.o)
(缺点:并未包含头文件,当头文件更新时,不能重新编译)
全部0条评论
快来发表一下你的评论吧 !