该Makefile适用于最后生成若干个可执行文件的小型C/C++工程,只要将该Makefile放在源码根目录下make,它会自动查找该目录下(包括子目录)的所有源码文件(支持.cpp .c .h格式)并自动生成正确的依赖关系,并且为了不污染源码文件夹,源码和编译过程中的中间文件会分开(Debug模式编译生成的中间文件在Debug目录下,Release模式在Release目录下)。

 1 ###########################################################
 2 #
 3 # MAKEFILE FOR C/C++ PROJECT
 4 # Author: Abbey (Abbeychenx@gmail.com)
 5 # Date:   2014/07/07
 6 #
 7 ###########################################################
 8
 9 .PHONY: all clean
10 all:
11
12 # annotation when release version
13 DEBUG       := y
14 TARGET_PROG := main
15
16 # project directory
17 DEBUG_DIR   := ./Debug
18 RELEASE_DIR := ./Release
19 BIN_DIR     := $(if $(DEBUG), $(DEBUG_DIR), $(RELEASE_DIR))
20
21 # shell command
22 CC    := gcc
23 CXX   := g++
24 RM    := rm -rf
25 MKDIR := mkdir -p
26 SED   := sed
27 MV    := mv
28
29 # init sources & objects & depends
30 sources_all := $(shell find . -name "*.c" -o -name "*.cpp" -o -name "*.h")
31 sources_c   := $(filter %.c, $(sources_all))
32 sources_cpp := $(filter %.cpp, $(sources_all))
33 sources_h   := $(filter %.h, $(sources_all))
34 objs        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.o) $(sources_c:.c=.o)))
35 deps        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.d) $(sources_c:.c=.d)))
36
37 # create directory
38 $(foreach dirname,$(sort $(dir $(sources_c) $(sources_cpp))),\
39   $(shell $(MKDIR) $(BIN_DIR)/$(dirname)))
40
41 # complie & link variable
42 CFLAGS     := $(if $(DEBUG),-g -O, -O2)
43 CFLAGS     += $(addprefix -I ,$(sort $(dir $(sources_h))))
44 CXXFLAGS    = $(CFLAGS)
45 LDFLAGS    :=
46 LOADLIBES  += #-L/usr/include/mysql
47 LDLIBS     += #-lpthread -lmysqlclient
48
49 # add vpath
50 vpath %.h $(sort $(dir $(sources_h)))
51 vpath %.c $(sort $(dir $(sources_c)))
52 vpath %.cpp $(sort $(dir $(sources_cpp)))
53
54 # generate depend files
55 # actually generate after object generated, beacasue it only used when next make)
56 ifneq "$(MAKECMDGOALS)" "clean"
57 sinclude $(deps)
58 endif
59
60 # make-depend(depend-file,source-file,object-file,cc)
61 define make-depend
62   $(RM) $1;                                     \
63   $4 $(CFLAGS) -MM $2 |                         \
64   $(SED) 's,\($(notdir $3)\): ,$3: ,' > $1.tmp; \
65   $(SED) -e 's/#.*//'                           \
66          -e 's/^[^:]*: *//'                     \
67          -e 's/ *\\$//'                        \
68          -e '/^$/ d'                           \
69          -e 's/$/ :/' < $1.tmp >> $1.tmp;      \
70   $(MV) $1.tmp $1;
71 endef
72
73 # rules to generate objects file
74 $(BIN_DIR)/%.o: %.c
75         @$(call make-depend,$(patsubst %.o,%.d,$@),[        DISCUZ_CODE_0        ]lt;,$@,$(CC))
76         $(CC) $(CFLAGS) -o $@ -c [        DISCUZ_CODE_0        ]lt;
77
78 $(BIN_DIR)/%.o: %.cpp
79         @$(call make-depend,$(patsubst %.o,%.d,$@),[        DISCUZ_CODE_0        ]lt;,$@,$(CXX))
80         $(CXX) $(CXXFLAGS) -o $@ -c [        DISCUZ_CODE_0        ]lt;
81
82 # add-target(target,objs,cc)
83 define add-target
84   REAL_TARGET += $(BIN_DIR)/$1
85   $(BIN_DIR)/$1: $2
86         $3 $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@
87 endef
88
89 # call add-target
90 $(foreach targ,$(TARGET_PROG),$(eval $(call add-target,$(targ),$(objs),$(CXX))))
91
92 all: $(REAL_TARGET) $(TARGET_LIBS)
93
94 clean:
95         $(RM) $(BIN_DIR)

