Linux开发工具

--Makefile入门()

一、简介

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

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



二、Makefile基本规则

TARGET(target:目标)… :DEPENDENCIES(dependencies:依赖性,相关性)…

COMMAND(command:命令,指挥) …



说明:

1)目标(TARGET):即最终想要产生的文件,如:可执行文件和目标文件等;目标也可以是要执行的动作,如clean,也称为伪目标。

2)依赖(DEPENDENCIES):为了产生目标文件而依赖的文件列表,一个目标通常依赖于多个文件。

3)命令(COMMAND):是make执行的动作(shell命令或是可在shell下执行的程序)。注意:每个命令行的起始字符必须为TAB字符!(但是在CSDN上因为排版的问题,无法正常显示出来。。。)如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容



三、一个简单的Makefile示例

.PHONY:clean #声明伪目标 phony:假的,欺骗的;假冒者

main:main.oadd.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.cadd.h

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

sub.o:sub.cadd.h

gcc-Wall -g -c sub.c -o sub.o

clean:

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



执行:

1make #生成第一个目标

2makeclean #“生成”clean伪目标

3makemain.o #仅生成main.o目标

4make-f Makefile #指定执行的文件名



四、Makefile自动化变量

选项名

作用

$@

规则的目标文件名

$<

规则的第一个依赖文件名

$^

规则的所有依赖文列表



示例:【文件名Makefile.01

.PHONY:clean

OBJECTS=main.oadd.o sub.o#定义变量

main:$(OBJECTS)

gcc-Wall -g $^ -o main

main.o:main.c

gcc-Wall -g -c $< -o main.o

add.o:add.cadd.h

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

sub.o:sub.cadd.h

gcc-Wall -g -c $< -o sub.o

clean:

rm-f main $(OBJECTS)



执行:make-f Makefile.01

附:如果一条语句在执行Makefile文件时,不想打印出来,则在其前面加上@符号



五、Make编译多个可执行文件

1Make使用隐含推导

示例1

.PHONY:cleanall

BIN=01test02test

all:$(BIN)

clean:

rm-f $(BIN)

示例2

.PHONY:cleanall

BIN=01test02test

all:$(BIN)

01test:01test.o

gcc-Wall -g $< -o $@

02test:02test.o

gcc-Wall -g $< -o $@

clean:

rm-f $(BIN) *.o



2、模式规则

%.o:%.c

3、后缀规则

.c.o:



示例3

.PHONY:cleanall

BIN=01test02test

all:$(BIN)

#%.o:%.c

%.c.o: #与前一条命令作用相同

gcc-Wall -g -c $< -o $@

01test:01test.o

gcc-Wall -g $< -o $@

02test:02test.o

gcc-Wall -g $< -o $@

clean:

rm-f $(BIN) *.o



六、综合运用实例

1

.PHONY:cleanall

CC=gcc

CFLAGS=-Wall-g

BIN=01test02test

all:$(BIN)

#%.o:%.c

.c.o:

$(CC)$(CFLAGS) -c $< -o $@

01test:01test.o

$(CC)$(CFLAGS) $< -o $@

02test:02test.opub.o

$(CC)$(CFLAGS) $< -o $@

clean:

rm-f $(BIN) *.o



2

.PHONY:cleanall

CC=gcc

CFLAGS=-Wall-g

BIN=01test02test 03test

STR=$(CC)$(CFLAGS) -c $< -o $@

STR2=$(CC)$(CFLAGS) $< -o $@

all:$(BIN)

clean:

rm-f $(BIN) *.o