Makefile文件的编写规则及实例

描述

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)

(缺点:并未包含头文件,当头文件更新时,不能重新编译)

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分