Makefile基础

来源:互联网 发布:淘宝详情页ps技巧 编辑:程序博客网 时间:2024/06/06 01:28
Makefile的规则
规则的基本格式为:
TARGET... : DEPENDEDS...
COMMAND
...
...
》TARGET: 规则所定义的目标。
》DEPENDEDS:执行此规则所必须的依赖条件。
》COMMAND: 规则所执行的命令,即规则的动作。COMMAND前面的空白是一个Tab键,不是空格。Tab告诉make这是一个命令行,make执行相应的动作。
i、模式匹配
前面Makefile中,main.o规则书写方式如下:
main.o:main.c add/add.h sub/sub.h
gcc -c -o main.o main.c -Iadd -Isub
有一种简便的方法可以实现与上面相同的功能:
main.o:%o:%c
gcc -c $< -o $@
这种方法的规则main.o中依赖项中的"%o:%c"的作用是将TARGET域的.o的扩展名替换为.c,即将main.o替换为main.c。而命令行的$<表示依赖项的结果,即main.c: $@表示TARGET域的名称,即main.o。
j、Makefile中的用户自定义变量
CC = gcc (CC定义成gcc
CFLAGS = -Isub -Iadd -O2 (加入头文件搜索路径, O2为优化
OBJS = add/add_int.o add/add_float.o \
sub/sub_int.o sub/sub_float.o main.o
TARGET = cacu (最终生成目标
RM = rm -f (删除的命令
$(TARGET):$(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)

$(OBJS):%.o:%.c (将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件
$(CC) -c $(CFLAGS) $< -o $@ (编译生成目标文件

clean:
-$(RM) $(TARGET) $(OBJS) (最前面的“-”是为了防止删除的文件不存在时会报错
以上例子可简化为:
CFLAGS = -Isub -Iadd -O2
OBJS = add/add_int.o add/add_float.o \
sub/sub_int.o sub/sub_float.o main.o
TARGET = cacu
$(TARGET):$(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)
clean:
-$(RM) $(TARGET) $(OBJS)
重写以上Makefile:
CFLAGS = -Isub -Iadd -O2
OBJS = add/add_int.o add/add_float.o \
sub/sub_int.o sub/sub_float.o main.o
TARGET = cacu
$(TARGET):$(OBJS)
$(CC) -o $@ $^ $(CFLAGS)
$(OBJS):%.o:%.c
$(CC) $< -c $(CFLAGS) -o $@
clean:
-$(RM) $(TARGET) $(OBJS)
k、搜索路径
VPATH=path1:path2:...
VPATH右边是冒号(:)分隔的路径名称。
例如:
VPATH=add:sub (加入add和sub搜索路径)
可以将上面的例子再改写下:
CFLAGS = -Isub -Iadd -O2
OBJSDIR = .objs
VPATH=add:sub:.
OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
TARGET = cacu

$(TARGET):$(OBJSDIR) $(OBJS) (要执行TARGET的命令,先查看OBJSDIR和OBJS依赖 项是否存在
$(CC) -o $(TARGET) $(OBJSDIR)/*.o $(CFLAGS) (将OBJSDIR目录中所有的.o文件链接成cacu

$(OBJS):%.o:%.c (将扩展名为.o的文件替换成扩展名为.c的文件)
$(CC) -c $(CFLAGS) $< -o $(OBJSDIR)/$@ (生成目标文件,存放在OBJSDIR目录中)

$(OBJSDIR):
mkdir -p ./$@ (建立目录,-p选项可以忽略父目录不存在的错误)
clean:
-$(RM) $(TARGET) (删除cacu
-$(RM) $(OBJSDIR)/*.o (删除OBJSDIR下的所有.o文件
0 0