Linux系统编程之makefile详解(二)

makefile介绍

Makefile是一种用于自动化构建和编译程序的文本文件。它是一种构建工具,常用于编译和链接源代码文件,生成可执行程序、库文件或其他目标文件。

Makefile通常与GNU Make工具一起使用,该工具根据Makefile中的规则和依赖关系,自动决定哪些文件需要重新编译以及如何进行编译。Makefile使用一种类似于脚本的语法,描述了源文件之间的依赖关系、编译器选项、链接器选项和其他构建相关的指令。

通过Makefile,开发人员可以轻松地定义和管理复杂的项目构建过程,包括编译源代码、生成目标文件、链接库文件、处理依赖关系等。Makefile还可以定义一些常用的命令和任务,如清理临时文件、运行测试等。

Makefile通常由以下几个部分组成:

  1. 变量定义:定义一些变量,用于存储编译器选项、目标文件名、源文件列表等。

  2. 目标规则:定义编译目标和依赖关系。每个目标规则指定一个或多个目标文件以及其依赖文件,以及如何生成目标文件的命令。

  3. 隐式规则:定义一些通用的规则和模式,用于根据文件扩展名自动推导生成目标文件的命令。

  4. 自定义规则和任务:定义一些自定义的规则和任务,如清理目标文件、运行测试等。

通过运行make命令并指定Makefile文件,GNU Make工具会自动读取Makefile中的规则和指令,并根据文件的时间戳和依赖关系,确定需要重新构建的文件,并执行相应的命令。

Makefile是一种强大的工具,可以极大地简化和加快软件项目的构建过程。它广泛应用于C、C++等编程语言的项目中,但也可用于其他类型的项目。

makefile使用

1个规则:若想生成目标,检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来生成该依赖文件。

目标:依赖条件
   (一个tab缩进)命令

touch makefile
vi makefile
hello:hello.c
	gcc hello.c -o hello
make
//如果没有hello.o则会向下找有没有生成hello.o的命令
touch makefile
vi makefile
hello:hello.o
	gcc hello.o -o hello
......
hello.o:hello.c
	gcc -c hello.c -o hello.o
make

检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任意一个被更新,则目标必须更新。最终目标写第一行。ALL:可以指定makefile的终极目标。以下为一个例子:

a.out2:test.o add.o sub.o div1.o mul.o
	gcc test.o add.o div1.o sub.o mul.o -o a.out2

test.o:test.c
	gcc -c test.c -o test.o
add.o:add.c
	gcc -c add.c -o add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
div1.o:div1.c
	gcc -c div1.c -o div1.o
mul.o:mul.c
	gcc -c mul.c -o mul.o

2个函数:
找到当前目录下所有后缀为.c的文件,赋值给src

src = $(wildcard ./*.c)

找到src变量里面所有.c的文件替换成.o

obj = $(patsubst %.c,%.o, $(src))

可以在makefile里面加入clean命令删除

clean:
	 -rm -rf $(obj) a.out
// 终端输入: make clean -n

使用两个函数后:

src = $(wildcard ./*.c) #test.c add.c sub.c div1.c mul.c
obj = $(patsubst %.c,%.o, $(src))
ALL: a.out3

a.out3:$(obj)
	gcc $(obj) -o a.out3

test.o:test.c
	gcc -c test.c -o test.o
add.o:add.c
	gcc -c add.c -o add.o
sub.o:sub.c
	gcc -c sub.c -o sub.o
div1.o:div1.c
	gcc -c div1.c -o div1.o
mul.o:mul.c
	gcc -c mul.c -o mul.o

makefile变量

自动变量:让别的程序员懵逼,增加自己的不可替代性。

$@:表示规则中的目标
$<:表示规则中的第一个条件
$^:表示规则中的所有条件,组成一个列表,以空格隔开,如果有重复项则消除重复项

使用自动变量后:

src = $(wildcard ./*.c) #test.c add.c sub.c div1.c mul.c
obj = $(patsubst %.c,%.o, $(src))
ALL: a.out4

a.out4:$(obj)
	gcc $^ -o $@

test.o:test.c
	gcc -c $< -o $@
add.o:add.c
	gcc -c $< -o $@
sub.o:sub.c
	gcc -c $< -o $@
div1.o:div1.c
	gcc -c $< -o $@
mul.o:mul.c
	gcc -c $< -o $@

模式规则

%.o:%.c
	gcc -c $< -o $@

使用后:

src = $(wildcard ./*.c) #test.c add.c sub.c div1.c mul.c
obj = $(patsubst %.c,%.o, $(src))
ALL: a.out5

a.out5:$(obj)
	gcc $^ -o $@
%.o:%.c
	gcc -c $< -o $@
clean:
	-rm -rf $(obj) a.out

静态模式规则,只对obj对象使用模式规则:

$(obj):%.o:%.c
	gcc -c $< -o $@

伪目标,防止当前文件夹下有与命令重名的关键字

.PHONY : clean ALL
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值