多目录下多文件 makefile编写
前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写;
在做项目时,一般文件都会分几个目录来存放;基本的是 include/ bin/ src/ obj/ lib/ tools/,这几个文件;我先说下我的文件存放目录,用ls -R可以查看到所有文件:./include/common.h ./src/main.c ./src/printStatus.c 就三个文件,其中*.c 文件都依赖于 *.h文件;
同样的先上第一版makefile:
- CC=gcc
- objects=obj/main.o obj/printStatus.o
- bin/main:$(objects)
- $(CC) -o bin/main $(objects)
- obj/main.o:src/main.c include/common.h
- $(CC) -o obj/main.o -c src/main.c -Iinclude
- obj/printStatus.o:src/printStatus.c include/common.h
- $(CC) -o obj/printStatus.o -c src/printStatus.c -Iinclude
- clean:
- 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
- #把所有的目录做成变量,方便修改和移植
- BIN = ./bin
- SRC = ./src
- INC = ./include
- OBJ = ./obj
- #提前所有源文件(即:*.c文件)和所有中间文件(即:*.o)
- SOURCE = $(wildcard ${SRC}/*.c)
- OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE}))
- #设置最后目标文件
- TARGET = main
- BIN_TARGET = ${BIN}/${TARGET}
- CC = gcc
- CFLAGS = -g -Wall -I${INC}
- #用所有中间文件生成目的文件,规则中可以用 $^替换掉 ${OBJECT}
- ${BIN_TARGET}:${OBJECT}
- $(CC) -o $@ ${OBJECT}
- #生成各个中间文件
- ${OBJ}/%.o:${SRC}/%.c
- $(CC) $(CFLAGS) -o $@ -c $<
- .PHONY:clean
- clean:
- find $(OBJ) -name *.o -exec rm -rf {} \; #这个是find命令,不懂的可以查下资料
- rm -rf $(BIN_TARGET)
这个makefile的好处就是通用性,里面不涉及到具体的文件名,当你往src目录中添加新文件时,可以不需要修改makefile,所以这是个非常好的工具;
多目录下多文件 makefile编写的更多相关文章
- 单目录下多文件 makefile编写
makefile很久就接触过了,但是一直没怎么深入的去学习和总结:在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有:知识在于沉淀,这句说的非常好,所以现在把自己理解的东 ...
- java利用WatchService实时监控某个目录下的文件变化并按行解析(注:附源代码)
首先说下需求:通过ftp上传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名. 一. 一开 ...
- .net core 读取本地指定目录下的文件
项目需求 asp.net core 读取log目录下的.log文件,.log文件的内容如下: xxx.log ------------------------------------------beg ...
- linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- Eclipse下无法自动编译,或者WEB-INF/classes目录下没文件,编译失败的解决办法(转载)
文章来源:http://www.cnblogs.com/xfiver/archive/2010/07/07/1772764.html 1. IOException parsing XML docum ...
- PHP 获取指定目录下所有文件(包含子目录)
PHP 获取指定目录下所有文件(包含子目录) //glob — 寻找与模式匹配的文件路径 $filter_dir = array('CVS', 'templates_c', 'log', 'img', ...
- Python遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例
遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例: #-*- encoding: utf-8 -*- __author__ = 'liudong' import linecache,sys ...
- ftp下载目录下所有文件及文件夹内(递归)
ftp下载目录下所有文件及文件夹内(递归) /// <summary> /// ftp文件上传.下载操作类 /// </summary> public class FTPH ...
- Linux下使用shell实现上传linux下某个目录下所有文件到ftp
首先我们需要搞清楚单个文件怎么上传,把这个单文件上传到ftp上的实现命名为一个:upload_to_ftp_command.sh 之后,需要弄清楚怎么实现遍历一个目录下的所有文件的,把这个遍历某个目录 ...
随机推荐
- [转]Ubuntu Tweak 0.8.7 发布:支持 Ubuntu 14.04
原文网址:http://www.oschina.net/news/51054/ubuntu-tweak-0-8-7 这是我开发 Ubuntu Tweak 七年以来第一次没在 Ubuntu 正式发布之前 ...
- 在线服装零售商Betabrand获得650万美元风投 - 投资风向 - 创业邦
在线服装零售商Betabrand获得650万美元风投 - 投资风向 - 创业邦 在线服装零售商Betabrand获得650万美元风投
- <php>文件操作*(重要)
//touch("./3.txt");//创建文件:在当前目录下创建3.txt文件 //copy("./3.txt","./touxiang/5.ph ...
- Python安装MySQLdb并连接MySQL数据库
当然了,前提是你已经安装了Python和MySQL.我的Python是2.6版本的. Python2.6的“Set”有点兼容性问题,自己照着改一下: http://sourceforge.net/fo ...
- 自写图片遮罩层放大功能jquery插件源代码,photobox.js 1.0版,不兼容IE6
阿嚏~~~ 话说本屌丝没啥开发插件的经验,可是天公不作美,公司须要让我自己开发个图片放大的插件 但公司老大的话,宛如吾皇之圣旨,微臣必当肝脑涂地,莫敢不从啊~~~ 于是乎,作为一个超级小白,本人仅仅能 ...
- openssl 非对称加密算法DSA命令详解
1.DSA算法概述 DSA算法是美国的国家标准数字签名算法,它只能用户数字签名,而不能用户数据加密和密钥交换. DSA与RSA的生成方式不同,RSA是使用openssl提供的指令一次性的生成密钥(包括 ...
- (转)Div+CSS布局入门
在网页制作中,有许多的术语,例如:CSS.HTML.DHTML.XHTML等等.在下面的文章中我们将会用到一些有关于HTML的基本知识,而在你学习这篇入门教程之前,请确定你已经具有了一定的HTML基础 ...
- Chinese_PRC_CI_AS and SQL_Latin1_General_CP1_CI_AS类型错误
在编写存储过程时,经常会用到临时表,而且往往会使用临时表与正式表相关联. 当临时表与正式表关联的字段是字符类型的时候,因为临时表创建的字符类型会默认数据库的编码,而正式表的字符编码可能不同,那么这个时 ...
- extjs folder is lost解决方法 和 FineUI主题切换时 iframe内的内容主题不变的解决方法
错误原因:extjs包和FineUI版本不一致 或者是 webconfig配置中 没有设置为任何人可访问 解放方法下载和FineUI版本相同的extjs包就ok了 解决方法:FineUI主题切换时 ...
- 点击推送消息跳转处理(iOS)
当用户点击收到的推送消息时候,我希望打开APP,并且跳转到对应的界面,这就需要在AppDelegate里面对代理方法进行处理. 当用户点击推送消息打开APP的时候会调用 - (BOOL)applica ...