(P3)Linux开发工具—Makefle上

1.make与Makefile介绍

  • make工具
    利用make工具可以自动完成编译工作。这些工作包括:
    (1)如果仅仅修改了某几个源文件,则只重新编译这几个源文件;
    (2)如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。
    利用这种自动编译可大大简化开发工作,避免不必要的重新编译
  • Makefile
    make工具通过一个称为Makefile的文件来完成并自动维护编译工作。
    Makefile文件描述了整个工程的编译,连接等规则。

2.Makefile基本规则

  • 规则如下
TARGET...:DEPENDENCIES
	COMMAND
	...1)目标TARGET程序产生的文件,如可执行文件和目标文件,中间文件(.s文件);
目标也可以是要执行的动作,如:clean,也称之为伪目标

(2)依赖DEPANDENCIES是用来产生目标的输入文件列表,一个目标通常依赖于多个文件

(3)命令COMMAND是make执行的动作(命令是shell命令或者是可在shell下执行的程序)。
注意:每个命令行的起始字符必须为TAB字符

(4)如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容

目标文件可以有1个或者多个
依赖文件可以有1个或者多个,也可以没有

3.简单的Makefile编写

  • eg1:03make\01
    文件夹包含的内容:
    在这里插入图片描述
只有main.c有代码,代码如下:
int main(void)
{
    return 0;
}
  • Makefile1
.PHONY:clean		##显示指定clean为一个伪目标,怕该目录下有个clean名字的文件,不能编译
main:main.o add.o sub.o
	gcc -Wall -g main.o add.o sub.o -o main
main.o:main.c
	gcc -Wall -g -c main.c -o main.o
add.o:add.c add.h
	gcc -Wall -g -c add.c -o add.o
sub.o:sub.c sub.h
	gcc -Wall -g -c sub.c -o sub.o
clean:
	rm -f main main.o add.o sub.o
  • Makefile2
.PHONY:clean
OBJECTS=main.o add.o sub.o 
main:$(OBJECTS)
	gcc -Wall -g $^ -o $@
main.o:main.c
	gcc -Wall -g -c $< -o $@
add.o:add.c add.h
	gcc -Wall -g -c $< -o $@
sub.o:sub.c sub.h
	gcc -Wall -g -c $< -o $@
clean:
	@echo "begin delete ..."		##该语句(echo "begin delete ...")不想打印出来,就在最前面加一个@符号
	rm -f main $(OBJECTS)
  • 测试Makefile2
    (1)如果不加@
    在这里插入图片描述
    (2)加@
    在这里插入图片描述
make		直接输入make会执行第一个目标
make main.o			make +目标也可以执行,但是只执行该目标的命令
make makefile		Makefile文件名字也可以是makefile
make clean -f Makefile.1		表示用Makefile.1中的规则来执行,指定Makefile文件

4.Make自动化变量

$@规则的目标文件名
$<规则的第一个依赖文件名
$^规则的所有依赖文件列表
  • eg:见上述03make\01\Makefile2

5.Makefile编译多个可执行文件

  • 模式规则
%.o:%.c
  • 后缀规则
.c.o:
  • eg:03make\02
    (1)目录如下
    在这里插入图片描述
    (2)文件的内容如下
=========03make\02\01test.c==========
int main(void)
{
    return 0;
}
========================
=================03make\02\02test.c===============
int main(void)
{
    return 0;
}
======================
pub.c和pub.h都为空
  • Makefile1
.PHONY:clean all
BIN=01test 02test		##直接执行:make Makefile
all:$(BIN)				##all也是伪目标,这里并没有给01test,02test是如何生成的,编译器会自动推导,
clean:			    	##会将同名的.c文件生成同名的可执行文件,eg:01test.c生成01test
    rm -f $(BIN)
  • Makefile2
.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g 
BIN=01test 02test		
all:$(BIN)          ##all代表第一个终极目标
%.o:%.c            ##将对应的.c文件生成对应的.o文件,等价于.c.o:
    $(CC) $(CFLAGS) -c $< -o $@
01test:01test.o
    $(CC) $(CFLAGS)  $^ -o $@ ##生成可执行文件不需要-c
02test:02test.o pub.o           ##若02test还依赖pub模块(pub.c,pub.h)
    $(CC) $(CFLAGS) $^ -o $@
clean:			    	
    rm -f $(BIN) *.o
  • 测试:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢打篮球的普通人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值