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自动化变量
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)
一、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 的目标文件名 |
$< | 规则的第一个依赖文件名 |
$^ | 规则的所有依赖文件列表 |
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 socket 初步
- linux lsof详解
- linux 文件权限
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死