makefile写法

makefile写法 规则

三要素:
  • 目标
  • 依赖
  • 命令
语法:
目标:依赖条件
命令
例子:
app:main.c add.c sub.c mul.c gcc main.c add.c sub.c mul.c -o app

改进:
  • 【makefile写法】只是编译修改的部分,是把编译和链接分开执行
    app:main.o add.o sub.o mul.o gcc main.o add.o sub.o mul.o -o appmain.o:main.c gcc -c main.c add.o:add.c gcc -c add.c mul.o:mul.c gcc -c mul.c sub.o:sub.c gcc -c sub.c

工作原理:
  • 默认只生成第一条规则
  • 所以需要把最终的生成目标写在第一条
  • 更新源文件时,会比较目标和依赖的时间关系,如果依赖比目标还晚,就会重新执行命令,
  • 其中一个更新,会导致其他依赖此目标的规则进行执行,最终导致最终的目标被更新
变量:
  • $< : 规则中第一个依赖
  • $@ : 规则中的目标
  • $^ : 规则中所有的依赖
  • 以上三个只能在命令中写
  • % : 模式规则,会做替换,比如用main,add来替换
  • CC : 系统维护的变量 CC = cc = gcc
  • CPPFLAGS : 预编译(头文件展开,宏替换,去掉注释)的选项
  • CFLAG : 编译时的选项 -L -g
  • 全大写是内部维护变量
app:main.o add.o sub.o mul.o gcc main.o add.o sub.o mul.o -o app 等价于 gcc $^ -o $@

obj=main.o add.o sub.o mul.o target=app CC = gcc $(target):$(obj) $(CC) $(obj) -o $(target)%.o:%.c $(CC) -c $< -o $@

函数:
  • 一定有返回值
obj=main.o add.o sub.o mul.o target=app #获取所有.c文件的函数wildcard,用$获取返回值 src=https://www.it610.com/article/$(wildcard ./*.c) #把所有的.c替换成.o obj=$(patsubst ./%.c, ./%.o, $(src)) CC = gcc $(target):$(obj) $(CC) $(obj) -o $(target)%.o:%.c $(CC) -c $< -o $@

obj=main.o add.o sub.o mul.o target=app #获取所有.c文件的函数wildcard,用$获取返回值 src=https://www.it610.com/article/$(wildcard ./*.c) #把所有的.c替换成.o obj=$(patsubst ./%.c, ./%.o, $(src)) CC = gcc $(target):$(obj) $(CC) $(obj) -o $(target)%.o:%.c $(CC) -c $< -o $@#伪目标,不会进行更新时间的比较,防止在文件夹下有clean文件,导致clean无法执行 .PHONYLclaen clean: #命令前面加上-意思是命令执行错误也继续执行 -mkdir /aa rm $(obj) $(target)

    推荐阅读