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
- makefile基础
- Makefile 基础
- Makefile基础
- Makefile基础
- makefile基础
- makefile 基础
- makefile 基础
- makefile基础
- Makefile基础
- makefile基础
- Makefile基础
- makefile 基础
- Makefile基础
- makefile基础
- Makefile基础
- Makefile基础
- makefile 基础
- Makefile基础
- 清除浮动最好的两种方式
- spring boot(六):如何优雅的使用mybatis
- keytool生成keystore、truststore、证书
- TensorFlow学习笔记(1)--TensorFlow简介,常用基本操作
- Android进阶之RadioButton选中值的获取
- Makefile基础
- iOS扫描二维码与生成二维码
- JDK,JRE,JVM区别与联系
- C#与工业控制-串口下
- 《跟我一起写makefile》(笔记8--makefile中的隐含规则#模式规则#隐含规则变量#自动化变量)
- linux批量替换文件名
- Freeline 让AndroidStudio快的飞起来
- daemon守护进程初识
- sql查询优化