Makefile--如何将当前文件下的所有*.cpp文件与*.c文件全部生成相应的可执行文件
我是在平时写源程序的时候看makefile的,平时有个习惯:就是将来几个月可能我会一直学习编程,我会将这个月的每一天使用目录文件保存在父目录下:
然后我想每天晚上想回过头来复习自己今天敲的代码,于是我要先一次性删除这些可执行文件吧,又要一个个的删;然后在一个个的编译很麻烦,然后现在温新C++,当前目录下既有*.c文件又有*.cpp文件,然后使用一个makefile,只能编译一种类型的源文件,因为C/C++本来就是一家人,所以我要想个法子,让当前文件下的所有C/C++源文件生成相应的可执行文件,删除的时候也可以选择删除目标文件,也可以选择删除全部(不包括源文件)。
例如:
这个目录下既有*.cpp文件又有*.c文件,要怎么实现上述的要求?
一、模式匹配
%.c : %.o #表示匹配零个或若干个字符,例:%.h 表示所有以“.h”结尾的文件。
并依次匹配上方依赖,目标也可以是变量 ,这些只能在规则中使用。
必须要记的三个自动变量: $@:当前模式下的目标文件 $<:当前模式下的第一个依赖 $^:当前模式下的所有依赖
二、makefile函数(一般makefile函数都要取返回值,才是有意义的操作)
wildcard( ./*.c) #返回当前目录下的所有 .c 源文件;
例子:src = $(wildcard( ./*.c)) #返回当前目录下的所有 .c 源文件, 并将其存放在变量src中;
obj = $(patsubst( ./%.c, ./%.o, $(src)))
patsubst() 模式匹配字符串替换:将src变量中的所有*.c 文件替换成 *.o 文件 ,$()去变量值,并将他们保存在obj 变量中。
ifdef-endif 、 ifndef-endif 、 ifeq-endif 、 ifneq-endif
ifdef-else-endif 、 ifndef-else-endif 、 ifeq-else-endif 、 ifneq-else-endif
同大多语言中语句类似,依次是非空为真, 空为真, 相等为真, 不相等为真
能够联合else使用, makefile中没有 else if!
$(findstring( <find>, <in> )) 查找字符串函数 ,在字符串<in>中查找<find>子串
三、结合具体的例子
我前期的makefile:
.PHONY : clean all #伪声明
cc = gcc #变量存储
CFLAGS = -Wall -g #编译选项,CFLAGS是make内置的变量
BIN = #这里填写自己的目标文件,且目标文件必须是去除尾缀后的名称
all : $(BIN)
%.o : %.c #模式匹配$(cc) $(CFLAGS) -c $< -o $@ #还有三个必须记忆的自动变量
clean:rm -rf *.o
四、实现
.PHONY:clean all clean_a
src = $(wildcard ./*.c) #获取当前目录下的所有C源文件
targetsc = $(patsubst %.c, %, $(src)) #利用模式匹配将变量名逐个截断成指定形式
objc = $(patsubst %.c, %.o, $(src)) #所有的依赖文件列表, 使用空格分隔srcpp = $(wildcard ./*.cpp) #获取当前目录下的C++源文件
targetscpp = $(patsubst %.cpp, %, $(srcpp)) #利用模式匹配将变量名逐个截断成指定形式
objcpp = $(patsubst %.cpp, %.o, $(srcpp)) #所有的依赖文件列表, 使用空格分隔pp = g++
cc = gccCPPFLAGS = -I ./
CFLAGS = -g -lpthread #若要一次性把当前目录下所有.cpp/.c文件都生成可执行文件 这里要将所有需要链接的库文件都添加进来
#也能使用多个变量,使此来区别链接哪些库!#$(targetsc):%:%.o 表示我要告诉make你需要使用gcc来完成链接操作ifeq ($(findstring .c, $(src)), .c)
all:$(targetsc)
$(targetsc):%:%.o $(cc) $(CFLAGS) $< -o $@
$(objc):%.o:%.c$(cc) $(CPPFLAGS) -c $<
endif#$(targetscpp):%:%.o 表示我要告诉make你需要使用g++来完成链接操作
ifeq ($(findstring .cpp, $(srcpp)), .cpp)
all:$(targetscpp)
$(targetscpp):%:%.o$(pp) $(CFLAGS) $< -o $@
$(objcpp):%.o:%.cpp$(pp) $(CPPFLAGS) -c $<
endifclean:rm -rf $(objc) $(objcpp)
clean_a:rm -rf $(objc) $(objcpp)rm -rf $(targetsc) $(targetscpp)
检测:
PEACE....
Makefile--如何将当前文件下的所有*.cpp文件与*.c文件全部生成相应的可执行文件相关推荐
- android判断某文件下是否you_android判断图片类型 判断文件是否为图片文件 - 电脑常识 - 服务器之家...
android判断图片类型 判断文件是否为图片文件 发布时间:2017-03-15 来源:服务器之家 判断文件是否为图片,仅通过后缀名判断很不全面,如果把一个txt文件后缀改成gif都会被认为是图片, ...
- C#项目解决方案管理器中将*.Designer.cs文件放到*.cs文件下
写C#项目时,会复用到以前项目中的.cs文件:在解决方案管理器中手动添加窗口文件后,*.Designer.cs文件和*.resx文件不会在.cs文件下. 原项目中Form1的设计器文件和资源文件在Fo ...
- 关于Excel下通过VBA实现工作簿文件下工作表的合并
对于普通使用者而言,Excel是一个比较强大的数据处理工具.一般公司的普通职员常使用它来完成数据的录入分析,但是当面对处理经由多人按统一模板统计完成的录入数据分析时,数据将分散存放在多个.xlsx文件 ...
- 将文件夹内多个子文件里的Excel数据合并到一个文件,保存为CSV格式
将文件夹内多个子文件里的Excel数据合并到一个文件,保存为CSV格式 使用条件: Excel文件必须是xlsx格式,且数据结构一致,方可用以下代码. # 第一步 导入模块 import pandas ...
- linux目录下多个文件行数比对函数 关键字遍历文件 linux命令写入C函数
人,一定要有勇气和踏实的态度面对改变和选择!开发,零经验起步! 文件行数比对函数: 输入参数:接口文件绝对路径,日期(格式YYYYMMDD:20150716) 根据路径和日期,分别获取这add.del ...
- Go 学习笔记(49)— Go 标准库之 io/ioutil(读写文件、获取目录下的文件和子目录、创建临时目录和文件)
1. 简要概述 import "io/ioutil" 包 io/ioutil 实现一些 I/O 实用程序函数. 2. 相关函数 2.1 func ReadAll func Read ...
- linux下比较文件并输出,Linux使用diff命令比较文件找出文件之间相同的部分
如果你需要比较系统文件的内容,那么你就会是使用到diff命令,可找出文件之间相同的部分,下面小编就给大家详细介绍下Linux diff命令的用法. diff 命令是 linux上非常重要的工具,用于比 ...
- Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)
#Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分) 在pro文件中添加: #仅在linux 系统下, 硬件平台无关的内容 unix{HEADERS += \ ...
- Linux下程序崩溃dump时的 core文件的使用方法
Linux下程序崩溃dump时的 core文件的使用方法 1.在启动程序前执行 ulimit -c unlimited unlimited 表示生成文件的大小限制,也可以修改为自定义的大小,例如: u ...
- LINUX环境下资源下载中文目录及中文文件名称问题
为什么80%的码农都做不了架构师?>>> http://www.yeeach.com/2009/04/09/linux%E7%8E%AF%E5%A2%83%E4%B8%8B%E ...
最新文章
- 一次被僵尸网络病毒攻击的过程
- android 人生日历,android版人生日历日子怎么用 安卓版人生日历日子使用教程
- NanoPi NEO Air使用六:使用摄像头
- [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题
- bzoj4383(拓扑排序)
- PHP——使用PHPMailer实现PHP发邮件功能
- HashMap中傻傻分不清楚的那些概念
- 什么样的人最适合创业?
- C#中的通用循环缓冲区
- svn基本常见操作设置
- java visualvm 内存泄露_如何使用VisualVM检测Java内存泄漏
- android超级终端使用,android系统超级终端怎么用?
- python胶水语言融合其他语言_1. Python中如何使用其他语言?(python的胶水作用,python又叫胶水语言)...
- 第10章 大数据与云数据库管理
- 由“官方通知”论语音合成,一键合成你想要的语音
- 在平板电脑与移动3G大爆炸的时代 昔日霸主微软的反击
- C语言每日一练——第10天:求一个矩阵主对角线及副对角线元素之和
- 美通企业日报 | IMAX中国票房纪录创年度新高;上海迪士尼将迎来黄色小狗可琦安...
- 机械图样解读——螺旋线与螺旋面
- 科大讯飞麦克风阵列(6麦)上手体验
热门文章
- JavaScript的一些简单代码
- iPhone中国移动收不到彩信,设置方法?
- AI芯片:Edge TPU(谷歌出品)【在边缘(edge)设备上运行的“专用集成芯片”】【量化操作:Edge TPU使用8 位权重进行计算,而通常使用32位权重。所以我们应该将权重从32位转换为8位】
- Zetero+zotfile+坚果云配置
- 微信文件指定应用打开并获取文件路径,以及遇到的一个坑
- 摄像头视场角-对角线视场角-水平视场角
- java font 字体大小_Java字体大小从宽度
- 说说“安规”的那些事儿
- python day2
- 利用Word实现交叉引用或引用尾注添加参考文献图解