我是在平时写源程序的时候看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文件全部生成相应的可执行文件相关推荐

  1. android判断某文件下是否you_android判断图片类型 判断文件是否为图片文件 - 电脑常识 - 服务器之家...

    android判断图片类型 判断文件是否为图片文件 发布时间:2017-03-15 来源:服务器之家 判断文件是否为图片,仅通过后缀名判断很不全面,如果把一个txt文件后缀改成gif都会被认为是图片, ...

  2. C#项目解决方案管理器中将*.Designer.cs文件放到*.cs文件下

    写C#项目时,会复用到以前项目中的.cs文件:在解决方案管理器中手动添加窗口文件后,*.Designer.cs文件和*.resx文件不会在.cs文件下. 原项目中Form1的设计器文件和资源文件在Fo ...

  3. 关于Excel下通过VBA实现工作簿文件下工作表的合并

    对于普通使用者而言,Excel是一个比较强大的数据处理工具.一般公司的普通职员常使用它来完成数据的录入分析,但是当面对处理经由多人按统一模板统计完成的录入数据分析时,数据将分散存放在多个.xlsx文件 ...

  4. 将文件夹内多个子文件里的Excel数据合并到一个文件,保存为CSV格式

    将文件夹内多个子文件里的Excel数据合并到一个文件,保存为CSV格式 使用条件: Excel文件必须是xlsx格式,且数据结构一致,方可用以下代码. # 第一步 导入模块 import pandas ...

  5. linux目录下多个文件行数比对函数 关键字遍历文件 linux命令写入C函数

    人,一定要有勇气和踏实的态度面对改变和选择!开发,零经验起步! 文件行数比对函数: 输入参数:接口文件绝对路径,日期(格式YYYYMMDD:20150716) 根据路径和日期,分别获取这add.del ...

  6. Go 学习笔记(49)— Go 标准库之 io/ioutil(读写文件、获取目录下的文件和子目录、创建临时目录和文件)

    1. 简要概述 import "io/ioutil" 包 io/ioutil 实现一些 I/O 实用程序函数. 2. 相关函数 2.1 func ReadAll func Read ...

  7. linux下比较文件并输出,Linux使用diff命令比较文件找出文件之间相同的部分

    如果你需要比较系统文件的内容,那么你就会是使用到diff命令,可找出文件之间相同的部分,下面小编就给大家详细介绍下Linux diff命令的用法. diff 命令是 linux上非常重要的工具,用于比 ...

  8. Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)

    #Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分) 在pro文件中添加: #仅在linux 系统下, 硬件平台无关的内容 unix{HEADERS += \ ...

  9. Linux下程序崩溃dump时的 core文件的使用方法

    Linux下程序崩溃dump时的 core文件的使用方法 1.在启动程序前执行 ulimit -c unlimited unlimited 表示生成文件的大小限制,也可以修改为自定义的大小,例如: u ...

  10. LINUX环境下资源下载中文目录及中文文件名称问题

    为什么80%的码农都做不了架构师?>>>    http://www.yeeach.com/2009/04/09/linux%E7%8E%AF%E5%A2%83%E4%B8%8B%E ...

最新文章

  1. 一次被僵尸网络病毒攻击的过程
  2. android 人生日历,android版人生日历日子怎么用 安卓版人生日历日子使用教程
  3. NanoPi NEO Air使用六:使用摄像头
  4. [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题
  5. bzoj4383(拓扑排序)
  6. PHP——使用PHPMailer实现PHP发邮件功能
  7. HashMap中傻傻分不清楚的那些概念
  8. 什么样的人最适合创业?
  9. C#中的通用循环缓冲区
  10. svn基本常见操作设置
  11. java visualvm 内存泄露_如何使用VisualVM检测Java内存泄漏
  12. android超级终端使用,android系统超级终端怎么用?
  13. python胶水语言融合其他语言_1. Python中如何使用其他语言?(python的胶水作用,python又叫胶水语言)...
  14. 第10章 大数据与云数据库管理
  15. 由“官方通知”论语音合成,一键合成你想要的语音
  16. 在平板电脑与移动3G大爆炸的时代 昔日霸主微软的反击
  17. C语言每日一练——第10天:求一个矩阵主对角线及副对角线元素之和
  18. 美通企业日报 | IMAX中国票房纪录创年度新高;上海迪士尼将迎来黄色小狗可琦安...
  19. 机械图样解读——螺旋线与螺旋面
  20. 科大讯飞麦克风阵列(6麦)上手体验

热门文章

  1. JavaScript的一些简单代码
  2. iPhone中国移动收不到彩信,设置方法?
  3. AI芯片:Edge TPU(谷歌出品)【在边缘(edge)设备上运行的“专用集成芯片”】【量化操作:Edge TPU使用8 位权重进行计算,而通常使用32位权重。所以我们应该将权重从32位转换为8位】
  4. Zetero+zotfile+坚果云配置
  5. 微信文件指定应用打开并获取文件路径,以及遇到的一个坑
  6. 摄像头视场角-对角线视场角-水平视场角
  7. java font 字体大小_Java字体大小从宽度
  8. 说说“安规”的那些事儿
  9. python day2
  10. 利用Word实现交叉引用或引用尾注添加参考文献图解