转载于:https://www.cnblogs.com/ckLXHL/p/3864333.html

一个高级的makefile文件相关推荐

  1. 怎么在Windows下使用Makefile文件

     [推荐阅读] virtio-net 实现机制[一](图文并茂) 浅析linux内核网络协议栈--linux bridge 深度解析linux内核模块编译makefile 前言:如果熟悉在Linux开 ...

  2. Makefile文件详解一(怎么在Windows下使用Makefile文件)

    前言:如果熟悉在Linux开发的话,肯定知道Makefile文件的用处,它给我们带来很多的便利.在Linux系统下并不会像Windows那么多开发工具,在Windows下,只要在开发工具上点击一个按钮 ...

  3. 解析Makefile文件的构建规则

    2019独角兽企业重金招聘Python工程师标准>>> Makefile 编辑一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则 ...

  4. Makefile文件的编写规则

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...

  5. 编写Makefile文件

    续GCC编译器 1.编写Makefile UNIX系统上很多软件包都是使用make程序和Makefile文件来实现自动编译的,make程序的目的就是自动确定一个软件包的哪些部分需要重新编译,并用特定的 ...

  6. 教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的.     当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令 ...

  7. 认识Makefile文件(什么作用,格式怎样,如何工作)

    以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除. 参考博客:Make 命令教程 - 阮一峰的网络日志 一.Makefile文件是什么 Makefile 文件描述了 Linux 系统下 ...

  8. Makefile文件的编写

    文章目录 前言 第一个最简单的 Makefile 文件举例 第二个Makefile示例 第三个Makefile示例 第四个Makefile示例 第五个Makefile示例 总结 前言 Makefile ...

  9. Linux下makefile文件的编写

    在学习如何编写makefile文件之前,我们首先需要了解什么是makefile文件: makefile描述了整个工程的编译和链接等规则.它指明了哪些文件需要先编译,哪写文件需要后编译,哪些文件需要重新 ...

最新文章

  1. 《LeetCode力扣练习》第94题 二叉树的中序遍历 Java
  2. 无法连接到RDP服务器
  3. 只出现一次的数字—leetcode136
  4. (转)Kafka 消费者 Java 实现
  5. 联发科发布天玑9000移动平台 4nm制程 Armv9架构
  6. VC----SDK下对窗口非客户区的操作
  7. 机器学习与深度学习基础概念介绍
  8. 如何双击连上校园网NCUWLAN?---bat+Python3给出了可行性答案
  9. 最强内网穿透工具frp
  10. termux目录_Termux 入门教程:架设手机 Server 下载文件
  11. 使用Mousetrap处理键盘快捷键(keypress.js和jQuery.hotkeys.js的使用)
  12. 基于STM32的物联网语音控制智能家居
  13. WPS加载项系列(3)WPS项目部署
  14. 软件测试220道试题及答案
  15. 用MSYS2安装mingw
  16. 数字取证一 证据固定、文件过滤、文件类型、文件签名、文件哈希
  17. 51单片机学习笔记-2数码管显示
  18. OpenStack unit tests 环境调试
  19. Mysql数据库迁移问题解决方案
  20. Android Studio TV开发教程(二)管理电视控制器

热门文章

  1. 【Linux】一步一步学Linux——ssh-add命令(182)
  2. 和ajax区别_AJAX、Fetch和Axios的细微区别
  3. 两个sql交集_数据库(sql)关键字
  4. python中包的循环导入_具有继承的包中的循环导入依赖项
  5. LVS(3)——针对于真实主机的增删改操作
  6. Android开源底部导航,一个开源JPTabBar for Android,炫酷的底部导航栏
  7. 关于安卓Apk反编译 再编译回来不能正常安装的问题
  8. 输出字母沙漏+对称字符串
  9. 记录 之 跨服务器上传和下载文件
  10. android studio for循环快捷键,Android Studio 快捷键 for Mac OS X