单源文件目录makefile
目录结构
由于只是用来编译简单的小型程序,所以目录尽量简洁:
.
├── build
│ ├── bin
│ ├── .dep
│ └── obj
├── makefile
└── src
这里用户需要创建的就只有makefile和src目录(里面放入项目.h和.cpp文件)。
build目录下用于存放编译中间文件和最终的可执行程序,其中.dep用于记录.cpp文件的头文件依赖关系。
自动生成头文件依赖
利用g++命令中推导头文件依赖的功能生成每个.cpp文件对应的.d依赖文件,再将.d依赖文件include到makefile文件中,实现对依赖头文件的检测。
具体原理见:Auto-Dependency Generation
makefile
# 目录结构
# .
# ├── build
# │ ├── bin
# │ ├── .dep
# │ └── obj
# ├── makefile
# └── src
# 获取当前的makefile所在的目录绝对路径
# MAKEFILE_LIST是make工具定义的环境变量,最后一个值就是当前的makefile的启动路径(可以是相对路径)
TOP_DIR:=$(patsubst %/, %, $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
# 各项目录
BIN_DIR:=$(TOP_DIR)/build/bin
DEP_DIR:=$(TOP_DIR)/build/.dep
OBJ_DIR:=$(TOP_DIR)/build/obj
SRC_DIR:=$(TOP_DIR)/src
# 编译器,链接器
CXX:=g++
LD:=g++
# 生成依赖文件选项
DEPFLAGS=-MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
# 编译选项
CXXFLAGS:=-std=c++11 -Wall -Wextra -Og -g
# 宏定义
MACROS:=
# 链接选项
LDFLAGS:=
# 包含的头文件和库文件
INCS:=
LIBS:=
# 源文件以及中间目标文件和依赖文件
SRCS:=$(notdir $(wildcard $(SRC_DIR)/*.cpp))
OBJS:=$(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SRCS)))
DEPS:=$(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d, $(SRCS)))
# 最终目标文件
TARGET:=$(BIN_DIR)/hello
# 默认最终目标
.PHONY:all
all:$(TARGET)
# 生成最终目标
$(TARGET):$(OBJS) | $(BIN_DIR)
@echo -e "\e[32m""Linking executable $(TARGET)""\e[0m"
@$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
# 若没有bin目录则自动生成
$(BIN_DIR):
@mkdir -p $@
# 生成中间目标文件
$(OBJ_DIR)/%.o:$(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
@echo -e "\e[33m""Building object $@""\e[0m"
@$(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(MACROS) -o $@ $<
# 若没有obj目录则自动生成
$(OBJ_DIR):
@mkdir -p $@
# 若没有.dep目录则自动生成
$(DEP_DIR):
@mkdir -p $@
# 依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错
$(DEPS):
# 引入中间目标文件头文件依赖关系
include $(wildcard $(DEPS))
# 删除build目录
.PHONY:clean
clean:
@rm -rf $(TOP_DIR)/build
单源文件目录makefile的更多相关文章
- SpringCloud系列九:SpringCloudConfig 基础配置(SpringCloudConfig 的基本概念、配置 SpringCloudConfig 服务端、抓取配置文件信息、客户端使用 SpringCloudConfig 进行配置、单仓库目录匹配、应用仓库自动选择、仓库匹配模式)
1.概念:SpringCloudConfig 基础配置 2.具体内容 通过名词就可以发现,SpringCloudConfig 核心作用一定就在于进行配置文件的管理上.也就是说为了更好的进行所有微服务的 ...
- cmake处理多源文件目录的方法
cmake处理源代码分布在不同目录中的情况也很简单,现在假设我们的源代码分布情况如下: 源代码的分布情况 其中src目录下的文件要编译成一个链接库 第一步,项目主目录中的CMakelist.txt 在 ...
- cmake处理多源文件目录
cmake处理多源文件目录 假设我们的源文件全部在src中,则我们需要在子文件src中建立文件CmakeLists.txt,内容如下: AUX_SOURCE_DIRECTORY(. DIR_TEST_ ...
- cmake处理多源文件目录的方法(转)
cmake处理源代码分布在不同目录中的情况也很简单,现在假设我们的源代码分布情况如下: 源代码的分布情况 其中src目录下的文件要编译成一个链接库 第一步,项目主目录中的CMakelist.txt 在 ...
- Makefile 指定源文件目录 make
top=$(CURDIR) SRC_DIR=$(top)/src BUILD_DIR=$(SRC_DIR) src=$(wildcard $(SRC_DIR)/*.c) obj=$(patsubst ...
- [Makefile]多目录Makefile写法
最近需要写一个测试程序,这个测试程序需要集成一些功能,写在同一个文件看上去很不好,多个文件的Makefile又不是很熟,于是分享下面这篇文章 先介绍下,调试Makefile时,想知道某个变量的值,怎么 ...
- 了解FreeRTOS源文件目录结构
参考文献: Understanding the FreeRTOS directory structure. 从官网下载下来的FreeRTOS源文件包,对于每一个已经移植完成的处理器,都有一个与之对应的 ...
- buildroot 使用小记 - 2 源文件目录结构
官方下载下来的buildroot源码包在解压后,是一个名为buildroot的文件夹,它下面的目录/文件结构如下: Makefile - 顶级makefile,编译总入口 Config.in - 顶级 ...
- 通用多目录makefile的写法
我的项目文件层次是:项目名称/include.output.src src/admin.stu.tch.common 最外层的Makefile: DEBUG = yMYDEBUG = DEBUGife ...
随机推荐
- 【高并发】Redis如何助力高并发秒杀系统,看完这篇我彻底懂了!!
写在前面 之前,我们在<[高并发]高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!>一文中,详细讲解了高并发秒杀系统的架构设计,其中,我们介绍了可以使用Redis存储秒杀商品的库存数量.很 ...
- 如何借助 IDEA 数据库管理工具可视化使用 TDengine?
什么是IDEA Database管理工具? 这里首先介绍下IDEA,IDEA全称IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的Java开发工具之一. I ...
- Book of Shaders 02 - 矩阵:二维仿射变换练习
0x00 一些废话 如果要深入学习 CG (Computer Graphics,计算机图形学),必然要学习相关的数学知识.CG 涉及到多个不同的领域,根据所研究领域的不同,也会涉及到不同的数学分支.但 ...
- linux之磁盘整理
yum安装的时候报错没有磁盘空间,需要整理 就需要查看下目前的磁盘使用情况 首先是df -hl查看从磁盘使用 可以到根目录下看看文件夹大小 du -sh * 或者下面的命令 接下来我们要删除东西整理磁 ...
- archaius(4) 属性对象
讲完上一节,我们就可以使用合理的配置管理器或者实现自己的配置管理来管理我们的配置项了.archaius还提供了一种新的配置使用的方式. 动态属性对象 动态属性对象针对每个配置项以对象方式进行操作,并且 ...
- nacos快速安装
一 什么是 Nacos 服务注册中心和配置中心. 二 使用 下载和启动 使用有两种方式 1.自己下载源码编译 2.下载编译好的压缩包 我比较懒选择了第二种方式. 最新稳定版本 下载地址:https:/ ...
- ES6 常用总结——第三章(数组、函数、对象的扩展)
1.1. Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结 ...
- B树【Balanced-Tree】
一.引言 B树是二叉平衡树的一个变种,在学习之前,我们先了解一下二分法,二叉树的一些相关的基本概念,有助于我们更好的理解B树~ 二.二叉树 定义:二叉树即二叉平衡树 意义:通过二分法来进行元素查找,时 ...
- 搭建Linux服务器
工欲善其事必先利其器, 虚拟机:百度云链接地址:https://pan.baidu.com/s/1_nWQh3WKF7xLs5-nmbZ8lA (Vmware 12 ) Linux 7:百度云链接 ...
- WEB通信及前后端组成
NDS(域名系统) 按个人的理解,就是将域名和IP映射,通过输入域名,DNS 找到对应的域名的IP地址,即可访问. NDS请求步骤: 当用户输入域名(例:www.baidu.com),回车那一刻: 1 ...