工程管理器(makefile)
工程:很多源文件
gcc *.c编译当前文件下所有的文件
make :提高编译许多源文件甚至在不同文件下的源文件的效率
makefile :规定make如何运行,是一种脚本文件,产生脚本语言
脚本:实现批处理
流行的脚本语言:shell,python
makefile三元素:目标,依赖,命令
Make能实现自动编译的原因1. 没有修改过的文件不会再次编译
2.按makefile程序来编译
make中先.c--在.o再.o--可执行原因:
.c--可执行:每次更新都要全部编译
.c--.o--可执行:下次更新,只编译更新的,其他的直接只链接原来的编译结果。提高了运行效率。
真目标:可生成的文件
对gdb中的02.c和debug.h程序进行makefile
http://blog.csdn.net/adlics_r/article/details/51863761
1test : 02.o
2 cc -o test 02.o
3 01.o : 02.c debug.h
4 cc -c 02.c
test和01.o是真目标
伪目标:
.PHONY:clean
clean:
rm -f *.o cal
阴影部分为伪目标
当makefile用makefile1名字时,则用make -f makefile1
可赋值变量:obj1=main.o add.o sub.o mul.o div.o
则 cal_1:$(obj.1)
每个功能下有src (源码) png(图片) doc(文档) lib(库) bin(可执行文件) include(头文件) scripts(脚本文件)
mkdir -p sub/src sub/png sub/doc sub/lib
Makefile的分类:
1.最顶层的总控makefile :进入各个功能子目录里执行make命令,将所有的.o文件链接生成最终可执行文件
2.功能子目录下的makefile:将src目录下的.c文件编译生成.o文件
3.scripts目录的Makeflie:定义许多变量,提高makefile的维护性和可执行性(相当于C语言的头文件)
先看scripts的makefile,再看总的makefile,再各功能的makefile
Makefile两大模型
以下实现加减乘除运算
.
|-- Makefile
|-- add
| |-- Makefile
| |-- doc
| |-- lib
| |-- png
| `-- src
| |-- Makefile
| `-- add.c
|-- div
| |-- Makefile
| |-- doc
| |-- lib
| |-- png
| `-- src
| `-- div.c
|-- main
| |-- Makefile
| |-- doc
| |-- lib
| |-- png
| `-- src
| `-- main.c
|-- mul
| |-- Makefile
| |-- doc
| |-- lib
| |-- png
| `-- src
| `-- mul.c
|-- scripts
| `-- Makefile
`-- sub
|-- Makefile
|-- doc
|-- lib
|-- png
`-- src
`-- sub.c
建立如上图所示的文件其中文件如下所示
main/src/main.c
1 #include <stdio.h>
2
3 int main()
4 {
5 printf("add = %d\n",add(6,3));
6 printf("sub = %d\n",sub(6,3));
7 printf("mul = %d\n",mul(6,3));
8 printf("div = %d\n",div(6,3));
9
10 return 0;
11 }
add/src/add.c
1 int add(int a, int b)
2 {
3 return a + b;
4 }
sub/src/sub.c
1 int sub(int a, int b)
2 {
3 return a -b;
4 }
mul/src/mul.c
1 int mul(int a, int b)
2 {
3 return a * b;
4 }
div/src/div.c
1 int div(int a, int b)
2 {
3 return a / b;
4 }
一、使用函数
先编译scripts下的Makefile
scripts/Makefile
1 CC := gcc
2 CFLAGS := -Wall -O3#优化开启警告
3 Libs = -lpthread#加入库函数pthread
4 Target := client
5 Source := $(wildcard src/*.c)#列出所有src目录下的所有.c文件
6 Objs := $(patsubst %.c,%.o,$(Source))#将所有列出的.c文件变成.o文件
7 Modules += sub add mul div main#将所有文件夹相加同时赋给了Modules这个变量
8 AllObjs := $(addsuffix /src/*.o,$(Modules))#将Modules文件夹下的src下的.o文件赋给AllObjs
编译总控下的Makefile
Makefile:
1 include scripts/Makefile
2
3 modules_make = $(MAKE) -C $(1);#读取总控Makefile,然后去读取各个目录下的子Makefile文件
4 modules_clean = $(MAKE) clean -C $(1);
5
6 .PHONY: all mm mc clean
7
8 all: $(Target)
9
10 mm:
11 @ $(foreach n,$(Modules),$(call modules_make,$(n)))
#将Modules中的值赋给n,执行将n赋给modules_make,即对每个文件夹下执行make
12 mc:
13 @ $(foreach n,$(Modules),$(call modules_clean,$(n)))
14
15 $(Target) : mm
16 $(CC) $(CFLAGS) -o $(Target) $(AllObjs) $(Libs)#编译所有.c文件到.o文件
17 @ echo $(Target) make done!#编译时执行却不显示,打印client make done
18
19 clean : mc
20 rm -rf $(Target)
21 @ echo clean done!
每个文件下的Makefile
add/Makefile, sub/Makefile,mul/Makefile,div/Makefile,main/Makefile
1 include ../scripts/Makefile
2
3 all : $(Objs)#编译所有.c文件到.o文件
4
5 clean :
6 rm -rf $(Objs)
二、不使用函数
先编译scripts下的Makefile
scripts/Makefile
1 CC := gcc
2 CFLAGS := -Wall -O3
3 Libs = -lpthread
4 Target := client
5 Modules += sub add mul div main
6 AllObjs :=sub/src/*.o add/src/*.o mul/src/*.o div/src/*.o main/src/*.o
编译总控下的Makefile
Makefile:
1 include scripts/Makefile
2
3 .PHONY: all mm mc clean
4
5 all: $(Target)
6
7 mm:
8 $(MAKE) -C add
9 $(MAKE) -C sub
10 $(MAKE) -C mul
11 $(MAKE) -C div
12 $(MAKE) -C main
13 mc:
14 $(MAKE) clean -C add
15 $(MAKE) clean -C sub
16 $(MAKE) clean -C mul
17 $(MAKE) clean -C div
18 $(MAKE) clean -C main
19
20
21 $(Target) : mm
22 gcc -Wall -O3 -o client add/src/*.o sub/src/*.o mul/src/*.o div/s rc/*.o main/src/*.o -lpthread
23
24 @ echo $(Target) make done!
25
26 clean : mc
27 rm -rf $(Target)
28 @ echo clean done!
每个文件下的Makefile
add/Makefile,
1 include ../scripts/Makefile
2
3 all :
4 gcc -c src/add.c -o src/add.o
5
6 clean :
7 rm -rf add.o
8
sub/Makefile,
1 include ../scripts/Makefile
2
3 all :
4 gcc -c src/sub.c -o src/sub.o
5
6 clean :
7 rm -rf sub.o
mul/Makefile,
1 include ../scripts/Makefile
2
3 all :
4 gcc -c src/mul.c -o src/mul.o
5
6
7 clean :
8 rm -rf mul.o
9
div/Makefile,
1 include ../scripts/Makefile
2
3 all :
4 gcc -c src/div.c -o src/div.o
5
6 clean :
7 rm -rf div.o
main/Makefile
1 include ../scripts/Makefile
2
3 all :
4 gcc -c src/main.c -o src/main.o
5 clean :
6 rm -rf main.o