Makefile 变量
为了更好地编写和维护Makefile,在Makefile中通常会使用很多变量。我们可以在Makefile中定义一个变量val,使用使用 $(val) 或 ${val} 的形式去引用它。以上面的Makefile为例:
.PHONY: clean
a.out: hello.o module.o
gcc -o a.out hello.o module.o
hello.o: hello.c
gcc -c -o hello.o hello.c
module.o: module.c
gcc -c -o module.o module.c
clean:
rm -f a.out hello.o
我们可以定义一些变量,分别表示编译器名称、目标、目标依赖文件:
.PHONY: clean
CC = gcc
BIN = a.out
OBJS = hello.o module.o
$(BIN): $(OBJS)
@echo "start compiling..."
@echo $(CC)
$(CC) -o $(BIN) $(OBJS)
@echo "compile done"
hello.o: hello.c
$(CC) -c -o hello.o hello.c
module.o: module.c
$(CC) -c -o module.o module.c
clean:
rm -f $(BIN) $(OBJS)
使用变量的好处是:当项目中需要添加更多的源文件时,你只需要更改OBJS的值就可以了。如果不使用变量的话,你得修改Makefile多处地方。同样的道理,如果你想让程序在其他平台上运行,需要更改编译器时,只需要修改CC变量就可以了,如果不使用CC变量,你就要在程序中多处修改gcc了。
条件赋值
Makefile中的变量赋值有多种形式,比如:
- 条件赋值:?=
- 追加赋值:+=
条件赋值是指一个变量如果没有被定义过,就直接给它赋值;如果之前被定义过,那么这条赋值语句就什么都不做。如下面的语句:
CC = gcc
CC ?= arm-linux-gnueabi-gcc
$(BIN): $(OBJS)
@echo $(CC)
$(CC) -o $(BIN) $(OBJS)
当make解析Makefile,遇到上面的条件赋值语句时,因为CC已经被定义过而且被赋值,所以这个条件语句就会什么都不做。在Makefile中使用echo $(CC)打印变量CC的值,你会发现$(CC)的值是gcc
追加赋值
追加赋值是指一个变量,以前已经被赋值,现在想给它增加新的值,此时可以使用+=追加赋值。如下面的语句:
OBJS = hello.o
OBJS += module.o
就等价于:
OBJS = hello.o module.o
《Makefile工程实践》视频教程,一线开发工程师独家录制,网上首家讲解Makefile的实战课程。从零开始,教你一步一步编写一个工程项目的Makefile,支持使用第三方静态库、动态库,支持指定模块或目录编译生成静态库、动态库,赠送企业级的Makefile模板,学完即可拿来使用,投入项目开发实战,具备独立开展项目开发和管理的能力。详情请点击淘宝链接:Linux三剑客