日记:2022.3.8

搞个博客吧,记录下自己的成长,想起来就写一篇。目前工作了2年多,在北京某公司做打印驱动相关的工作。个人还是喜欢Linux下的C/C++编程,相对Windows要自由点,目前在学习Makefile,加油,计划学习三天,巩固两天,嘿嘿。

######################################变量用法#####################################################
# 1.$(objects): %.o: %.c
#    “$<”表示所有的依赖目标集(也就是“foo.c bar.c”),“$@”表示目标集(也就是"foo.o bar.o”)
# 2. @echo 正在编译XXX模块......  “@”字符在命令行前,那么这个命令将不被make显示出来。
#    作用:用于在终端显示一条信息,否则终端会显示两条:(等同于 make -n 参数,make -s全面禁止命令显示)
#                      @echo 正在编译XXX模块...... && 正在编译XXX模块......
# 3. 如果你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令,比如:
#    cd /home/Duncan
#   pwd
#   正确的是:cd /home/Duncan;pwd 第一条命令只打印出当前路径,第二条命令打印出cd之后的路径
# 4. 忽略命令的出错,比如创建文件夹,如该夹存在则返回失败,make指令将终止,此错误可跳过方法(命令前加'-'):
#     -mkdir -p xxx  && -rm -f *.o
#      其他方法:make -i xxx :忽略所有错误.   make -k xxx :某规则出错,终止,但继续执行其他规则
# 5. 定义一个空格:
#    nullstring :=
#    space := $(nullstring) # end of the line (# 注释不可或缺, ')'与'#'之间有一个空格),space=' '
# 6. FOO ?= bar 含义:如果FOO没有被定义过,FOO的值为bar,否则什么也不做。 
#    等价于: ifeq ($(origin FOO), undefined)
#            FOO = bar
#            endif
# 7. 条件判断句:ifeq(a,b)            ifdef foo
#                    pass #不相             pass #foo 的值不为空 foo = $(object), object为空不影响
#                else                else
#                    pass #不相等            pass #foo 的值为空 foo = 
#                endif                endif
######################################字符串函数用法#####################################################
# 1. $(subst <from>,<to>,<text> )
#    名称:字符串替换函数——subst。
#    功能:把字串<text>中的<from>字符串替换成<to>。
#    返回:函数返回被替换过后的字符串。
#    示例:$(subst ee,EE,feet on the street) ==> 输出:“fEEt on the strEEt”
# 2. $(strip <string> )
#    名称:去空格函数——strip。
#    功能:去掉<string>字串中开头和结尾的空字符。
#    返回:返回被去掉空格的字符串值。
#    示例:$(strip a b c ) ==> 输出:a b c
# 3. $(findstring <find>,<in> )
#    名称:查找字符串函数——findstring。
#    功能:在字串<in>中查找<find>字串。
#    返回:如果找到,那么返回<find>,否则返回空字符串。
#    示例:$(findstring a,a b c) ==> 输出:"a" && $(findstring a,b c) ==> 输出:""空字符串
# 4. $(filter <pattern...>,<text> )
#    名称:过滤函数——filter。
#    功能:以<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式。
#    返回:返回符合模式<pattern>的字串。
#    示例:sources := foo.c bar.c baz.s ugh.h
#         foo:$(sources)
#         cc $(filter $.c $.s,$(sources)) -o foo ==> 函数输出:“foo.c bar.c baz.s”
#    相似函数:$(filter-out <pattern...>,<text> ) 反过滤函数。
# 5. $(sort <list> ) 排序函数 ==> 输出:返回排序后的字符串
# 6. $(word <n>,<text> )
#    名称:取单词函数——word。
#    功能:取字符串<text>中第<n>个单词。(从一开始)
#    返回:返回字符串<text>中第<n>个单词。如果<n>比<text>中的单词数要大,那么返回空字符串。
#    示例:$(word 2, foo bar baz) ==> 输出:“bar”。
#    相似函数:a) $(wordlist <s>,<e>,<text>) 示例: $(wordlist 2, 3, foo bar baz)返回值是“bar baz”
#           b) $(words <text> ), 返回单词个数,示例:$(word $(words <text> ),<text> )取最后一个单词
#             c) $(firstword <text> ),返回字符串<text>的第一个单词 <==> $(word 1,<text> )
######################################文件名函数用法#####################################################
# 1. $(dir <names...> ):返回文件名序列<names>的目录部分,示例 $(dir src/foo.c hacks)返回值是“src/ ./”
#     相似函数:$(notdir <names...> ):返回文件名序列<names>的非目录部分
# 2. $(suffix <names...> )
#    名称:取后缀函数——suffix。
#    功能:从文件名序列<names>中取出各个文件名的后缀。
#    返回:返回文件名序列<names>的后缀序列,如果文件没有后缀,则返回空字串。
#    示例:$(suffix src/foo.c src-1.0/bar.c hacks)返回值是“.c .c”。
#    相似函数:a) $(basename <names...> )取前缀函数。
#             b) $(addsuffix <suffix>,<names...> )加后缀函数
#             c) $(addprefix <prefix>,<names...> )加前缀函数
# 3. $(join <list1>,<list2> )
#名称:连接函数——join。
#功能:把<list2>中的单词对应地加到<list1>的单词后面。如果<list1>的单词个数要比<list2>的多,
#那么,<list1>中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么,<list2>多出来的单词将被复制到<list2>中。
#返回:返回连接过后的字符串。
#示例:$(join aaa bbb , 111 222 333)返回值是“aaa111 bbb222 333”。
#######################################foreach循环函数###########################################################
$(foreach <var>,<list>,<text> )
这个函数的意思是,把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中,<text>的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
示例:
names := a b c d
files := $(foreach n,$(names),$(n).o) ==> 输出:“a.o b.o c.o d.o”
注意,foreach中的<var>参数是一个临时的局部变量,foreach函数执行完后,参数<var>的变量将不在作用,其作用域只在foreach函数当中。
########################################if判断函数################################################################
$(if <condition>,<then-part> ) 或者 $(if <condition>,<then-part>,<else-part> ) 
<then-part>和<else-part>只会有一个被计算。
#########################################call函数#################################################################
$(call <expression>,<parm1>,<parm2>,<parm3>...)
当 make执行这个函数时,<expression>参数中的变量,如$(1),$(2),$(3)等,会被参数<parm1>,<parm2>,<parm3>依次取代。而<expression>的返回值就是 call函数的返回值。
示例:reverse = $(1) $(2)
     foo = $(call reverse,a,b) ==> 输出:"a,b"
