Makefile 备忘录

一、主体框架

target... : prerequisites ...

command

    ...

    ...

------------------------------------------------------------------------------------------------------------

Target:目标文件,可以是Object File,也可以是执行文件。还可以是一个标签;

Prerequisites:生成target所需要的文件或是目标;

Command:make需要执行的命令 注:如果以[Tab] 开头,则会被认为是command;

二、主体执行流程

1.读入所有的Makefile。

2.读入被include的其它Makefile。

3.初始化文件中的变量。

4.推导隐晦规则,并分析所有规则。

5.为所有的目标文件创建依赖关系链。

6.根据依赖关系,决定哪些目标要重新生成。

7.执行生成命令。

三、关键字

1、  ~  代表当前目录                如:~/test

2、  *  匹配所有                     如:*.c

3、  VPATH  为make指定搜索目录     如:VPATH = ~/test

4、  vpath   为具体种类的文件指定搜索目录   如:vpath%.c test  .c文件在test中搜索

5、  @echo  向屏幕输出信息          注:命令前带@ 代表这行命令不会输出出来

6、  -       阻止命令出错make退出  如:-rm –f *.o

7、  MAKE   在makefile中调用make   如:cd subdir&& $(MAKE)

8、  变量的使用 赋值:A=1 A:=$(B) A?=${B}  A+=$(C)  注:和宏一样直接替换

9、  Override 变量前的标识符代表此变量是命令行赋值的,但是你想在makefile中自己赋值 override <v> += <text>

10、define 可以定义多行变量、命令包

11、环境变量 类似全局的            如:CFLAGS MAKEFILESMAKECMDGOALS

12、目标变量 类似局部变量          如:prog: CFLAGS=-g

13、模式变量 类似目标变量          如:%.o:CFLAGS=-O

14、ifeq ifneq ifdef ifndef

15、-f 指定makefile                 如:make –f hchen.mk

16、.PHONY 指定伪目标              如:.PHONY: all

17、include 引用其他make文件      注:-I --include-dir可以为其指明include搜索路径

18、-B   所有的目标都得重新编译

19、-C <dir>      指定读取Makefile读取的目录

20、--debug[=<options>]     输出make的调试信息

21、-e   指明环境变量的值覆盖makefile中定义的变量的值

22、-f=<file>     指定需要执行的makefile

23、-i    在执行时忽略所有的错误

24、-I <dir> 指定一个被包含makefile的搜索目标。可以使用多个“-I”参数来指定多个目录。

25、-j [<jobsnum>]  指同时运行命令的个数

26、-k   出错也不停止运行

27、-l <load>     指定make运行命令的负载

28、-n   仅输出执行过程中的命令序列,但并不执行

29、-o <file>      不重新生成的指定的<file>,即使这个目标的依赖文件新于它

30、-p   输出makefile中的所有数据,包括所有的规则和变量

31、-q   不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新。如果是0则说明要更新,如果是2则说明有错误发生

32、-r    禁止make使用任何隐含规则

33、-R   禁止make使用任何作用于变量上的隐含规则

34、-s   在命令运行时不输出命令的输出

35、-S   取消“-k”选项的作用

36、-t    相当于UNIX的touch命令,只是把目标的修改日期变成最新的,也就是阻止生成目标的命令运行

37、-v   输出make程序的版本、版权等关于make的信息

38、-w  输出运行makefile之前和之后的信息

39、--no-print-directory 禁止“-w”选项

40、-W <file>    假定目标<file>需要更新,如果和“-n”选项使用,那么这个参数会输出该目标更新时的运行动作

41、--warn-undefined-variables  只要make发现有未定义的变量,那么就输出警告信息

      

42、$@ 规则中的目标文件集

43、$%  仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"

44、$<  依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集

45、$?   所有比目标新的依赖目标的集合

46、$^  所有的依赖目标的集合

47、$+  这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标

48、$*   这个变量表示目标模式中"%"及其之前的部分


49、export  向下传递变量

四、函数

1、 模式 $(<function><arguments> )

<function>就是函数名,make支持的函数不多。<arguments>是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。

2、常用函数

$(subst<from>,<to>,<text> )

