上一篇文章写了如何为在同一个文件夹下的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