zoukankan      html  css  js  c++  java
  • 第十二章 多目录程序的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书写的范例,现在如果要把上面的源文件换成库文件 也很容生成。 有兴趣的朋友可以尝试书写,本代码已经经过本人测试。

      

  • 相关阅读:
    网页图片垂直剧中 等比例缩放 黑白显示
    vs.net打包(自动检测环境并安装.net framwork)
    22个所见即所得在线Web编辑器
    js验证表单大全3
    js验证表单大全2
    开源界的5大开源许可协议
    ffmpeg参数使用说明2
    ffmpeg参数使用说明1
    js验证表单大全1
    【从零开始学Spring笔记】注解和XML整合开发
  • 原文地址:https://www.cnblogs.com/wolfrickwang/p/3193824.html
Copyright © 2011-2022 走看看