一个高级的makefile文件
该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文件相关推荐
- 怎么在Windows下使用Makefile文件
[推荐阅读] virtio-net 实现机制[一](图文并茂) 浅析linux内核网络协议栈--linux bridge 深度解析linux内核模块编译makefile 前言:如果熟悉在Linux开 ...
- Makefile文件详解一(怎么在Windows下使用Makefile文件)
前言:如果熟悉在Linux开发的话,肯定知道Makefile文件的用处,它给我们带来很多的便利.在Linux系统下并不会像Windows那么多开发工具,在Windows下,只要在开发工具上点击一个按钮 ...
- 解析Makefile文件的构建规则
2019独角兽企业重金招聘Python工程师标准>>> Makefile 编辑一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则 ...
- Makefile文件的编写规则
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...
- 编写Makefile文件
续GCC编译器 1.编写Makefile UNIX系统上很多软件包都是使用make程序和Makefile文件来实现自动编译的,make程序的目的就是自动确定一个软件包的哪些部分需要重新编译,并用特定的 ...
- 教会你如何编写makefile文件
最近一直在学习makefile是如何编写的. 当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令 ...
- 认识Makefile文件(什么作用,格式怎样,如何工作)
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除. 参考博客:Make 命令教程 - 阮一峰的网络日志 一.Makefile文件是什么 Makefile 文件描述了 Linux 系统下 ...
- Makefile文件的编写
文章目录 前言 第一个最简单的 Makefile 文件举例 第二个Makefile示例 第三个Makefile示例 第四个Makefile示例 第五个Makefile示例 总结 前言 Makefile ...
- Linux下makefile文件的编写
在学习如何编写makefile文件之前,我们首先需要了解什么是makefile文件: makefile描述了整个工程的编译和链接等规则.它指明了哪些文件需要先编译,哪写文件需要后编译,哪些文件需要重新 ...
最新文章
- 《LeetCode力扣练习》第94题 二叉树的中序遍历 Java
- 无法连接到RDP服务器
- 只出现一次的数字—leetcode136
- (转)Kafka 消费者 Java 实现
- 联发科发布天玑9000移动平台 4nm制程 Armv9架构
- VC----SDK下对窗口非客户区的操作
- 机器学习与深度学习基础概念介绍
- 如何双击连上校园网NCUWLAN?---bat+Python3给出了可行性答案
- 最强内网穿透工具frp
- termux目录_Termux 入门教程:架设手机 Server 下载文件
- 使用Mousetrap处理键盘快捷键(keypress.js和jQuery.hotkeys.js的使用)
- 基于STM32的物联网语音控制智能家居
- WPS加载项系列(3)WPS项目部署
- 软件测试220道试题及答案
- 用MSYS2安装mingw
- 数字取证一 证据固定、文件过滤、文件类型、文件签名、文件哈希
- 51单片机学习笔记-2数码管显示
- OpenStack unit tests 环境调试
- Mysql数据库迁移问题解决方案
- Android Studio TV开发教程(二)管理电视控制器
热门文章
- 【Linux】一步一步学Linux——ssh-add命令(182)
- 和ajax区别_AJAX、Fetch和Axios的细微区别
- 两个sql交集_数据库(sql)关键字
- python中包的循环导入_具有继承的包中的循环导入依赖项
- LVS(3)——针对于真实主机的增删改操作
- Android开源底部导航,一个开源JPTabBar for Android,炫酷的底部导航栏
- 关于安卓Apk反编译 再编译回来不能正常安装的问题
- 输出字母沙漏+对称字符串
- 记录 之 跨服务器上传和下载文件
- android studio for循环快捷键,Android Studio 快捷键 for Mac OS X