zoukankan      html  css  js  c++  java
  • 为多个文件夹下的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
  • 相关阅读:
    高性能Javascript 选择器API学习笔记
    Backbone学习笔记二 Events
    递归用函数、存储过程实现的效果
    用触发器实现动态新增列
    局域网自动备份删除
    游标变量用法经典
    如何区分大小写字母、全角半角
    列的分拆显示
    2005的行列转换
    批量分离和附加数据库
  • 原文地址:https://www.cnblogs.com/zhuandshao/p/6869426.html
Copyright © 2011-2022 走看看