• 第十二章 多目录程序的Makefile


      注意:本章使用第十一章的源码 直接编译生成可执行文件 不在生成库

       一种简单的方法就是将所有源文件都设置到VPATH路径下。然后像普通makefile 生成。我们不讨论这种情况。

      

      先来看我们程序的目录组织结构 

      --- main.c

      ---common.h

      ---addsub

             --- add.c

           --- sub.c

      ---muldiv

          --- mul.c

          --- div.c

     

    Makefile组织:

      1、各个子目录单独使用Makefile,主要生成相关的库,或者目标文件;
      
      2、顶层Makefile负责将本目录下源代码文件编译成目标文件,并依次进入各种子目录编译生成相关库文件,最后进行链接,生成可执行文件。
      
      该Makefile关键语句如下:
        
        for dir in $(SUBDIRS)
        do $(MAKE) -C $$dir all || exit 1; 
        done
      
     
       意思是进入指定子目录,并执行子目录的Makefile文件(子目录只负责生成库文件)。
     
     
        
      
     addsub 子目录下makefile  
      
    #*****************************************************************************
    
    #
    
    # Author           :   wolfRickWang
    
    # Date             :   2013/7/17 星期三 13:27:22
    
    #
    
    #****************************************************************************/
    SHELL = /bin/sh
    CC = gcc
    CFLAGS = -c 
    
    SOURCES = add.c sub.c
    OBJECTS = $(SOURCES:.c=.o)
    
    all:$(OBJECTS)
    
    %.o: %.c
        $(CC) $(CFLAGS) $< -o $@
    
    clean:
        rm -f *.o
    
    .PHONY: all clean


     muldiv 子目录下makefile   

    #*****************************************************************************
    
    #
    
    # Author           :   wolfRickWang
    
    # Date             :   2013/7/17 星期三 13:27:22
    
    #
    
    #****************************************************************************/
    SHELL = /bin/sh
    CC = gcc
    CFLAGS = -c 
    
    SOURCES = div.c mul.c
    OBJECTS = $(SOURCES:.c=.o)
    
    all:$(OBJECTS)
    
    %.o: %.c
        $(CC) $(CFLAGS) $< -o $@
    
    clean:
        rm -f *.o
    
    .PHONY: all clean

       主目录makefile     

    #*****************************************************************************
    
    #
    
    # Author           :   wolfRickWang
    
    # Date             :   2013/7/17 星期三 13:27:22
    
    #
    
    #****************************************************************************/
    SHELL = /bin/sh
    CC = gcc
    CFLAGS = -c 
    
    EXECUTABLE = main
    SUBDIRS := muldiv addsub
    
    SOURCES = main.c
    OBJECTS = $(SOURCES:.c=.o)
    
    
    # add all sub obj
    ALLOBJECTS = $(OBJECTS) ./muldiv/mul.o ./muldiv/div.o  ./addsub/add.o ./addsub/sub.o
    
    all : $(EXECUTABLE)
    
    # ALLOBJECTS 这里不能依赖这些文件,因为这些.o 在子目录makefile中生成,再此查找不到也找不到生成它们的方法 所以会出错
    $(EXECUTABLE): $(OBJECTS)  
    for dir in $(SUBDIRS); do make -C $$dir all || exit 1; done $(CC) $(ALLOBJECTS) -o $@ %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: for dir in $(SUBDIRS); do make -C $$dir clean|| exit 1; done rm -f *.o $(EXECUTABLE) .PHONY: all clean

     上面基本展示了一个多目录MAKEFILE书写的范例,现在如果要把上面的源文件换成库文件 也很容生成。 有兴趣的朋友可以尝试书写,本代码已经经过本人测试。

      

  • 相关阅读:
    每日一题力扣520 判断大小写
    每日一题力扣434
    每日一题力扣557
    每日一题力扣344 反转字符串
    每日一题力扣125 回文字符串
    每日一题力扣541
    每日一题力扣58
    【20211015】项目成本粗略分析
    【20211013】连岳摘抄
    【20211014】自己就是解决问题的起点
  • 原文地址:https://www.cnblogs.com/wolfrickwang/p/3193824.html
Copyright © 2020-2023  润新知