功能:把字串<text>中的<from>字符串替换成<to>。

返回:函数返回被替换过后的字符串。

 

$(patsubst<pattern>,<replacement>,<text> )

功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。

返回:函数返回被替换过后的字符串。

 

$(strip <string> )

功能:去掉<string>字串中开头和结尾的空字符。

返回:返回被去掉空格的字符串值。

 

$(findstring <find>,<in> )

功能:在字串<in>中查找<find>字串。

返回:如果找到,那么返回<find>,否则返回空字符串。

 

$(filter<pattern...>,<text> )

功能:以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式。

返回:返回符合模式<pattern>的字串。

 

$(filter-out <pattern...>,<text>)

功能:以<pattern>模式过滤<text>字符串中的单词,去除符合模式<pattern>的单词。可以有多个模式。

返回:返回不符合模式<pattern>的字串。

 

$(sort <list> )

功能:给字符串<list>中的单词排序(升序)。

返回:返回排序后的字符串。

 

$(word <n>,<text> )

功能:取字符串<text>中第<n>个单词。(从一开始)

返回:返回字符串<text>中第<n>个单词。如果<n>比<text>中的单词数要大,那么返回空字符串。

 

$(wordlist<s>,<e>,<text> )

功能:从字符串<text>中取从<s>开始到<e>的单词串。<s>和<e>是一个数字。

返回:返回字符串<text>中从<s>到<e>的单词字串。如果<s>比<text>中的单词数要大,那么返回空字符串。如果<e>大于<text>的单词数,那么返回从<s>开始,到<text>结束的单词串。

 

$(words <text> )

功能:统计<text>中字符串中的单词个数。

返回:返回<text>中的单词数。

 

$(firstword <text> )

功能:取字符串<text>中的第一个单词。

返回:返回字符串<text>的第一个单词。

 

$(dir <names...> )

功能:从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”。

返回:返回文件名序列<names>的目录部分。

 

$(notdir <names...> )

功能:从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠(“/”)之后的部分。

返回:返回文件名序列<names>的非目录部分。

 

$(suffix <names...> )

功能:从文件名序列<names>中取出各个文件名的后缀。

返回:返回文件名序列<names>的后缀序列,如果文件没有后缀,则返回空字串。

 

$(basename <names...> )

功能:从文件名序列<names>中取出各个文件名的前缀部分。

返回:返回文件名序列<names>的前缀序列,如果文件没有前缀,则返回空字串。

 

$(addsuffix<suffix>,<names...> )

功能:把后缀<suffix>加到<names>中的每个单词后面。

返回:返回加过后缀的文件名序列。

 

$(addprefix<prefix>,<names...> )

功能:把前缀<prefix>加到<names>中的每个单词后面。

返回:返回加过前缀的文件名序列。

 

$(join <list1>,<list2> )

功能:把<list2>中的单词对应地加到<list1>的单词后面。如果<list1>的单词个数要比<list2>的多,那么,<list1>中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么,<list2>多出来的单词将被复制到<list2>中。

返回:返回连接过后的字符串。

 

$(foreach<var>,<list>,<text> )

功能:把list中的值挨个赋值给var,text一般会引用var

返回:返回list中的所有值

 

$(if <condition>,<then-part>,<else-part>)

功能:如果<condition>为真则返回<then-part> 否则返回<else-part>

返回:如上所述

 

$(call<expression>,<parm1>,<parm2>,<parm3>...)

功能:类似format

返回:返回格式化后的值

 

$(origin <variable> )

功能:指明参数的来源

返回:undefined default environment file command line override automatic

 

shell

功能:shell 函数也不像其它的函数。顾名思义,它的参数应该就是操作系统Shell的命令。它和反引号“`”是相同的功能。这就是说,shell函数把执行操作系统命令后的输出作为函数

 

$(error <text ...> ) $(warning<text ...> )

warning函数很像error函数,只是它并不会让make退出,只是输出一段警告信息,而make继续执行

五、隐藏的规则

1、 由目标默认的推导出依赖文件  如:<n>.o”的目标的依赖目标会自动推导为“<n>.c”…

 



基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值