首页 > 代码库 > Makefile学习(一)[第二版]

Makefile学习(一)[第二版]

简介

1)make:利用 make 工具可以自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件[make通过比对相应的.c文件与.o文件的时间];如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。

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

 

Mackfile基本规则

Target ...: Dependencies ...

Command ...

 

说明:

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

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

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

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

 

简单的Mackfile示例

 

#1 最简单

hello:

gcc -o hello hello.c

 

#2 稍微复杂

hello:hello.o

gcc -o hello hello.o

 

hello.o:

gcc -o hello.o -c hello.c

 

#3 进一步完善

hello:hello.o

gcc -o hello hello.o

 

hello.o:

gcc -o hello.o -c hello.c

 

clean:

rm -rf hello.o  #delete file hello.o

 

#4 在Mackfile中执行shell命令[@符号:不输出命令本身]

hello:hello.o

gcc -o hello hello.o

@echo "--------------ok------------"

 

hello.o:

gcc -o hello.o -c hello.c

 

clean:

rm -rf hello.o  #delete file hello.o

 

#5 综合[.PHONY:#显示声明伪目标]

.PHONY: clean

main: main.o sub.o add.o

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

 

main.o: main.c

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

 

add.o: add.c add.h

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

 

sub.o: sub.c sub.h

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

 

clean:

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

 

执行:

1)make #生成第一个目标

2)make clean #“生成”clean伪目标

3)make main.o #仅生成main.o目标

4)make -f Mackfile #显示指定执行的文件名

 

Makefile变量

为了简化和维护Mackfile,可以在Mackfile中使用变量,格式

varname=some_text

引用变量的值:$(varname)

按照惯例,在Mackfile中,变量一般大写

 

 

Makefile自动化变量

选项名

作用

$@

规则的目标文件名

$<

规则的第一个依赖文件名

$^

规则的所有依赖文列表

$*

不包括后缀名的当前依赖文件名

$?

当前目标所依赖的文件列表中比当前目标文件还要新的文件

 

 

#综合示例

.PHONY: clean

.SUFFIXES: .c .o

.c.o:

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

 

OBJECTS = main.o sub.o add.o

SOURCES = $(OBJECTS:.o=.c)

 

main: $(OBJECTS)

    gcc -Wall -g -o $@ $^

 

clean:

    @echo "delete execute file and object file..."

    rm -f $(OBJECTS) main

 

附-

.SUFFIXES:.c .o #表示任何x.c文件与x.o文件关联

 

Make使用隐含推导规则/生成多个可执行文件

#示例-生成多个可执行文件1

.PHONY: clean all 

 

BIN = 01test 02test

 

all: $(BIN)

 

clean:

    -rm -f $(BIN)

 

#示例-生成多个可执行文件2-使用自己定制的规则,生成.o中间文件

.PHONY: clean all 

 

BIN = 01test 02test

OBJECTS = $(BIN:=.o)

 

all: $(BIN)

 

01test.o: 01test.c

02test.o: 02test.c

 

clean:

-rm -f $(BIN) $(OBJECTS)

 

#示例-生成多个可执行文件3-使用更加细致的规则

.PHONY: clean all 

    

CFLAGS = -g -Wall

CC = gcc 

 

BIN = 01test 02test

OBJECTS = $(BIN:=.o)

 

.SUFFIXES: .c .o

.c.o:

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

 

all: $(BIN)

 

01test.o: 01test.c

02test.o: 02test.c

 

clean:

    -rm -f $(BIN) $(OBJECTS)

 

模式规则与后缀规则

%.o:%.c

.c.o:

 

#示例

.PHONY: clean all 

 

CC = gcc 

CFLAGS = -Wall -g

BIN = 01test 02test 

SOURCES = $(BIN:=.c)

OBJECTS = $(BIN:=.o)

 

all: $(BIN)

 

01test: 01test.o

02test: 02test.o

 

#%.o: %.c #模式规则

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

.c.o: #后缀规则,与前作用相同

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

 

clean:

    -rm -rf $(BIN) $(OBJECTS) 


Makefile学习(一)[第二版]