上一篇文章写了如何为在同一个文件夹下的C源代码,本篇文章为多个文件夹下的C源代码编写Makefile文件。
建立两个文件夹,分别为abs与src。其最终目录结构如下:
1 $ ls *
2 jun.c Makefile
3
4 abs:
5 jun.h Makefile qi.c qi.h shao.c
6
7 src:
8 Makefile qianrushi.c qianrushi.h
首先看main函数,只能有一个main函数:
#include<stdio.h>
#include"jun.h"
#include"qi.h"
#include"../src/qianrushi.h"
int main(){
printf("shao");
jun();
qi();
qianrushi();
return 0;
}
qi.c与qi.h:
1 //qi.c
2 #include<stdio.h>
3 void qi(){
4 printf("qi");
5 }
6
7 //qi.h
8 void qi();
jun.c与jun.h:
1 //jun.c
2 #include<stdio.h>
3 void jun(){
4 printf("jun");
5 }
6
7 //jun.h
8 void jun();
src下的qianrushi.c与qianrushi.h:
1 //qianrushi.c
2 #include<stdio.h>
3 void qianrushi(){
4 printf("qianrushi");
5 }
6
7 //qianrushi.h
8 void qianrushi();
为每个文件夹建立一个Makefile文件,使得主Makefile不会太冗杂:
abs文件夹下的Makefie:
1 obj=shao.o qi.o
2 CC=@gcc -c
3
4 .PHONY:all
5 all:$(obj) #要生成多个目标文件,使用伪目标作为终极目标,可以一次生成多个目标文件
6
7 shao.o:shao.c
8 $(CC) shao.c
9 cp shao.o ../
10
11 qi.o:qi.h qi.c
12 $(CC) qi.c
13 cp qi.o ../
14
15 clean:
16 rm *.o
src文件夹下的Makefile:
1 .PHONY:all
2 all:qianrushi.o
3
4 qianrushi.o:qianrushi.h qianrushi.c
5 gcc -c qianrushi.c
6 cp qianrushi.o ../
7
8 clean:
9 rm *.o
主Makefile(与src和abs在同一目录下的Makefile):
1 obj=shao.o jun.o qi.o qianrushi.o
2 cc=@gcc
3 #command=@cd ./
4
5 sum:$(obj)
6 # cd ./abs && $(MAKE)
7 # cd ./src && $(MAKE)
8 $(cc) $(obj) -o sum
9
10 shao.o:
11 @cd ./abs && $(MAKE)
12
13 jun.o:abs/jun.h jun.c
14 $(cc) -c jun.c
15
16 qi.o:
17 @cd ./abs && $(MAKE)
18
19 qianrushi.o:
20 @cd ./src && $(MAKE)
21
22 clean:
23 @rm ./*.o;
24 @rm ./src/*.o;
25 @rm ./abs/*.o;
执行make命令就能生成可执行文件sum:
1 $ ls
2 abs jun.c Makefile src
3 $ make
4 make[1]: Entering directory '......../abs'
5 cp shao.o ../
6 cp qi.o ../
7 make[1]: Leaving directory '......../abs'
8 make[1]: Entering directory '......../src'
9 gcc -c qianrushi.c
10 cp qianrushi.o ../
11 make[1]: Leaving directory '......../src'
12 $ ls -l
13 总用量 44
14 drwxr-xr-x 2 qi qi 4096 5月 17 20:25 abs
15 -rw-r--r-- 1 qi qi 48 5月 17 18:37 jun.c
16 -rw-r--r-- 1 qi qi 1536 5月 17 20:25 jun.o
17 -rw-r--r-- 1 qi qi 329 5月 17 18:42 Makefile
18 -rw-r--r-- 1 qi qi 1552 5月 17 20:25 qianrushi.o
19 -rw-r--r-- 1 qi qi 1536 5月 17 20:25 qi.o
20 -rw-r--r-- 1 qi qi 1736 5月 17 20:25 shao.o
21 drwxr-xr-x 2 qi qi 4096 5月 17 20:25 src
22 -rwxr-xr-x 1 qi qi 8600 5月 17 20:25 sum
23 $ make clean
24 $ ls -l
25 总用量 28
26 drwxr-xr-x 2 qi qi 4096 5月 17 20:26 abs
27 -rw-r--r-- 1 qi qi 48 5月 17 18:37 jun.c
28 -rw-r--r-- 1 qi qi 329 5月 17 18:42 Makefile
29 drwxr-xr-x 2 qi qi 4096 5月 17 20:26 src
30 -rwxr-xr-x 1 qi qi 8600 5月 17 20:25 sum