单源文件目录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 ...
随机推荐
- Mybatis项目构建和CURD操作
Mybatis入门 一.使用SqlSession对象创建Dao接口代理对象进行持久化操作 1.使用maven构建java项目 2.修改pom.xml配置,添加所需jar包坐标 <?xml ver ...
- python应用 曲线拟合04
python应用 曲线拟合04 → 多项式拟合 主要是使用 numpy 库中的 polyfit() 函数,见第 66 行, z = np.polyfit(x_proton, y, 3) ,其中待拟合曲 ...
- jmeter远程调用
jmeter版本相同 JDK版本1.7以上 脚本文件在所有机器上的路径都一致 修改远程机器jmeter bin目录下的jmeter.properties文件配置:server_port=1001 多个 ...
- 《Redis内存数据库》Redis环境搭建
前言 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多 ...
- IT人35岁危机:到底是因为爱还是责任?
互联网蚕食世界,未来属于IT人. 这是属于互联网的时代,每个人都是网络的弄潮儿,由于网络越来越被需要,互联网IT行业被推上了较高的位置,这也导致IT行业的就业环境火热,越来越多的人被IT行业广阔的发展 ...
- 1. QCamera2基础组件——cam_semaphore
/* Copyright (c) 2012, The Linux Foundation. All rights reserved. * * Redistribution and use in sour ...
- P1295 [TJOI2011]书架 线段树优化dp,单调栈
P1295 [TJOI2011]书架 本题思路比较好想(对我来说不是),但代码细节很多,奈何洛谷的题解只有思路,然后就是 没有丝毫解释的代码,让人看起来很头疼(~~ 尤其是像我这样的蒟蒻~~),所以便 ...
- Linux实战(8):查看文件大小
du -sh *
- golang "%p"学习记录随笔
对于获取slice的指针地址, 通过unsafe.Pointer 和 "%p"占位符两种方式得到的地址是不同的 s := make([]int, 1) t.Log(unsafe.P ...
- Docker:常见命令
Docker常见命令(持续更新中): 说明 命令 截图 1 查看Docker版本 Docker -v 2 查看镜像 Docker image ls 3 查看容器 Docker conta ...