#########################################origin函数##############################################################
$(origin <variable> )
origin函数会以其返回值来告诉你这个变量的“出生情况”:
    a). 如果<variable>从来没有定义过,origin函数返回这个值"undefined"
    b). 如果<variable>是一个默认的定义,比如“CC”这个变量,返回"default"
    c). 如果<variable>是一个环境变量,并且当Makefile被执行, 返回"environment"
    d). 如果<variable>这个变量被定义在Makefile中,返回"file"
    e). 如果<variable>这个变量是被命令行定义的,返回"command line"
    f). 如果<variable>是被override指示符重新定义的,返回"override"
    g). 如果<variable>是一个命令运行中的自动化变量,返回"automatic"
示例(bletch来源于环境变量,就重定义):
    ifdef bletch
    ifeq "$(origin bletch)" "environment"
    bletch = barf, gag, etc.
    endif
    endif
########################################shell函数#################################################################
shell函数把执行操作系统命令后的输出作为函数返回
示例:contents := $(shell cat foo)
注意,这个函数会新生成一个Shell程序来执行命令,所以你要注意其运行性能,如果你的Makefile中有一些比较复杂的规则,并大量使用了这个函数,那么对于你的系统性能是有害的。特别是Makefile的隐晦的规则可能会让你的shell函数执行的次数比你想像的多得多。
#######################################控制make的函数##############################################################
$(error <text ...> )产生一个致命的错误,<text ...>是错误信息。
示例:
ifdef ERROR_001
$(error error is $(ERROR_001))
endif
类似函数:$(warning <text ...> ) 只输出一段警告信息,并不会让make退出。
######################################make的运行##################################################################
一般来说,make的最终目标是makefile中的第一个目标,而其它目标一般是由这个目标连带出来的,这是make的默认行为。    
“all”           这个伪目标是所有目标的目标,其功能一般是编译所有的目标。
“clean”           这个伪目标功能是删除所有被make创建的文件。
“install”       这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。
“print”         这个伪目标的功能是例出改变过的源文件。
“tar”           这个伪目标功能是把源程序打包备份。也就是一个tar文件。
“dist”          这个伪目标功能是创建一个压缩文件,一般是把tar文件压成Z文件。或是gz文件。
“TAGS”            这个伪目标功能是更新所有的目标,以备完整地重编译使用。
“check”和“test” 这两个伪目标一般用来测试makefile的流程。
######################################自动化变量###################################################################
$@表示规则中的目标文件集。
$%仅当目标是函数库文件中,表示规则中的目标成员名。
$<依赖目标中的第一个目标名字。
$?所有比目标新的依赖目标的集合,以空格分隔。
$^所有的依赖目标的集合,以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
$+这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值