layout: post
title:
category : linux系统
tags : [Makefile]

以前写的Makefile,有一些地方不够人性化,头文件或源码文件比较多的情况,要手动输入很多个地方。这次参考了一些资料,完善一下。

存在问题

原来的做法:

# !!!===
INC1 = ./
INC2 = ./inc
INC3 =
INCDIRS := -I$(INC1) -I$(INC2)# !!!===
# source file(s), including c file(s) or cpp file(s)
# you can also use $(wildcard *.c), etc.
SRC_DIR = .
SRC_DIR1 =
SRC_DIR2 =
SRC_DIR3 = # ok for c/c++
SRC = $(wildcard $(SRC_DIR)/*.c $(SRC_DIR)/*.cpp)
SRC+=$(wildcard $(SRC_DIR1)/*.c $(SRC_DIR1)/*.cpp)
SRC+=$(wildcard $(SRC_DIR2)/*.c $(SRC_DIR2)/*.cpp)
SRC+=$(wildcard $(SRC_DIR3)/*.c $(SRC_DIR3)/*.cpp)

从上面内容看到,如果有多个头文件、源码路径的话,要分别添加2个地方。这样工作量比较多。

改进

无意间看到一篇文章:https://spin.atomicobject.com/2016/08/26/makefile-c-projects/,上面提到了用find命令查找,比较好解决上述问题。

头文件部分改为:

# !!!===
# include head file directory here
INC = ./inc
INC := $(shell find $(INC) -type d)
INCDIRS := $(addprefix -I, $(INC))

这样,只需要在INC给定头文件所在目录即可,其它不需要修改了。使用find加上-type d表示将指定目录下所有子目录都作为头文件目录。这样有好有不好,如果目录太多,又不是一定存在头文件,则在编译时会带很多路径。解决此问题也简单,将所有头文件放到inc目录,该目录也可以分不同子目录存放头文件,这是一种折中的方法,在实际中也这样使用。

源码目录改为:

SRC_DIRS = .
SRCS := $(shell find $(SRC_DIRS) -name '*.cpp' -or -name '*.c')

这样修改,可以搜索当前目录下所有子目录的源码文件,包括.c和.cpp文件。

这种做法的好处是,不需要考虑太多的目录层次,但是正因为如此,所有的目录都会被搜索到。

引申应用

由前面引申出来的思考:如果不想搜索所有目录,那就要一一指定哪些目录需要编译了。那么,相应的修改如下:

INC = ./inc ../3rdparty/zlib/inc  # 一一指定哪些是真正的头文件
INCDIRS := $(addprefix -I, $(INC))SRC_DIRS = . ./foo ./bar ./main # 一一指定哪些是真正要编译的目录
SRCS := $(shell find $(SRC_DIRS) -maxdepth 1 -name '*.cpp' -or -name '*.c') # 这里使用-maxdepth 1只搜索一层目录

小结

虽然本次只是修改了一点内容,但便捷性大大提高,而且,即使是多个目录的工程,只要目录设计合适,只需要一个Makefile即可完成编译工作,无须额外的子Makefile。以上涉及的目录,仅做示例而已,具体根据实际情况修改。详细参考https://github.com/latelee/Makefile_templet提交记录。

李迟 2018.7.1

Makefile模板的改进相关推荐

  1. Makefile模板的继续改进

    layout: post title: category : linux系统 tags : [Makefile] 上一文章的Makefile,存在一个比较大的问题,那就是生成可执行的二进制文件时,会链 ...

  2. LINUX驱动Makefile模板

    网上有好多关于驱动的Makefile怎么写,驱动程序怎么运行,为什么驱动会没有main等等问题的问题的问题.下面我也给出我的驱动Makefile模板,这些东东都是在书籍和人家的研究成果上改进而来的,至 ...

  3. 一个适用各类场合的Makefile模板

    1.写在前面 对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了"一键编译",编码完成后只需一个操作即可完成编译.链接.生成目标文件.Linu ...

  4. 一个STM32编译Makefile模板

    最近突然对STM32感兴趣,研究了一下.STM32的编译方式非常多,由于一直对gcc情有独钟,所以还是喜欢使用Makefile+gcc编译的方法.当时从51单片机转向AVR单片机开发时,也是通过这种方 ...

  5. 一个使用多年的Makefile模板

    layout: post title: category : linux系统 tags : [Makefile] 许久以前,一直使用自己总结的Makefile模板,这个模板也是基于现有资料整理而成的. ...

  6. 复杂多目录的Makefile模板及示例

    大约一年多以前,还在移植u-boot,当时参考了u-boot的Makefile,做了一个多目录的Makefile模板.如今,一年过去了,本篇文章还是折腾Makefile模板,本人的水平由此可见一斑.当 ...

  7. 复杂多目录的Makefile模板及示例-转

    大约一年多以前,还在移植u-boot,当时参考了u-boot的Makefile,做了一个多目录的Makefile模板.如今,一年过去了,本篇文章还是折腾Makefile模板,本人的水平由此可见一斑.当 ...

  8. 通用Makefile模板

    #################################################################################################### ...

  9. GNU/Linux智能Makefile模板(多目录,多文件)

    本文提供一个在GNU/Linux环境下通用的智能Makefile模板,用户可以将其引入到自己的工程当中.即使用户对此 Makefile的工作原理不甚了解,但是只需要修改少数几个关键变量,就可以满足不同 ...

最新文章

  1. 我的路子 - 发现游戏为模型的软件架构方式
  2. python转义字符r 列表_通过在列表前面添加反斜杠来转义列表中的保留字符 - python...
  3. oracle追加index,oracle add index
  4. jdbc取款怎样限制条件_京东张亮:我们是怎样打造一款分布式数据库的
  5. user32.dll 函数说明小结
  6. 2010.11.03_ximo_过VMP加壳程序的自效验(vmp 2.06)
  7. 【图像增强】基于matlab直方图均衡化图像增强【含Matlab源码 960期】
  8. python函数.most_common()
  9. RNA 二级结构预测方法
  10. 仿豆果美食tableview的展开和收缩效果
  11. 傻妞旧版合集新版订阅
  12. 零数据分析实习经历如何秋招?
  13. 网络的形成-从原始部落到现代化世界
  14. scrapy爬虫实例:凤凰网
  15. javascript中call的用法总结
  16. 【bzoj1123】[POI2008]BLO
  17. APP端接入支付宝支付接口
  18. 【软考系统架构设计师】计算机组成原理与体系结构章节习题集
  19. linux降级安装补丁,Adobe Shockwave Player降级安装漏洞
  20. 阅兵村里的“白求恩传人”

热门文章

  1. 存在sql注入漏洞的php,TCCMS在app/controller/news.class.php存在sql注入漏洞
  2. PHP 正则表达式资料
  3. 罗永浩宣布年后回归科技界!下一代平台上见 网友:暗示年后“真还传”要完结...
  4. 苏宁易购发全员信:双十一销售目标全面完成 力争11月EBITDA转正
  5. 马斯克回怼世粮署:能公开60亿美元花在哪 就立即卖股票捐款
  6. 罗永浩“真还传”再出番外篇,被执行1800万,交个朋友回应来了…
  7. 阿里拍卖官方客服全面升级 推出一对一教你“一站式服务”
  8. 2020年中国年票房累计已突破122亿元
  9. 广东中山一楼盘在平台直播卖房 4小时售出600套
  10. 摩托罗拉Edge真机谍照曝光:挖孔瀑布屏+骁龙765