一个能自动搜索源文件并自动推导的Makefile

今天看了一天的makefile的写法,东拼西凑,好不容易写出了一个makefile,颇有成就感,记录下来,以备温习之用。

假设有两个头文件目录 header1,header2;两个cpp文件目录,src1,src2,一个lib目录

写一个完整的makefile步骤如下:

1 定义可执行文件的名称

TARGET = Main

2 指定此编译工程所要使用的头文件所在的目录

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 [email protected] $(OBJS) $(INC)$(CXXFLAGS)

11 定义object文件的生成方式:

$(OBJ_DIR)/%.o : %.cpp %.cpp.d

 $(CXX) -o [email protected] -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文件和文件的依赖关系自动生成

时间: 2024-08-06 07:59:22

一个能自动搜索源文件并自动推导的Makefile的相关文章

学习笔记 Android.mk 自动搜索

最近被Android.mk这东西折腾的一晚,这里记录一下. ios就省心多了,不用管那么多,xcode自己解决了. 文本工具:MACVIM(文本编辑工具 非常好用 能清楚分清tab 和空格,以免编写.mk时出错) 这个文件是向编译器描述源代码文件,便于它去解析. 以下是cocos2dx-3.2新建项目时生成的Android.mk文件 基本语法: "#" 注释 ":="  赋值 "+="  追加 "$"    引用某变量的值 #

js搜索框实现自动搜索功能

做项目的时候,老板让我自己封装一个搜索功能,就类似于百度这种 输入了字符之后,就可以自动搜索数据,而且还会出现一个下拉框供用户选择,我觉得我老板有问题,网上有这么多插件,不仅封装好了,性能也做了优化,什么功能都有,他不用,一定要我用原生js写,写毛线写,我内心吐槽了很久,不过还是要做,为了工资而低头,所以我这个小白就硬着头皮写完了,肯定有很多不足,也没有封装,就是想到哪里写到哪里,给大家当反面教材看看,如果大家看见了,也可以指点指点我,让我进步 由于我是在项目里写的,所以有很多东西和大家的肯定不

上课笔记_使用DWR实现自动补全 类似百度搜索框的自动显示效果

使用DWR实现自动补全 自动补全:是指用户在文本框中输入前几个字母或汉字的时候,自动在存放数据的文件或数据库中将所有以这些字母或汉字开头的数据提示给用户供用户选择 在日常上网过程中,我们经常使用搜索引擎,当我们输入想要检索的关键字时,搜索引擎会提示我们相关的关键字 训练要点: 掌握使用DWR框架开发Ajax程序 使用MyEclipse 10.0 + MySql5.0 新建数据库:可以手动随便新建一个测试用的 DROP TABLE IF EXISTS `books`; CREATE TABLE `

利用WebBrowser控件实现百度自动搜索

(1)新建一个MFC对话框项目 (2)对话框中添加WebBrower控件,添加方法:点击菜单栏工具->选择工具箱项->在弹出的选择工具箱项对话框选择COM组件->Microsoft Web Browser->确定,添加到对话框中即可. (3)添加类CWebBrowser2的头文件和实现 右键点击项目->添加->类->Visual C++ -> MFC->ActiveX控件中的MFC类->点击添加按钮->从注册表来源添加类,可用的Active

stringByEvaluatingJavaScriptFromString的使用方法(完成自动搜索功能)

stringByEvaluatingJavaScriptFromString 使用stringByEvaluatingJavaScriptFromString方法,需要等UIWebView中的页面加载完成之后去调用.我们在界面上拖放一个UIWebView控件.在Load中将googlemobile加载到这个控件中,代码如下: 1. - (void)viewDidLoad 2. { 3. [super viewDidLoad]; 4. webview.backgroundColor = [UICo

Android实现搜索框内自动完成文本框

Android实现搜索框内自动完成文本框 xml文件代码如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:orientation="vertical" 5 android:layout_width=

python 超参数 自动搜索模块GridSearchCV(收藏)

1. 引言 当我们跑机器学习程序时,尤其是调节网络参数时,通常待调节的参数有很多,参数之间的组合更是繁复.依照注意力>时间>金钱的原则,人力手动调节注意力成本太高,非常不值得.For循环或类似于for循环的方法受限于太过分明的层次,不够简洁与灵活,注意力成本高,易出错.本文介绍sklearn模块的GridSearchCV模块,能够在指定的范围内自动搜索具有不同超参数的不同模型组合,有效解放注意力. 2. GridSearchCV模块简介 这个模块是sklearn模块的子模块,导入方法非常简单

jquery+php实现用户输入搜索内容时自动提示

index.html <html><head>    <meta charset="utf-8"><style>#search{font-size:14px;}#search .k{padding:2px 1px; width:320px;}#search_auto{border:1px solid #817FB2; position:absolute; display:none;}#search_auto li{background:#

解决:设置中打开蓝牙,测试机不会自动搜索设备

[操作步骤]:设置中打开蓝牙,测试机不会自动搜索设备 [测试结果]:设置中打开蓝牙,测试机不会自动搜索设备 [预期结果]:打开蓝牙,应该会自动搜索设备 根据反复测试发现,当蓝牙状态打开,并且有可用的设备的时候,或者存在已经配对成功的设备的时候,系统将不会在进行设备搜索,因此根据String定位到蓝牙的设置界面的Fragment为:BluetoothSettings.java. 在BluetoothSettings类的updateContent()方法中我们发现下面代码: ......