Loading

为多个文件夹下的C源代码编写Makefile文件

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

 

posted @ 2017-05-17 20:31  Q1mt  阅读(681)  评论(0编辑  收藏  举报