美文网首页
小型项目makefile

小型项目makefile

作者: RC_HT | 来源:发表于2019-09-26 10:55 被阅读0次

目录结构

hello_world
├──include
├──src
├──bin
├──obj
├──.dep
├──bin_debug
├──obj_debug
├──.dep_debug
└──makefile

这里bin,obj,.dep,bin_debug,obj_debug,.dep_debug都是makefile自动生成的,方便编辑器只创建src和include目录即可。

区分release版和debug版

默认创建release版:make
指定debug目标创建debug版:make debug

支持自动生成头文件依赖

参考链接:Auto-Dependency Generation

小心使用make clean

这里make clean将会强制递归删除bin,obj,.dep,bin_debug,obj_debug,.dep_debug目录。使用前需确保里面没有需要保留的数据。

makefile

#生成makefile所在的目录的绝对路径
#MAKEFILE_LIST是make工具定义的环境变量,最后一个值就是当前的makefile的启动路径(可能是相对路径)
TOP_DIR := $(patsubst %/, %, $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))

#各项目录
INC_DIR := $(TOP_DIR)/include
SRC_DIR := $(TOP_DIR)/src
BIN_DIR := $(TOP_DIR)/bin
OBJ_DIR := $(TOP_DIR)/obj
DEP_DIR := $(TOP_DIR)/.dep
BIN_DIR_DBG := $(TOP_DIR)/bin_debug
OBJ_DIR_DBG := $(TOP_DIR)/obj_debug
DEP_DIR_DBG := $(TOP_DIR)/.dep_debug

#编译器,链接器
CXX := g++
LD := g++

#生成依赖文件选项
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d
DEPFLAGS_DBG = -MT $@ -MMD -MP -MF $(DEP_DIR_DBG)/$*.d

#编译选项
CXXFLAGS := -std=c++11 -Wall -m64
CXXFLAGS_DBG := -std=c++11 -g -Wall -m64

#宏定义
MACROS :=
MACROS_DBG :=

#链接选项
LDFLAGS :=

#包含的头文件和库文件
INCS :=-I $(INC_DIR)
LIBS :=

#源文件以及中间目标文件和依赖文件
SRCS := $(notdir $(wildcard $(SRC_DIR)/*.cpp))
OBJS := $(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o, $(SRCS)))
DEPS := $(addprefix $(DEP_DIR)/, $(patsubst %.cpp, %.d, $(SRCS)))
OBJS_DBG := $(addprefix $(OBJ_DIR_DBG)/, $(patsubst %.cpp, %.o, $(SRCS)))
DEPS_DBG := $(addprefix $(DEP_DIR_DBG)/, $(patsubst %.cpp, %.d, $(SRCS)))

#最终目标文件
TARGET := $(BIN_DIR)/hello_world
TARGET_DBG := $(BIN_DIR_DBG)/hello_world

#默认最终目标
.PHONY : all
all : $(TARGET)

#debug最终目标
.PHONY : debug
debug : $(TARGET_DBG)

###################################Release#########################################
#生成最终目标(release版)
$(TARGET) : $(OBJS) | $(BIN_DIR)
    $(LD) $(LDFLAGS) $(LIBS) -o $@ $^

#若没有bin目录则自动生成
$(BIN_DIR) :
    mkdir -p $@

#生成中间目标文件(release版)
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp $(DEP_DIR)/%.d | $(OBJ_DIR) $(DEP_DIR)
    $(CXX) -c $(DEPFLAGS) $(CXXFLAGS) $(INCS) $(MACROS) -o $@ $<

#若没有obj目录则自动生成
$(OBJ_DIR) :
    mkdir -p $@

#若没有.dep目录则自动生成
$(DEP_DIR) :
    mkdir -p $@

#依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错
$(DEPS) :

#引入中间目标文件头文件依赖关系
include $(wildcard $(DEPS))

###################################Debug#########################################
#生成最终目标(debug版)
$(TARGET_DBG) : $(OBJS_DBG) | $(BIN_DIR_DBG)
    $(LD) $(LDFLAGS) $(LIBS) -o $@ $^

#若没有bin_debug目录则自动生成
$(BIN_DIR_DBG) :
    mkdir -p $@

#生成中间目标文件(debug版)
$(OBJ_DIR_DBG)/%.o : $(SRC_DIR)/%.cpp $(DEP_DIR_DBG)/%.d | $(OBJ_DIR_DBG) $(DEP_DIR_DBG)
    $(CXX) -c $(DEPFLAGS_DBG) $(CXXFLAGS_DBG) $(INCS) $(MACROS_DBG) -o $@ $<

#若没有obj_debug目录则自动生成
$(OBJ_DIR_DBG) :
    mkdir -p $@

#若没有.dep_debug目录则自动生成
$(DEP_DIR_DBG) :
    mkdir -p $@

#依赖文件会在生成中间文件的时候自动生成,这里只是为了防止报错
$(DEPS_DBG) :

#引入中间目标文件头文件依赖关系
include $(wildcard $(DEPS_DBG))

#删除makefile创建的目录
.PHONY : clean
clean :
    rm -rf $(BIN_DIR) $(OBJ_DIR) $(DEP_DIR) $(BIN_DIR_DBG) $(OBJ_DIR_DBG) $(DEP_DIR_DBG)

相关文章

  • 小型项目makefile

    目录结构 这里bin,obj,.dep,bin_debug,obj_debug,.dep_debug都是makef...

  • Linux-Makefile(一)

    Makefile文件名字需要是Makefile或者makefile.管理一个项目工程,实质上就是管理项目文件间的依...

  • 复杂的 Makefile

    一个 Makefile 针对不同的项目,不同的 CPU,所以这个 Makefile 就会复杂起来。Makefile...

  • QMake概述

    qmake将项目中的文件信息扩展为Makefile,该Makefile执行编译和链接所需的命令。 项目描述 项目由...

  • Makefile 进阶笔记

    1. 项目结构 1. Makefile概览 整体的一个Makefile 如下 2. Makefile头部解析 OP...

  • C++学习第3课,程序结构

    1 类 项目结构 main.c+person.cpp+person.h+Makefile Makefile per...

  • Makefile 的需求

    Makefile 的需求 为什么需要Makefile 一个项目起初可能会有很少的文件与工作,随着项目的推进项目越来...

  • makefile

    项目文件目录为: makefile通用写法:

  • Qt Creator编译android系统下原生的C/C++可执

    ①构建Android平台的纯C/C++项目(注:此步骤后会自动生成Makefile文件); ②修改Makefile...

  • CMake语法-自动编译和链接

    makefile、cmake和shell之间的联系 makefile:帮组我们管理编译项目 CMake是一个跨平台...

网友评论

      本文标题:小型项目makefile

      本文链接:https://www.haomeiwen.com/subject/lzkhyctx.html