一个通用的makefile写法,自动推导文件的依赖关系
温习之用。
假设有两个头文件目录 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写法,自动推导文件的依赖关系相关推荐
- linux解决make依赖关系,makefile 自动处理头文件的依赖关系
现在我们的Makefile写成这样: all: main main: main.o stack.o maze.o gcc $^ -o $@ main.o: main.h stack.h maze.h ...
- 03 nginx 是如何自动推导文件的 content-type 的
前言 nginx 可以作为一个 静态资源服务器 我们暴露一个 nginx 服务 然后 从浏览器访问 存储的文件, 图片, 视频, html 等等, nginx 可以正确的 设置 Content-Typ ...
- 一个通用的Makefile模板-转
使用前需要在当前目录下建立一个obj文件夹,用来存放中间文件.*.d文件中包含了对应*.c的依赖文件,*.o文件为对应*.c文件的目标文件. 详细的Makfile资料可以看看GNU make中文手册和 ...
- 一个通用的Makefile
https://lidabo.cnblogs.com/p/4521123.html 转载于:https://blog.51cto.com/13471359/2300376
- 一个高级的makefile文件
该Makefile适用于最后生成若干个可执行文件的小型C/C++工程,只要将该Makefile放在源码根目录下make,它会自动查找该目录下(包括子目录)的所有源码文件(支持.cpp .c .h格式) ...
- Makefile写法
概述 -- 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...
- makefile文件中的依赖关系理解
首先,假设当前工程目录为prj/,该目录下有6个文件,分别是:main.c.abc.c.xyz.c.abc.h.xyz.h和Makefile.其中main.c包含头文件abc.h和xyz.h,abc. ...
- Makefile_05:Make命令的自动推导
Make命令的自动推导 一.简化Makefile GNU 的 make 很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必 要去在每一个[.o]文件后都写上类似的命令,因为,我们的 ...
- Makefile之自动生成依赖(8)
Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖. C ...
最新文章
- 怎样预训练GNN能实现更好的迁移效果?
- DevExpress 使用 XtraTabbedMdiManager 控件以 Tab样式加载 Mdi窗体并合并 RibbonControl 解决方案
- 一步步学习SpringBoot(一) 快速搭建一个web
- 首次使用maven的配置过程
- archer mysql源码_自动化运维工具inception+archer
- fiddler和xampp安装成功后,网站打不开的原因
- java cookie p3p_P3P解决cookie存取的跨域问题
- Angular里的按钮事件注册方法一例
- 善用AI技术,旷视发布《人工智能应用准则》
- Python内置函数(7)——sum
- IIS_设置64位机器上的(IIS6/IIS7)兼容32位程序
- 交易系统开发(二)——行情数据
- 国内外游戏运营模式区别
- 计算机windows错误恢复,为什么windows错误恢复?
- 平面的几种的方程表示
- datetime处理日期时间
- 计算机硬盘无法启动怎么办,解决办法:如果计算机无法从硬盘启动怎么办
- 数字电视业务PSI/SI学习系列
- python 文本框不能放表情_用Python自动生成表情包,生活不易多才多艺!
- Unity使用陀螺仪检测屏幕方向
热门文章
- k8s往secret里导入证书_k8s中secret解析
- 【转】Wireshark网络抓包(四)——工具
- 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)
- TFS下的源代码控制
- 计算机出现蓝屏怎么解决,电脑出现蓝屏故障0x00000019怎么办?
- golang 包含 数组_Golang数组类型
- opencv获取图片像素坐标_利用OpenCV从图片中提取矩形并标注坐标(室内平面地图)(一)
- php调用sql数据库代码怎么写,PHP读取SQL文件并导入数据库(示例)
- 【HDU - 6567】Cotree(树形dp,思维)
- 【CodeForces - 670D1 】Magic Powder - 1 (模拟 或 枚举 或二分优化)