多目录下多文件 makefile编写

前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写;

        在做项目时,一般文件都会分几个目录来存放;基本的是  include/  bin/ src/ obj/ lib/ tools/,这几个文件;我先说下我的文件存放目录,用ls -R可以查看到所有文件:./include/common.h    ./src/main.c    ./src/printStatus.c  就三个文件,其中*.c 文件都依赖于 *.h文件;

        同样的先上第一版makefile:

 

[cpp] view plaincopy

 

  1. CC=gcc  
  2. objects=obj/main.o obj/printStatus.o  
  3.   
  4. bin/main:$(objects)  
  5.    $(CC) -o bin/main $(objects)  
  6.   
  7. obj/main.o:src/main.c include/common.h  
  8.    $(CC) -o obj/main.o -c src/main.c -Iinclude  
  9.   
  10. obj/printStatus.o:src/printStatus.c include/common.h  
  11.    $(CC) -o obj/printStatus.o -c src/printStatus.c -Iinclude  
  12.   
  13. clean:  
  14.    rm -rf $(objects) bin/main  

        上面的makefile就是gcc命令的拼凑起来的,下面来分享下比较通用的多目录下的makefile;

 

        在看多目录的makefile时,先来理解下几个函数和变量;

函数:

        wildcard 这是扩展通配符函数,功能是展开成一列所有符合由其参数描述的文 件名,文件间以空格间隔;比如:罗列出src下的所有.c文件:$(wildcard ${SRC}/*.c)

        patsubst 这是匹配替换函数, patsubst ( 需要匹配的文件样式,匹配替换成什么文件,需要匹配的源文件)函数。比如:用src下的*.c替换成对应的 *.o文件存放到obj中:$(patsubst  %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))

        notdir 这是去除路径函数,在上面patsubst函数中已经使用过,去除SOURCE中文件的所有目录,只留下文件名;

 

变量:

        $@:表示目标文件;一般是在规则中这么用:gcc  -o $@  $(object);

        $^:表示所有依赖文件;一般是在规则中这么用:gcc -o $@  $^  ;用所有依赖文件链接成目的文件;

        $<:表示第一个依赖文件;在规则中使用:gcc -o $@ -c $< ;其实这个时候就是每个依赖文件生成一个目的文件;

 

第二版makefile

 

[cpp] view plaincopy

 

  1. #把所有的目录做成变量,方便修改和移植   
  2. BIN = ./bin  
  3.  SRC = ./src  
  4.  INC = ./include  
  5.  OBJ = ./obj  
  6.    
  7. #提前所有源文件(即:*.c文件)和所有中间文件(即:*.o)  
  8.  SOURCE = $(wildcard ${SRC}/*.c)  
  9.  OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE}))  
  10.    
  11. #设置最后目标文件  
  12.  TARGET = main  
  13.  BIN_TARGET = ${BIN}/${TARGET}  
  14.    
  15.  CC = gcc   
  16.  CFLAGS = -g -Wall -I${INC}   
  17.    
  18. #用所有中间文件生成目的文件,规则中可以用 $^替换掉 ${OBJECT}  
  19.  ${BIN_TARGET}:${OBJECT}  
  20.      $(CC) -o $@ ${OBJECT}  
  21.    
  22. #生成各个中间文件  
  23.  ${OBJ}/%.o:${SRC}/%.c   
  24.      $(CC) $(CFLAGS) -o $@ -c $<  
  25.    
  26.  .PHONY:clean  
  27.  clean:  
  28.      find $(OBJ) -name *.o -exec rm -rf {} \; #这个是find命令,不懂的可以查下资料  
  29.      rm -rf $(BIN_TARGET)  

        这个makefile的好处就是通用性,里面不涉及到具体的文件名,当你往src目录中添加新文件时,可以不需要修改makefile,所以这是个非常好的工具;

时间: 2024-09-17 03:42:01

多目录下多文件 makefile编写的相关文章

单目录下多文件 makefile编写

 makefile很久就接触过了,但是一直没怎么深入的去学习和总结:在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有:知识在于沉淀,这句说的非常好,所以现在把自己理解的东西,记录下来,以便后面查阅:         这篇blog要分享的是在单目录下多文件的makefile编写,首先说明当前目录下有多少文件:fun.h   fun.c  main.c  makefile:其中*.c 文件都要依赖 *.h文件:         首先常规编译:         预处理期

编程-[求助]使用java在指定的目录下实现文件的模糊搜索

问题描述 [求助]使用java在指定的目录下实现文件的模糊搜索 一.功能要求: 用户单击"选择地址"按钮,程序自动打开文件夹选择器(如图2),用户选定用户选择目标文件夹后,输入文件名(可包含"*"表示任意连续多个字符,"?"示任意一个字符),选择文件的扩展名.程序自动获取指定目录下满足条件的所有文件,并显示在窗体中(如图1).二.关键技术: 首先获取指定目录下的文件数组,再从该数组中查询满足条件的文件.三.实现的图形用户界面如下: 解决方案 已经

PHP统计目录下的文件总数及代码行数(去除注释及空行)

<?php /** * @author xiaoxiao <x_824@sina.com> 2011-1-12 * @link http://xiaoyaoxia.cnblogs.com/ * @license * 统计目录下的文件行数及总文件数··去除注释 */ $obj = new CaculateFiles(); //如果设置为false,这不会显示每个文件的信息,否则显示 $obj->setShowFlag(false); //会跳过所有All开头的文件 $obj->

前两天有人问怎么取得一个目录下的文件,下面就是例子

<%@ Language=VBScript %><%'================================================================'函数名称:FileList'函数功能:列出目录下所有文件'主要参数说明:'1--FolderUrl     虚拟路径  不可为空'2----FileExName    文件扩展名'函数返回值:收文记录'=====================================================

PHP中读取某个目录下的文件

<?php /*  PHP Version:  28 April 2005  Author:  move2rent  purpose:读取某个目录下的文件 */  //要读取的目录 $folder="H:/temp";  //打开目录$fp=opendir($folder);  //阅读目录while(false!=$file=readdir($fp)){//列出所有文件并去掉'.'和'..'    if($file!='.' &&$file!='..')   

使用python实现正则匹配检索远端FTP目录下的文件

 这篇文章主要介绍了使用python实现正则匹配检索远端FTP目录下的文件的方法,非常的简单实用,需要的小伙伴参考下     遇到一个问题,需要正则匹配远端FTP目录下的文件,如果使用ftp客户端可以通过命令行很容易的做到这一点,但是暂时没有一个工具支持这样的需求,于是通过python对FTP的支持和对正则表达式的支持,写了这么一个简单的工具,用于使用正则表达式来匹配远端目录的文件. 代码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2

PHP遍历并打印指定目录下所有文件实例

 这篇文章主要介绍了PHP遍历并打印指定目录下所有文件实例,需要的朋友可以参考下  代码如下: <?php //功能:遍历并打印指定目录下所有文件   function scan_dir($dir_name,$dir_flag=1) {  static $FILE_COUNT=1;                //记录文件数目 初值为1 目录名称不记  $FILE_COUNT--;                       //每调用一次scan_dir()函数自减1  @$dir_hand

filepath-Pathon 删除指定目录下的文件, 我是coding online,无法调试,代码报错,具体如下:

问题描述 Pathon 删除指定目录下的文件, 我是coding online,无法调试,代码报错,具体如下: #Delete all files under the pointed path import os filePath = raw_input("Input path where you want delete:n") #If file path is null, we should initial the variable "/home" if file

apache 不能访问 cgi-bin目录下的文件

apache 不能访问 cgi-bin目录下的文件 转自:http://www.cnblogs.com/shuang/archive/2008/12/08/1350718.htm 我在本机上配置perl的运行环境老是不成功的原因在于没有去掉httpd.conf中的 ScriptAlias /cgi-bin/ "F:/project/perl/cgi-bin/"前面的"#"(去掉#后还要重起apache,从任务栏的Monitor Apache Servers,否则不起