(七)学会编写一个简单的makefile

tip:当工程大时,每次编译一次,只通过gcc命令一步一步来编译,太复杂,所以我们就需要编写makefile。makefile就相当于我们把编译时的命令写成文件。

1.makefile的基础

(1)命名规则:makefile 或者Makefile
(2)makefile规则三要素:目标,依赖,命令

2.最简单的makefile

vi makefile

makefile中

#目标:依赖条件
#	命令
#一条规则例:
hello:main.c sub.c mul.c
	gcc main.c sub.c mul.c -o hello	

bash中执行

make

3.稍好一点的makefile

上面makefile的问题在于:每次都要编译一遍所有.c文件,当工程很大时可能编译一遍就要一个小时。可不可以只编译修改的文件,然后再链接一下呢?

hello:main.o sub.o mul.o
	gcc main.o sub.o mul.o -o hello

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

sub.o:sub.c
	gcc -c sub.c -o sub.o

mul.o:mul.c
	gcc -c mul.c -o mul.o	

       执行make时,找不到main.o,然后就向下面找到生成main.o的规则执行,编译。当所有依赖都有了之后,最后执行第一条链接命令。当存在没有改动过的的.o文件时便不会执行编译命令。
       那么linux时如何判断这个文件是否被改动过呢?
       原理是通过时间。.c文件如果比.o文件还要新肯定是被修改过的。

4.再稍好一点的makefile

可以看到上面这个makefile有很多相似的规则,写起来没意思。使用模式规则和makefile中的变量可以简化。

target = hello
obj = main.o sub.o mul.o
$(target):$(obj)
	gcc $(obj) -o $(target)

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

解释一下:

target和obj都是变量。$(target)是取target的内容。%.o可以代替main.o/sub.o/mul.o等。

自动变量意思
$<规则中的第一个依赖
$^规则中的所有依赖
$@规则中的目标

5.再再稍好一点的makefile

每次重新编译都要删除所有.o文件可不可以也写入makefile中。

target = hello
obj = main.o sub.o mul.o
$(target):$(obj)
	gcc $(obj) -o $(target)

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

#这是一个伪目标,用于解决也有一个可执行文件叫clean的问题。
.PHONY:clean
clean:
	-rm -f $(target)	$(obj)
#再rm前面加-的目的是,即使这条命令执行失败,忽略这个失败,继续往下执行

bash中执行

make clean

6.最后介绍makefile的俩个函数

以下俩个函数用于编译文件特别多时搜索用的。

#wildcard函数是用来查找当前目录下的所有.c文件,输出一个字符串
src=$(wildcard ./*.c)
#patsubst函数用于替换src字符串中所有的.c换为.o
obj=$(patsubst ./%.c,./%.o,$(src))

tips:makefile的很基本的使用,温故而知新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值