您的位置:首页 > 运维架构 > Linux

linux之Makefile(上)

2015-10-07 14:37 375 查看

一、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自动化变量

选项名
作用
$@
规则
4000
的目标文件名

$<
规则的第一个依赖文件名

$^
规则的所有依赖文件列表

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux makefile