今天看了一天的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的更多相关文章

  1. 推荐一个百度网盘搜索工具www.sososo.me

    推荐一个百度网盘搜索工具 http://www.sososo.me

  2. 使用DWR实现自己主动补全 相似百度搜索框的自己主动显示效果

    使用DWR实现自己主动补全 自己主动补全:是指用户在文本框中输入前几个字母或汉字的时候,自己主动在存放数据的文件或数据库中将全部以这些字母或汉字开头的数据提示给用户供用户选择 在日常上网过程中,我们常 ...

  3. 第一个C#应用 【搜索软件】

    搜索软件V1.0 [附软件截图][http://pan.baidu.com/s/1mihEbe4] 设备搜索:支持广播搜索[local search],指定ip[range search]搜索,直接w ...

  4. 一个简单的ExtJS搜索建议框

    封装的是一个Ext4.2的组件,继承并兼容于Ext的ComboBox. 实现原理非常easy,在 combo 中监听 keyup 事件就可以. 搜索建议的Combo.基本上全然兼容, 使用方式与Com ...

  5. 【每天学一点-06】在Vue中使用Vant-Picker选择器,并且给选择器添加一个类似Antd-Select-showSearch的搜索功能

    一.在Vant文档中,Picker组件的API中是没有showSearch这一选项的 1.Vant-Picker 文档 2.Antd-Select 文档 3.需要完成的需求 4.因为在H5项目中出现了 ...

  6. 一个漂亮的DIV搜索条

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. linux 下一个 osw先从操作系统和标准脚本主动发起

    linux 下一个 osw与操作系统的引导和启动标准的脚本.osw它指的是--os watcher,这是一个显示器os这些指标shell脚本.osw监测数据一般使用oracle技能评估os资源的使用, ...

  8. xgboost 最优参数, df某一个字段进行字符串搜索

    0.909323  with:   {'max_depth': 6, 'min_child_weight': 0.8, 'n_estimators': 800} df_huoguo = df[df.c ...

  9. html学习 - 自己主动跳转与自己主动刷新

    自己主动刷新 事实上自己主动刷新和跳转没啥差别,刷新就是跳转到本地址. 有几种办法,首先是直接在html的<head>标签里加入以下的代码. html代码 代码都放在<head> ...

随机推荐

  1. web开发框架之Django基础

    在脚本中如何进行Django的运行 if __name__ == '__main__': import os import django # 注意路径(当前所在的位置,要加载Django的配置文件) ...

  2. 关于set和multiset的一些用法

    set的一些用法 set的特性 set的特性是,所有元素都会根据元素的键值自动排序,set不允许两个元素有相同的键值. set的一些常用操作函数 insert() insert(key_value); ...

  3. vmware 装 puppy

    说做就做了,但是开始怎么试都没装成功,后来在网上查了些资料,再结合自己的实践,终于成功了.下面我就把如何让Puppy Linux安装到VMware 硬盘上一步一步奉献给大家. 一.准备 1.1 安装好 ...

  4. HTML5教程之本地存储SessionStorage

    SessionStorage: 将数据保存在session对象中,所谓session是指用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间会话,也就是用户浏览这个网站所花费的时间就是sess ...

  5. python知识点拾遗

    内容概要 1.__str__ 2.os.path相关方法 1.__str__ 我们先定义一个Student类,打印一个实例: class Student(object): def __init__(s ...

  6. 【JavaScript 10—应用总结】:连缀

    一.总体概述 1.1,什么叫连缀 所谓连缀,最简单的理解就是一句话同时设置一个或多个节点两个或两个以上的操作.比如: <span style="font-size:18px;" ...

  7. HDU-4849 Wow! Such City!,最短路!

    Wow! Such City!    题意:题面很难理解,幸亏给出了提示,敲了一发板子过了.给出x数组y数组和z数组的求法,并给出x.y的前几项,然后直接利用所给条件构造出z数组再构造出C数组即可,C ...

  8. 【Luogu】P1013进制位(搜索)

    题目链接在这里 这题和虫食算比较类似.做完这道题可以去做虫食算.都是搜索一类的题. 这样 我们分析题目可以发现进制只可能是字母的个数,也就是n-1.为什么? 因为题目要求完整的加法表才算数.如果进制低 ...

  9. 算法复习——trie树(poj2001)

    题目: 题目描述 给出 n 个单词(1<=n<=1000),求出每个单词的非公共前缀,如果没有,则输出自己. 输入格式 输入 N 个单词,每行一个,每个单词都是由 1-20 个小写字母构成 ...

  10. 刷题总结——道路覆盖(ssoj)

    题目: 题目描述 Tar 把一段凹凸不平的路分成了高度不同的 N 段(每一段相同高度),并用 H[i] 表示第 i 段高度.现在 Tar 一共有 n 种泥土可用,它们都能覆盖给定的连续的 k 个部分. ...