linux Make 工具 Makefile变量

  • make工具

    1. 工程管理器、管理较多的文件                       

Make 工程管理器也就是个"自动编译管理器",这里的"自动"

是指它能够根据文件时间戳,发现更新过的文件而减少编译工作量同时它通过读入 

Makefile 文件的内容来执行大量的编译工作

2、make工具的作用

当项目中包含了多个.c文件,但只对其中一个文件进行了修改,那用 gcc 编译会将所有的文件从头到尾编译一遍,这样的效率非常低

所以通过 make 工具,可以查找到修改过的文件(根据时间戳),只对修改过的文件进行编译,这样大大减小了编译的时间,提高编译效率

3、Makefile 是 make 读入的唯一配置文件

Makefile是工程文本文件

4、Makefile的编写格式

格式:

目标:依赖

命令

Makefile 根据以下步骤编写:

gcc xx.o -o xx

gcc -c xxx.c -o xx.o

例如:写一个Makefile文件

main: main.o add.o
	gcc main.o add.o -o main
main.o: main.c
	gcc -c main.c -o main.o
add.o: add.c
	gcc -c add.c -o add.o

目标: 伪命令

伪命令它的目的不是创建目标文件,而是执行下面的命令

#第一个版本
main: main.o add.o
	gcc main.o add.o -o main
main.o: main.c
	gcc -c main.c -o main.o
add.o: add.c
	gcc -c add.c -o add.o

.PHONY: clean #.PHONY 告诉电脑clean不是文件
clean:
	rm -rf *.o main

执行:make clean

规则中 rm 命令不是为了创建 clean 这个文件而是执行删除命令。当工作目录中不存在clean 命名文件时,执行 make clean 命令 rm -rf *.o main总会被执行。

如果避免同名文件加 .PHONY:伪命令

linux Make 工具 Makefile变量_第1张图片

二、Makefile 变量

自己定义的变量:一般用大写表示变量名,取变量值用 $(变量名)

1) = 递归方式展开

VAR=hello
SUM=$(VAR) world	# 递归展开,后面 VAR 改变 SUM 也会跟着变
VAR=123

linux Make 工具 Makefile变量_第2张图片

2) :=  直接赋值(当前的值是什么就立即赋值)

linux Make 工具 Makefile变量_第3张图片

3) += 追加新的值

linux Make 工具 Makefile变量_第4张图片

4) ?= 判断之前是否定义,如果定义了,不重新赋值,否则赋值

VAR=hello
SUM:=$(VAR) world	# 直接赋值,后面 VAR 改变 SUM 不会跟着变
VAR=123

SUM+=456	#在后面追加上新的值

SUM?=789	#进行判断,判断之前死否定义,如果定义不能重新赋值,否则赋值

all:
	echo $(VAR)
	echo $(SUM)

预定义变量

系统预定义好的一些变量,可能有默认值也可能没有

RM 文件删除程序的名称,默认值为 rm -f

CC   C编译器的名称,默认值为cc

CPP  C预编译的名称,默认值为$(CC) -E

CFLAGS C编译器的选项,无默认值

OBJS 生成的二进制文件或目标文件,自己定义

#第二个版本
CC=gcc
CFLAGS=-c -g -Wall		#-c编译		-g加调试		-Wall显示警告
OBJS=main.o add.o

main: $(OBJS)
	$(CC) $(OBJS) -o main
main.o: main.c
	$(CC) $(CFLAGS) main.c -o main.o
add.o: add.c
	$(CC) $(CFLAGS) add.c -o add.o

.PHONY: clean
clean:
	$(RM) *.o main

自动变量

$< 第一个依赖文件的名称

$@ 目标文件的完整名称

$^ 所有不重复的依赖文件,以空格分开

#第三个版本
CC=gcc
CFLAGS=-c -g -Wall		#-c编译		-g加调试		-Wall显示警告
OBJS=main.o add.o

main: $(OBJS)
	$(CC) $^ -o $@
main.o: main.c
	$(CC) $(CFLAGS) $< -o $@
add.o: add.c
	$(CC) $(CFLAGS) $< -o $@

.PHONY: clean
clean:
	$(RM) *.o main

可以用%.c和%.o替换所有.c和.o文件

#第四个版本
CC=gcc
CFLAGS=-c -g -Wall		#-c编译		-g加调试		-Wall显示警告
OBJS=main.o add.o

main: $(OBJS)
	$(CC) $^ -o $@
%.o: %.c
	$(CC) $(CFLAGS) $< -o $@

.PHONY: clean
clean:
	$(RM) *.o main

linux Make 工具 Makefile变量_第5张图片

你可能感兴趣的:(linux,c语言)