linux之Makefile(上)


一、 make Makefile 介绍
1、make工具
     利用 make 工具可以 自动完成编译工作 。这些工作 包括 如果仅修改了某几个源文件 ,则只重新编译这几个源文件; 如果某个头文件被修改了 ,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作, 避免不必要的重新编译

2、Makefile 
     make 工具通过一个称为 Makefile 的文件来完成并自动维护编译工作。 Makefile 文件描述了整个工程的编译、连接等规则。

二、Makefile基本规则
1、 TARGET … : DEPENDENCIES … 

  COMMAND

  …

2、 目标( TARGET )程序产生的文件,如 可执行文件和目标文件 ;目标也可以是要执行的动作,如 clean,也称为伪目标 。可以有多个, 一般只有一个
3、 依赖( DEPENDENCIES )是用来产生目标的 输入文件列表 一个目标通常依赖于多个文件
4、 命令( COMMAND )是 make 执行的动作(命令是 shell 命令或是可在 shell 下执行的程序)。 注意:每个命令行的起始字符必须为TAB字符
5、 如果 DEPENDENCIES 中有 一个或多个文件更新 的话, COMMAND就要执行 ,这就是 Makefile 最核心的内容

三、简单的Makefile编写

.PHONY:clean  #防止刚好有clean文件,以致于无法执行clean动作,因此用.PHONY说明是伪目标

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:

  @echo "begin delete ..."

 rm -f main main.o add.o sub.o

注意:.PHONY:clean  #防止刚好有clean文件,以致于无法执行clean动作,因此用.PHONY说明是伪目标


四、Make自动化变量

选项名

作用

$@

规则的目标文件名

$<

规则的第一个依赖文件名

$^

规则的所有依赖文件列表

1、使用规则如下例子所示

main:main.o add.o sub.o

 gcc -Wall -g main.o add.o sub.o -o main


add.o:add.c add.h

 gcc -Wall -g -c add.c -o add.o


(1)首先:OBJECTS=main.o add.o sub.o,定义一个变量
(2)使用变量,$(OBJECTS);main:$(OBJECTS)
(3)$^所有依赖文件列表:$^=main.o add.o sub.o
(4)$@目标文件名:$@=main
(5)$<第一个依赖文件名:$<=add.c
(6)则改为了:
main:$(OBJECTS)
 gcc -Wall -g $^ -o $@
add.o:add.c add.h
 gcc -Wall -g -c $< -o $@

2、举例:
.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:
 rm -f main $(OBJECTS)

3、运行命令
#  make
#  make clean
或者:  #  make clean -f Makefile.1,执行其他的Makefile文件

五、Makefile编译多个可执行文件
1、假设一个Makefile的例子:
.PHONY:clean
BIN=01test 02test
01test:01test.o
 gcc -Wall -g $^ -o $@
02test:02test.o
 gcc -Wall -g $^ -o $@
clean:
 rm -f *.o $(BIN)
(1)执行Makefile文件会自动执行
cc -c -o 01test.o 01test.c
cc -c -o 02test.o 02test.c

2、如果现在我们不想自动执行上述的语句,可以有一下两种方式
(1)、模式规则
%.o:%.c
    gcc -Wall -g -c $< -o $@
表示将当前文件下对应的.c文件生成.o文件(必须要加入-c选项)

(2)、后缀规则
.c.o:
     gcc -Wall -g -c $< -o $@

3、标准的Makefile文件如下:
假设test03需要调用pub.c的文件
解释:all也是伪目标,表示要生成all的文件,应该生成依赖的BIN文件

.PHONY:clean all
CC=gcc
CFLAGS=-Wall -g
BIN=01test 02test 03test
all:$(BIN)
#%.o:%.c
#    $(CC) $(CFLAGS) -c $< -o $@
.c.o:
    $(CC) $(CFLAGS) -c $< -o $@
01test:01test.o
    $(CC) $(CFLAGS) $^ -o $@
02test:02test.o
    $(CC) $(CFLAGS) $^ -o $@
03test:03test.o pub.o
    $(CC) $(CFLAGS) $^ -o $@
clean:
    rm -f *.o $(BIN)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值