温习之用。

假设有两个头文件目录 header1,header2;两个cpp文件目录,src1,src2,一个lib目录

写一个完整的makefile步骤如下:

1 定义可执行文件的名称

TARGET =MyPro

2 指定此编译工程所要使用的头文件所在的目录

INC = -I. -Iheader1 -Iheader2

3 指定cpp文件所在的目录

VPATH = .:src1:src2

4 指定所有的cpp文件

SRC_PATH = $(foreachdir,$(subst :, ,$(VPATH)),$(wildcard $(dir)/,*.cpp))

解释:

foreach,subst,wildcard为makefile的内置函数,其中wildcard函数为字符串连接函数,把函数中的两个参数连接成一个subst是字符串替换函数,在此句中意思是把VPATH变量中的冒号替换成空格。foreach函数,就是把subst函数的返回值,以空格为分隔符,循环取值赋给dir,然后接受wildcard的处理

这句的总体意思是:从VPATH中获取每个目录,并分别找出此目录下所有的cpp文件,赋给SRC_PATH变量。

5 定义中间object文件存放的目录。

OBJ_DIR = ./obj

6 所有的object文件要按照和源代码对应的目录存放,定义object文件的目录

OBJ_PATH = $(addprefix $(OBJ_DIR)/,   $(subst :,,$(VPATH) )  )

解释:

addprefix函数是加前缀的函数,词句中是给VPATH中所有已经定义的目录加上./obj/的前缀

7 定义连接成目标文件所需要的所有的object文件的名称

OBJS = $(addprefix $(OBJ_DIR),$(subst.cpp,.o,$(SRC_PATH)))

8 创建一个object文件的目录

MAKE_OBJECT_DIR := $(shell mkdir -p $(OBJ_DIR)$(OBJ_PATH))

*************************

9 定义实用的编译器

CXX = g++

CXXFLAGS = -g

10 定义目标文件的生成规则

$(TARGET) : $(OBJS)

$(CXX) -o $@ $(OBJS) $(INC)$(CXXFLAGS)

11 定义object文件的生成方式:

$(OBJ_DIR)/%.o : %.cpp%.cpp.d

 $(CXX) -o $@ -c$< $(INC) $(CXXFLAGS)

12 定义.cpp.d文件的生成方式

 DEPS = $(OBJS:.o=.cpp.d)

$(DEPS) : $(OBJ_DIR)/%.cpp.d : %.cpp

$(CXX) $< -MM$(INC) > $(OBJ_DIR)/$<.d

13 定义清理函数

clean:

@rm -rf./obj

@rm -rf$(TARGET)

至此,一个通用的makefile完成了,如果增加源代码目录和头文件目录,只需要在INC变量和VPATH变量处加上此目录即可。中间object文件和文件的依赖关系自动生成

一个通用的makefile写法,自动推导文件的依赖关系相关推荐

  1. linux解决make依赖关系,makefile 自动处理头文件的依赖关系

    现在我们的Makefile写成这样: all: main main: main.o stack.o maze.o gcc $^ -o $@ main.o: main.h stack.h maze.h ...

  2. 03 nginx 是如何自动推导文件的 content-type 的

    前言 nginx 可以作为一个 静态资源服务器 我们暴露一个 nginx 服务 然后 从浏览器访问 存储的文件, 图片, 视频, html 等等, nginx 可以正确的 设置 Content-Typ ...

  3. 一个通用的Makefile模板-转

    使用前需要在当前目录下建立一个obj文件夹,用来存放中间文件.*.d文件中包含了对应*.c的依赖文件,*.o文件为对应*.c文件的目标文件. 详细的Makfile资料可以看看GNU make中文手册和 ...

  4. 一个通用的Makefile

    https://lidabo.cnblogs.com/p/4521123.html 转载于:https://blog.51cto.com/13471359/2300376

  5. 一个高级的makefile文件

    该Makefile适用于最后生成若干个可执行文件的小型C/C++工程,只要将该Makefile放在源码根目录下make,它会自动查找该目录下(包括子目录)的所有源码文件(支持.cpp .c .h格式) ...

  6. Makefile写法

    概述 -- 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...

  7. makefile文件中的依赖关系理解

    首先,假设当前工程目录为prj/,该目录下有6个文件,分别是:main.c.abc.c.xyz.c.abc.h.xyz.h和Makefile.其中main.c包含头文件abc.h和xyz.h,abc. ...

  8. Makefile_05:Make命令的自动推导

    Make命令的自动推导 一.简化Makefile GNU 的 make 很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必 要去在每一个[.o]文件后都写上类似的命令,因为,我们的 ...

  9. Makefile之自动生成依赖(8)

    Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖. C ...

最新文章

  1. 怎样预训练GNN能实现更好的迁移效果?
  2. DevExpress 使用 XtraTabbedMdiManager 控件以 Tab样式加载 Mdi窗体并合并 RibbonControl 解决方案
  3. 一步步学习SpringBoot(一) 快速搭建一个web
  4. 首次使用maven的配置过程
  5. archer mysql源码_自动化运维工具inception+archer
  6. fiddler和xampp安装成功后,网站打不开的原因
  7. java cookie p3p_P3P解决cookie存取的跨域问题
  8. Angular里的按钮事件注册方法一例
  9. 善用AI技术,旷视发布《人工智能应用准则》
  10. Python内置函数(7)——sum
  11. IIS_设置64位机器上的(IIS6/IIS7)兼容32位程序
  12. 交易系统开发(二)——行情数据
  13. 国内外游戏运营模式区别
  14. 计算机windows错误恢复,为什么windows错误恢复?
  15. 平面的几种的方程表示
  16. datetime处理日期时间
  17. 计算机硬盘无法启动怎么办,解决办法:如果计算机无法从硬盘启动怎么办
  18. 数字电视业务PSI/SI学习系列
  19. python 文本框不能放表情_用Python自动生成表情包,生活不易多才多艺!
  20. Unity使用陀螺仪检测屏幕方向

热门文章

  1. k8s往secret里导入证书_k8s中secret解析
  2. 【转】Wireshark网络抓包(四)——工具
  3. 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)
  4. TFS下的源代码控制
  5. 计算机出现蓝屏怎么解决,电脑出现蓝屏故障0x00000019怎么办?
  6. golang 包含 数组_Golang数组类型
  7. opencv获取图片像素坐标_利用OpenCV从图片中提取矩形并标注坐标(室内平面地图)(一)
  8. php调用sql数据库代码怎么写,PHP读取SQL文件并导入数据库(示例)
  9. 【HDU - 6567】Cotree(树形dp,思维)
  10. 【CodeForces - 670D1 】Magic Powder - 1 (模拟 或 枚举 或二分优化)