首页 > 学院 > 开发设计 > 正文

Makefile基础

2019-11-10 18:21:09
字体:
来源:转载
供稿:网友
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.hgcc -c -o main.o main.c -Iadd -Isub有一种简便的方法可以实现与上面相同的功能:main.o:%o:%cgcc -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.oTARGET = 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 -O2OBJS = add/add_int.o add/add_float.o /sub/sub_int.o sub/sub_float.o main.oTARGET = cacu$(TARGET):$(OBJS)$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)clean:-$(RM) $(TARGET) $(OBJS)重写以上Makefile:CFLAGS = -Isub -Iadd -O2OBJS = add/add_int.o add/add_float.o /sub/sub_int.o sub/sub_float.o main.oTARGET = 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 -O2OBJSDIR = .objsVPATH=add:sub:.OBJS = add_int.o add_float.o sub_int.o sub_float.o main.oTARGET = 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文件)
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表