makefile学习个人笔记

Rules

基本形式:

targets : prerequisites
        recipe
        ...
  • targets 要生成的目标文件,或者定义的命令
  • prerequisites targets所需要的输入文件,如果是target是命令的话可以为空
  • recipe 从prerequisites得到target,所执行的动作

参考资料:https://www.gnu.org/software/make/manual/make.html#Rules

Variable

变量的定义有几种方式:’=’,’:=’, ‘?=’.

变量名:=变量值

‘=’是递归展开,’:=’是简单展开

通过$(变量名)使用变量

参考资料:https://www.gnu.org/software/make/manual/make.html#Using-Variables

Wildcast

make使用的通配符(wildcard characters)有:‘*’, ‘?’ , ‘[…]’.

注意 变量定义的时候,通配符不展开,例如

### objects的值是字符串'*.o'
objects = *.o

在target或者prerequisites中使用以上变量object时,会在所在处展开。在recipe中使用时,会在recipe执行的时候展开。要让变量直接在赋值时的话,使用Wildcard 函数

objects := $(wildcard *.o)

参考资料:https://www.gnu.org/software/make/manual/make.html#Wildcards

String substitution

$(patsubst pattern,replacement,text)

text进行操作,把符合pattern的替换成replacement。在pattern中使用%作为通配符,若replacement中也有%,那么%表示pattern的对应文字。

例子:

$(patsubst %.c,%.o,x.c.c bar.c)

得到x.c.o bar.o

参考资料:https://www.gnu.org/software/make/manual/make.html#Text-Functions

Pattern Rules

%.o : %.c
        $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

表示对所有x.c操作,得到x.o

$<$@自动变量(automatic variable)


  • $< 第一个prerequisite的文件名
  • $@ target的文件名

参考资料:https://www.gnu.org/software/make/manual/make.html#Pattern-Rules

同时编译多个可执行文件

默认情况下只会编译链接第一个可执行文件,如果要同时make多个可执行文件,需要定义phony target(伪目标,虚目标),令所要生成的几个可执行文件作为prerequisites. 例如

all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
        cc -o prog1 prog1.o utils.o

prog2 : prog2.o
        cc -o prog2 prog2.o

prog3 : prog3.o sort.o utils.o
        cc -o prog3 prog3.o sort.o utils.o

参考:https://www.gnu.org/software/make/manual/make.html#Phony-Targets

猜你喜欢

转载自blog.csdn.net/X_And_Y/article/details/81290820
今日推荐