一个能自己主动搜索源文件并自己主动推导的Makefile
今天看了一天的makefile的写法。东拼西凑。好不easy写出了一个makefile。颇有成就感,记录下来,以备温习之用。
如果有两个头文件文件夹 header1,header2;两个cpp文件文件夹,src1,src2,一个lib文件夹
写一个完整的makefile过程例如以下:
1 定义可运行文件的名称
TARGET = Main
2 指定此编译project所要使用的头文件所在的文件夹
INC = -Iheader1 -Iheader2
3 指定cpp文件所在的文件夹
VPATH = .:src1:src2
4 指定全部的cpp文件
SRC_PATH = $(foreachdir,$(subst :, ,$(VPATH)),$(wildcard $(dir)/*.cpp))
解释:
foreach。subst,wildcard为makefile的内置函数,当中wildcard函数为字符串连接函数,把函数中的两个參数连接成一个。subst是字符串替换函数。在此句中意思是把VPATH变量中的冒号替换成空格。
foreach函数,就是把subst函数的返回值。以空格为分隔符,循环取值赋给dir,然后接受wildcard的处理。
这句的整体意思是:从VPATH中获取每一个文件夹,并分别找出此文件夹下全部的cpp文件,赋给SRC_PATH变量。
5 定义中间object文件存放的文件夹。
OBJ_DIR = ./obj
6 全部的object文件要依照和源码相应的文件夹存放,定义object文件的文件夹
OBJ_PATH = $(addprefix $(OBJ_DIR)/, $(subst :, ,$(VPATH) ) )
解释:
addprefix函数是加前缀的函数,词句中是给VPATH中全部已经定义的文件夹加上./obj/的前缀。
7 定义连接成目标文件所须要的全部的object文件的名称
OBJS = $(addprefix $(OBJ_DIR),$(subst.cpp,.o,$(SRC_PATH)))
8 创建一个object文件的文件夹
MAKE_OBJECT_DIR := $(shell mkdir -p$(OBJ_DIR) $(OBJ_PATH))
*************************
9 定义有用的编译器
CXX = g++
CXXFLAGS = -g
10 定义目标文件的生成规则
$(TARGET) : $(OBJS)
$(CXX) -o $@ $(OBJS) $(INC)$(CXXFLAGS)
11 定义object文件的生成方式:
$(OBJ_DIR)/%.o : %.cpp %.cpp.d
$(CXX) -o $@ -c $< $(INC) $(CXXFLAGS)
12 定义.cpp.d文件的生成方式
DEPS = $(OBJS:.o=.cpp.d)
$(DEPS) : $(OBJ_DIR)/%.cpp.d : %.cpp
$(CXX) $< -MM $(INC) >$(OBJ_DIR)/$<.d
13 定义清理函数
clean:
@rm -rf ./obj
@rm -rf $(TARGET)
至此,一个通用的makefile完毕了,假设添加源码文件夹和头文件文件夹,仅仅须要在INC变量和VPATH变量处加上此文件夹就可以。中间object文件和文件的依赖关系自己主动生成。
一个能自己主动搜索源文件并自己主动推导的Makefile的更多相关文章
- 推荐一个百度网盘搜索工具www.sososo.me
推荐一个百度网盘搜索工具 http://www.sososo.me
- 使用DWR实现自己主动补全 相似百度搜索框的自己主动显示效果
使用DWR实现自己主动补全 自己主动补全:是指用户在文本框中输入前几个字母或汉字的时候,自己主动在存放数据的文件或数据库中将全部以这些字母或汉字开头的数据提示给用户供用户选择 在日常上网过程中,我们常 ...
- 第一个C#应用 【搜索软件】
搜索软件V1.0 [附软件截图][http://pan.baidu.com/s/1mihEbe4] 设备搜索:支持广播搜索[local search],指定ip[range search]搜索,直接w ...
- 一个简单的ExtJS搜索建议框
封装的是一个Ext4.2的组件,继承并兼容于Ext的ComboBox. 实现原理非常easy,在 combo 中监听 keyup 事件就可以. 搜索建议的Combo.基本上全然兼容, 使用方式与Com ...
- 【每天学一点-06】在Vue中使用Vant-Picker选择器,并且给选择器添加一个类似Antd-Select-showSearch的搜索功能
一.在Vant文档中,Picker组件的API中是没有showSearch这一选项的 1.Vant-Picker 文档 2.Antd-Select 文档 3.需要完成的需求 4.因为在H5项目中出现了 ...
- 一个漂亮的DIV搜索条
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- linux 下一个 osw先从操作系统和标准脚本主动发起
linux 下一个 osw与操作系统的引导和启动标准的脚本.osw它指的是--os watcher,这是一个显示器os这些指标shell脚本.osw监测数据一般使用oracle技能评估os资源的使用, ...
- xgboost 最优参数, df某一个字段进行字符串搜索
0.909323 with: {'max_depth': 6, 'min_child_weight': 0.8, 'n_estimators': 800} df_huoguo = df[df.c ...
- html学习 - 自己主动跳转与自己主动刷新
自己主动刷新 事实上自己主动刷新和跳转没啥差别,刷新就是跳转到本地址. 有几种办法,首先是直接在html的<head>标签里加入以下的代码. html代码 代码都放在<head> ...
随机推荐
- 剑指offer重构二叉树 给出二叉树的前序和后序重构二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. 假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4, ...
- git克隆/更新/提交代码步骤及示意图
1. git clone ssh://flycm.intel.com/scm/at/atSrc 或者git clone ssh://flycm.intel.com/scm/at/atJar 或者g ...
- Python基础之字符编码,文件操作流与函数
一.字符编码 1.字符编码的发展史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit ...
- lfyzoj104 Counting Swaps
问题描述 给定你一个 \(1 \sim n\) 的排列 \(\{p_i\}\),可进行若干次操作,每次选择两个整数 \(x,y\),交换 \(p_x,p_y\). 请你告诉穰子,用最少的操作次数将给定 ...
- linux -- 查找(find)命令 一
find: find命令是非常有用的linux命令,我们可以用它来根据指定的搜索条件来搜索整个文件系统来查找文件或目录. 基本的‘find file’命令 find . -name "foo ...
- Appium+python自动化-appium元素定位
前言 appium定位app上的元素,可以通过id,name.class这些属性定位到 一.id定位 1.appium的id属性也就是通过UI Automator工具查看的resource-id属性
- mysql5.7.20搭建
官网mysql下载源码安装 下载MySQL5.7.20源码包,wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20.tar.g ...
- 安卓ImageView.src设置图片拉伸、填满控件的方法
代码改变世界 安卓ImageView.src设置图片拉伸.填满控件的方法 需要给你的ImageView布局加上Android:adjustViewBounds="true"
- 【Android】监听viewpager子页面里面的Button按钮
最近做项目遇到Viewpager+Fragment滑动页面,要监听子页面中的按钮,在网上查了些解决办法: 办法一: 这种方法是在适配器初始化中进行监听,有人亲测通过,但是我继承FragmentPage ...
- Spring JdbcTemplate操作小结
Spring 提供了JdbcTemplate 来封装数据库jdbc操作细节: 包括: 数据库连接[打开/关闭] ,异常转义 ,SQL执行 ,查询结果的转换 使用模板方式封装 jdbc数据库操作-固定流 ...