三、Makefile规则、变量的定义和使用

1 Makefile文件是什么

  可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。

# 例程所用文件的结构
-----Lieryang
       |_________main.c
       |_________main.h
       |_________add.c
       |_________minus.c
       |_________Makefile

2 Makefile的工作流程

  创建一个包含有多个源文件和Makefile的目录文件,源文件之间相互关联。在Makefile中添加下面代码:

main: main.o test1.o test2.o
	gcc main.o test1.o test2.o -o main
main.o : main.c test.h
	gcc -c main.c -o main.o
test1.o : test1.c test.h
	gcc -c test1.c -o test1.o
test2.o : test2.c test.h
	gcc -c test2.c -o test2.o
# targets:规则的目标,可以是Object File(一般称它为中间文件),也可以是可执行文件,还可以是标签。
# prerequisites:是我们的依赖文件,要生成targets需要的文件或者是目标。
# command 需要执行的命令(任意shell命令)
targets:prerequisites
	command

  左边是目标文件,右边是依赖文件。默认情况下make执行的是Makefile文件中的第一个规则(Makefile中出现的第一个依赖关系),此规则的第一目标称之为“最终目标”或者是“终极目标”。

3 清除工作目录中的过程文件

  其中clean是一个目标,它是独立的,不会与第一个目标文件相关联,所以我们在执行make的时候也不会执行下面的命令。在shell中执行“make clean”命令,编译时的中间文件和生成的最终目标文件都会被清除,方便我们下次使用。

.PHONY:clean
clean:
	rm -rf *.o main

4 变量的定义和使用

Makefile文件中定义变量的基本语法如下: 变量名称=值列表。调用变量的时候可以用" $(VALUE_LIST) " 或者 ${VALUE_LIST}。

OBJS=main.o add.o minus.o
TARG=test
$(TARG):$(OBJS)
	gcc $(OBJS) -o $(TARG)
符合含义
简单赋值(:=)编程语言中常规理解的赋值方式,只对当前语句的变量有效
递归赋值(=)赋值语句可能影响多个变量,所有目标变量相关的其他变量都受影响
条件赋值(?=)如果变量未定义,则使用符号中的值定义变量(如果变量已赋值,则赋值语句无效)
追加赋值(+=)原变量用空格隔开的方式追加一个新值

4.1 简单赋值

# Makefile
x:= foo
y:= $(x)b

x:= new
test:
        @echo "y = $(y)"
        @echo "x = $(x)"

输出结果

y = foob
x = new

4.2 递归赋值

x= foo
y= $(x)b

x= new
test:
        @echo "y = $(y)"
        @echo "x = $(x)"

输出结果

y = newb
x = new

4.3 条件赋值

x:= foo
y:= $(x)b

x?= new
test:
        @echo "y = $(y)"
        @echo "x = $(x)"

输出结果

y = foob
x = foo

4.4 追加赋值

x:= foo
y:= $(x)b
x+= $(y)
test:
      @echo "y = $(y)"
      @echo "x = $(x)"

输出结果

y = foob
x = foo foob

参考

参考1:如何系统地学习 Makefile 相关的知识(读/写)?
参考2:Makefile变量的定义和使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值