Makefile基本语法

Makefile的意义:使项目实现自动化生成。
Makefile的作用:指导make按照规则编译和链接程序。

Makefile的工作方式

  • 导入主Makefile
  • 导入主Makefile调用的其他Makefile
  • 初始化文件中的变量
  • 推导隐晦规则,分析所有规则
  • 为所有的目标文件创建依赖关系链
  • 根据依赖关系,确定需要生成的目标
  • 执行生成命令

Makefile的元素

  • 显示规则
  • 隐含规则
  • 变量定义
  • 文件指示
  • 注释

Makefile的规则

一句话概括就是,只编译涉及修改的文件
或者说是,依赖的源文件比目标文件新,则执行规则

规则生成目标,写成如下形式:

目标:依赖的源
	规则

规则前的分隔符要用Tab,不能使用空格,否则会报错。

例:

hello : hello.o
hello.o : hello.c
	cc -c hello.c
clean :
	rm hello hello.o

规则中常用的通配符

变量含义
\*任意一个或者多个字符
?一个字符
[...][0-9]:0~9中任意一个数字;[a b c d]:a b c d中任意一个字符;[^ a b c d]:除a,b,c,d以外的字符
~用户的home目录

隐含变量

变量含义
RMrm -f
ARar
CCgcc
CXXg++
ARFLAGSAR命令的参数
CFLAGSC语言编译器的参数
CXXFLAGSC++语言编译器的参数

Makefile的语法

变量定义

exec = edit
temp = $(exec) $(objects)
objects := main.o other.o
$(exec) : $(objects)
	cc -o $(exec) $(objects)
.....
clean :
	rm $(temp)

注意=:=的区别在于

  • :=:只能使用前面定义好的变量
  • =:可以使用后面定义的变量

自动变量

自动变量含义
$@目标集合
$%当目标是函数库文件时,表示其中的目标文件名
$<第一个依赖目标或逐个目标
$?比目标新的依赖目标集合
$^所有依赖的集合,去除重复的目标
$+所有依赖的集合,不去除重复的目标

变量替换

SRCS := main.c other.c
OBJS := $(SRCS:%.c=%.o)

变量追加值

SRCS := other.c
SRCS += main.c

命令前缀

前缀说明
无前缀输出执行的命令以及命令执行的结果,出错则停止执行
@只输出命令执行的结果,出错则停止执行
-忽略错误,继续执行

引用其他的Makefile

直接include即可

include **/**/Makefile

伪目标

不生成文件,调用的时候需要显示的调用。

.PHONY: clean
clean : 
	-rm $(temp)

clean后面没有依赖,make不会自动执行里面的规则,需要显示地执行make clean

约定的伪目标
伪目标含义
all所有目标的目标,编译所有的目标
clean删除创建的文件
install安装已经编译好的程序
tar源程序打包备份
TAGS更新所有的目标
check或test测试makefile流程

常用参数

参数说明
--debug输出make的调试信息,可以带参数a, b, v
-j 线程数多线程
-C 目录指定读取makefile的目录
-f=makefile指定需要执行的makefile
-i , --ignore-errors执行时忽略所有的错误
-n , --just-print输出执行过程中的命令序列,但不执行

Makefile模板

SOURCE   := $(wildcard *.c) $(wildcard *.cpp)
OBJS     := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))

TARGET   := test

CC	     := gcc
LIBS     :=
LDFLAGS  :=
DEFINES  :=
INCLUDE  := -I.
CFLAGS   := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXXFLAGS:= $(CFLAGS)

.PHONY   : everything objs clean veryclean rebuiild
everything : $(TARGET)
all      : $(TARGET)
objs     :$(OBJS)
rebuild  : veryclean everything
clean	 :
	rm -rf *.so
	rm -rf *.o
veryclean: clean
	rm -rf $(TARGET)
$(TARGET): $(OBJS)
	$(CC) $(CXXFLAGS) -o $@ $(OBJS) S(LDFLAGS) $(LIBS)

Makefile语法进阶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值