北京摇号网站维护企业网站优化托管

news/2025/9/22 20:13:04/文章来源:
北京摇号网站维护,企业网站优化托管,百度图片搜索网页版,海淀手机网站建设1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之间的依赖关系不知会多复杂. Makefile的组织流程的能力如此之强, 不仅可以用来编译项目, 还可以用来组织我们平时的一些…1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之间的依赖关系不知会多复杂. Makefile的组织流程的能力如此之强, 不仅可以用来编译项目, 还可以用来组织我们平时的一些日常操作. 这个需要大家发挥自己的想象力.   本篇博客是基于 {精华} 跟我一起写 Makefile 而整理的, 有些删减, 追加了一些示例. 非常感谢 gunguymadman_cu 提供如此详尽的Makefile介绍, 这正是我一直寻找的Makefile中文文档.   1.1 Makefile 主要的 5个部分 (显示规则, 隐晦规则, 变量定义, 文件指示, 注释) Makefile基本格式如下: target ... : prerequisites ...command...... 其中, target        - 目标文件, 可以是 Object File, 也可以是可执行文件prerequisites - 生成 target 所需要的文件或者目标command       - make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头  显示规则 :: 说明如何生成一个或多个目标文件(包括 生成的文件, 文件的依赖文件, 生成的命令)隐晦规则 :: make的自动推导功能所执行的规则 变量定义 :: Makefile中定义的变量文件指示 :: Makefile中引用其他Makefile; 指定Makefile中有效部分; 定义一个多行命令注释     :: Makefile只有行注释 #, 如果要使用或者输出#字符, 需要进行转义, \#  1.2 GNU make 的工作方式 读入主Makefile (主Makefile中可以引用其他Makefile)读入被include的其他Makefile初始化文件中的变量推导隐晦规则, 并分析所有规则为所有的目标文件创建依赖关系链根据依赖关系, 决定哪些目标要重新生成执行生成命令  2. Makefile 初级语法 2.1 Makefile 规则 2.1.1 规则语法 规则主要有2部分: 依赖关系 和 生成目标的方法. 语法有以下2种: target ... : prerequisites ...command... 或者 target ... : prerequisites ; commandcommand... *注* command太长, 可以用 \ 作为换行符   2.1.2 规则中的通配符 *     :: 表示任意一个或多个字符?     :: 表示任意一个字符[...] :: ex. [abcd] 表示a,b,c,d中任意一个字符, [^abcd]表示除a,b,c,d以外的字符, [0-9]表示 0~9中任意一个数字~     :: 表示用户的home目录  2.1.3 路径搜索 当一个Makefile中涉及到大量源文件时(这些源文件和Makefile极有可能不在同一个目录中), 这时, 最好将源文件的路径明确在Makefile中, 便于编译时查找. Makefile中有个特殊的变量 VPATH 就是完成这个功能的. 指定了 VPATH 之后, 如果当前目录中没有找到相应文件或依赖的文件, Makefile 回到 VPATH 指定的路径中再去查找.. VPATH 使用方法: vpath directories            :: 当前目录中找不到文件时, 就从directories中搜索vpath pattern directories  :: 符合pattern格式的文件, 就从directories中搜索vpath pattern                :: 清除符合pattern格式的文件搜索路径vpath                          :: 清除所有已经设置好的文件路径  # 示例1 - 当前目录中找不到文件时, 按顺序从 src目录 ../parent-dir目录中查找文件 VPATH src:../parent-dir # 示例2 - .h结尾的文件都从 ./header 目录中查找 VPATH %.h ./header# 示例3 - 清除示例2中设置的规则 VPATH %.h# 示例4 - 清除所有VPATH的设置 VPATH   2.2 Makefile 中的变量 2.2.1 变量定义 ( or : ) OBJS programA.o programB.o OBJS-ADD $(OBJS) programC.o # 或者 OBJS : programA.o programB.o OBJS-ADD : $(OBJS) programC.o 其中 和 : 的区别在于, : 只能使用前面定义好的变量, 可以使用后面定义的变量 测试 # Makefile内容 OBJS2 $(OBJS1) programC.o OBJS1 programA.o programB.oall:echo $(OBJS2)# bash中执行 make, 可以看出虽然 OBJS1 是在 OBJS2 之后定义的, 但在 OBJS2中可以提前使用 $ make programA.o programB.o programC.o   测试 : # Makefile内容 OBJS2 : $(OBJS1) programC.o OBJS1 : programA.o programB.oall:echo $(OBJS2)# bash中执行 make, 可以看出 OBJS2 中的 $(OBJS1) 为空 $ make programC.o   2.2.2 变量替换 # Makefile内容 SRCS : programA.c programB.c programC.c OBJS : $(SRCS:%.c%.o)all:echo SRCS: $(SRCS)echo OBJS: $(OBJS)# bash中运行make $ make SRCS: programA.c programB.c programC.c OBJS: programA.o programB.o programC.o   2.2.3 变量追加值 # Makefile内容 SRCS : programA.c programB.c programC.c SRCS programD.call:echo SRCS: $(SRCS)# bash中运行make $ make SRCS: programA.c programB.c programC.c programD.c   2.2.4 变量覆盖 override 作用是使 Makefile中定义的变量能够覆盖 make 命令参数中指定的变量 语法: override variable valueoverride variable : valueoverride variable value  下面通过一个例子体会 override 的作用 # Makefile内容 (没有用override) SRCS : programA.c programB.c programC.call:echo SRCS: $(SRCS)# bash中运行make $ make SRCSnothing SRCS: nothing################################################## Makefile内容 (用override) override SRCS : programA.c programB.c programC.call:echo SRCS: $(SRCS)# bash中运行make $ make SRCSnothing SRCS: programA.c programB.c programC.c   2.2.5 目标变量 作用是使变量的作用域仅限于这个目标(target), 而不像之前例子中定义的变量, 对整个Makefile都有效. 语法: target ... :: variable-assignmenttarget ... :: override variable-assignment (override作用参见 变量覆盖的介绍)  示例: # Makefile 内容 SRCS : programA.c programB.c programC.ctarget1: TARGET1-SRCS : programD.c target1:echo SRCS: $(SRCS)echo SRCS: $(TARGET1-SRCS)target2:echo SRCS: $(SRCS)echo SRCS: $(TARGET1-SRCS)# bash中执行make $ make target1 SRCS: programA.c programB.c programC.c SRCS: programD.c$ make target2 -- target2中显示不了 $(TARGET1-SRCS) SRCS: programA.c programB.c programC.c SRCS:   2.3 Makefile 命令前缀 Makefile 中书写shell命令时可以加2种前缀 和 -, 或者不用前缀. 3种格式的shell命令区别如下: 不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行前缀    :: 只输出命令执行的结果, 出错的话停止执行前缀 -   :: 命令执行有错的话, 忽略错误, 继续执行  示例: # Makefile 内容 (不用前缀) all:echo 没有前缀cat this_file_not_existecho 错误之后的命令 -- 这条命令不会被执行# bash中执行 make $ make echo 没有前缀 -- 命令本身显示出来 没有前缀 -- 命令执行结果显示出来 cat this_file_not_exist cat: this_file_not_exist: No such file or directory make: *** [all] Error 1############################################################ Makefile 内容 (前缀 ) all:echo 没有前缀cat this_file_not_existecho 错误之后的命令 -- 这条命令不会被执行# bash中执行 make $ make 没有前缀 -- 只有命令执行的结果, 不显示命令本身 cat: this_file_not_exist: No such file or directory make: *** [all] Error 1############################################################ Makefile 内容 (前缀 -) all:-echo 没有前缀-cat this_file_not_exist-echo 错误之后的命令 -- 这条命令会被执行# bash中执行 make $ make echo 没有前缀 -- 命令本身显示出来 没有前缀 -- 命令执行结果显示出来 cat this_file_not_exist cat: this_file_not_exist: No such file or directory make: [all] Error 1 (ignored) echo 错误之后的命令 -- 出错之后的命令也会显示 错误之后的命令 -- 出错之后的命令也会执行   2.4 伪目标 伪目标并不是一个目标(target), 不像真正的目标那样会生成一个目标文件. 典型的伪目标是 Makefile 中用来清理编译过程中中间文件的 clean 伪目标, 一般格式如下: .PHONY: clean -- 这句没有也行, 但是最好加上 clean:-rm -f *.o   2.5 引用其他的 Makefile 语法: include filename  (filename 可以包含通配符和路径) 示例: # Makefile 内容 all:echo 主 Makefile beginmake other-allecho 主 Makefile endinclude ./other/Makefile# ./other/Makefile 内容 other-all:echo other makefile beginecho other makefile end# bash中执行 make $ ll total 20K -rw-r--r-- 1 wangyubin wangyubin 125 Sep 23 16:13 Makefile -rw-r--r-- 1 wangyubin wangyubin 11K Sep 23 16:15 makefile.org -- 这个文件不用管 drwxr-xr-x 2 wangyubin wangyubin 4.0K Sep 23 16:11 other $ ll other/ total 4.0K -rw-r--r-- 1 wangyubin wangyubin 71 Sep 23 16:11 Makefile$ make 主 Makefile begin make[1]: Entering directory /path/to/test/makefile other makefile begin other makefile end make[1]: Leaving directory /path/to/test/makefile 主 Makefile end   2.6 查看C文件的依赖关系 写 Makefile 的时候, 需要确定每个目标的依赖关系. GNU提供一个机制可以查看C代码文件依赖那些文件, 这样我们在写 Makefile 目标的时候就不用打开C源码来看其依赖那些文件了. 比如, 下面命令显示内核源码中 virt/kvm/kvm_main.c 中的依赖关系 $ cd virt/kvm/ $ gcc -MM kvm_main.c kvm_main.o: kvm_main.c iodev.h coalesced_mmio.h async_pf.h -- 这句就可以加到 Makefile 中作为编译 kvm_main.o 的依赖关系   2.7 make 退出码 Makefile的退出码有以下3种 0 :: 表示成功执行1 :: 表示make命令出现了错误2 :: 使用了 -q 选项, 并且make使得一些目标不需要更新  2.8 指定 Makefile 指定特定目标 默认执行 make 命令时, GNU make在当前目录下依次搜索下面3个文件 GNUmakefile, makefile, Makefile, 找到对应文件之后, 就开始执行此文件中的第一个目标(target). 如果找不到这3个文件就报错.   非默认情况下, 可以在 make 命令中指定特定的 Makefile 和特定的 目标. 示例 # Makefile文件名改为 MyMake, 内容 target1:echo target [1] beginecho target [1] endtarget2:echo target [2] beginecho target [2] end# bash 中执行 make $ ls Makefile $ mv Makefile MyMake $ ls MyMake $ make -- 找不到默认的 Makefile make: *** No targets specified and no makefile found. Stop. $ make -f MyMake -- 指定特定的Makefile target [1] begin target [1] end $ make -f MyMake target2 -- 指定特定的目标(target) target [2] begin target [2] end   2.9 make 参数介绍 make 的参数有很多, 可以通过 make -h 去查看, 下面只介绍几个我认为比较有用的. 参数 含义 --debug[options]输出make的调试信息, options 可以是 a, b, v-j --jobs同时运行的命令的个数, 也就是多线程执行 Makefile-r --no-builtin-rules禁止使用任何隐含规则-R --no-builtin-variabes禁止使用任何作用于变量上的隐含规则-B --always-make假设所有目标都有更新, 即强制重编译  2.10 Makefile 隐含规则 这里只列一个和编译C相关的. 编译C时n.o 的目标会自动推导为 n.c # Makefile 中 main : main.ogcc -o main main.o#会自动变为: main : main.ogcc -o main main.omain.o: main.c -- main.o 这个目标是隐含生成的gcc -c main.c   2.11 隐含规则中的 命令变量 和 命令参数变量 2.11.1 命令变量, 书写Makefile可以直接写 shell时用这些变量. 下面只列出一些C相关的 变量名 含义 RMrm -fARarCCccCXXg示例: # Makefile 内容 all:echo $(RM)echo $(AR)echo $(CC)echo $(CXX)# bash 中执行make, 显示各个变量的值 $ make rm -f ar cc g   2.11.2 命令参数变量 变量名 含义 ARFLAGSAR命令的参数CFLAGSC语言编译器的参数CXXFLAGSC语言编译器的参数  示例: 下面以 CFLAGS 为例演示 # test.c 内容 #include stdio.hint main(int argc, char *argv[]) {printf (Hello Makefile\n);return 0; }# Makefile 内容 test: test.o$(CC) -o test test.o# bash 中用 make 来测试 $ ll total 24K -rw-r--r-- 1 wangyubin wangyubin 69 Sep 23 17:31 Makefile -rw-r--r-- 1 wangyubin wangyubin 14K Sep 23 19:51 makefile.org -- 请忽略这个文件 -rw-r--r-- 1 wangyubin wangyubin 392 Sep 23 17:31 test.c$ make cc -c -o test.o test.c cc -o test test.o -- 这个是自动推导的$ rm -f test test.o$ make CFLAGS-Wall -- 命令中加的编译器参数自动追加入下面的编译中了 cc -Wall -c -o test.o test.c cc -o test test.o   2.12 自动变量 Makefile 中很多时候通过自动变量来简化书写, 各个自动变量的含义如下: 自动变量 含义 $目标集合$%当目标是函数库文件时, 表示其中的目标文件名$第一个依赖目标. 如果依赖目标是多个, 逐个表示依赖目标$?比目标新的依赖目标的集合$^所有依赖目标的集合, 会去除重复的依赖目标$所有依赖目标的集合, 不会去除重复的依赖目标$*这个是GNU make特有的, 其它的make不一定支持  3. Makefile 高级语法 3.1 嵌套Makefile 在 Makefile 初级语法中已经提到过引用其它 Makefile的方法. 这里有另一种写法, 并且可以向引用的其它 Makefile 传递参数. 示例: (不传递参数, 只是调用子文件夹 other 中的Makefile) # Makefile 内容 all:echo 主 Makefile begincd ./other makeecho 主 Makefile end# ./other/Makefile 内容 other-all:echo other makefile beginecho other makefile end# bash中执行 make $ ll total 28K -rw-r--r-- 1 wangyubin wangyubin 104 Sep 23 20:43 Makefile -rw-r--r-- 1 wangyubin wangyubin 17K Sep 23 20:44 makefile.org -- 这个文件不用管 drwxr-xr-x 2 wangyubin wangyubin 4.0K Sep 23 20:42 other $ ll other/ total 4.0K -rw-r--r-- 1 wangyubin wangyubin 71 Sep 23 16:11 Makefile$ make 主 Makefile begin make[1]: Entering directory /path/to/test/makefile/other other makefile begin other makefile end make[1]: Leaving directory /path/to/test/makefile/other 主 Makefile end   示例: (用export传递参数) # Makefile 内容 export VALUE1 : export.c -- 用了 export, 此变量能够传递到 ./other/Makefile 中 VALUE2 : no-export.c -- 此变量不能传递到 ./other/Makefile 中all:echo 主 Makefile begincd ./other makeecho 主 Makefile end# ./other/Makefile 内容 other-all:echo other makefile beginecho VALUE1: $(VALUE1)echo VALUE2: $(VALUE2)echo other makefile end# bash中执行 make $ make 主 Makefile begin make[1]: Entering directory /path/to/test/makefile/other other makefile begin VALUE1: export.c -- VALUE1 传递成功 VALUE2: -- VALUE2 传递失败 other makefile end make[1]: Leaving directory /path/to/test/makefile/other 主 Makefile end   *补充* export 语法格式如下: export variable valueexport variable : valueexport variable value  3.2 定义命令包 命令包有点像是个函数, 将连续的相同的命令合成一条, 减少 Makefile 中的代码量, 便于以后维护. 语法: define command-name command ... endef   示例: # Makefile 内容 define run-hello-makefile echo -n Hello echo Makefile! echo 这里可以执行多条 Shell 命令! endefall:$(run-hello-makefile)# bash 中运行make $ make Hello Makefile! 这里可以执行多条 Shell 命令!   3.3 条件判断 条件判断的关键字主要有 ifeq ifneq ifdef ifndef 语法: conditional-directive text-if-true endif# 或者 conditional-directive text-if-true else text-if-false endif   示例: ifeq的例子, ifneq和ifeq的使用方法类似, 就是取反 # Makefile 内容 all: ifeq (aa, bb)echo equal elseecho not equal endif# bash 中执行 make $ make not equal   示例: ifdef的例子, ifndef和ifdef的使用方法类似, 就是取反 # Makefile 内容 SRCS : program.call: ifdef SRCSecho $(SRCS) elseecho no SRCS endif# bash 中执行 make $ make program.c   3.4 Makefile 中的函数 Makefile 中自带了一些函数, 利用这些函数可以简化 Makefile 的编写. 函数调用语法如下: $(function arguments) # 或者 ${function arguments} function 是函数名arguments 是函数参数  3.4.1 字符串函数 字符串替换函数: $(subst from,to,text) 功能: 把字符串text 中的 from 替换为 to 返回: 替换过的字符串 # Makefile 内容 all:echo $(subst t,e,maktfilt) -- 将t替换为e# bash 中执行 make $ make makefile   模式字符串替换函数: $(patsubst pattern,replacement,text) 功能: 查找text中的单词(单词以空格, tab, 换行来分割) 是否符合 pattern, 符合的话, 用 replacement 替代. 返回: 替换过的字符串 # Makefile 内容 all:echo $(patsubst %.c,%.o,programA.c programB.c)# bash 中执行 make $ make programA.o programB.o   去空格函数: $(strip string) 功能: 去掉 string 字符串中开头和结尾的空字符 返回: 被去掉空格的字符串值 # Makefile 内容 VAL : aa bb cc all:echo 去除空格前: $(VAL)echo 去除空格后: $(strip $(VAL))# bash 中执行 make $ make 去除空格前: aa bb cc 去除空格后: aa bb cc   查找字符串函数: $(findstring find,in) 功能: 在字符串 in 中查找 find 字符串 返回: 如果找到, 返回 find 字符串,  否则返回空字符串 # Makefile 内容 VAL : aa bb cc all:echo $(findstring aa,$(VAL))echo $(findstring ab,$(VAL))# bash 中执行 make $ make aa   过滤函数: $(filter pattern...,text) 功能: 以 pattern 模式过滤字符串 text, *保留* 符合模式 pattern 的单词, 可以有多个模式 返回: 符合模式 pattern 的字符串 # Makefile 内容 all:echo $(filter %.o %.a,program.c program.o program.a)# bash 中执行 make $ make program.o program.a   反过滤函数: $(filter-out pattern...,text) 功能: 以 pattern 模式过滤字符串 text, *去除* 符合模式 pattern 的单词, 可以有多个模式 返回: 不符合模式 pattern 的字符串 # Makefile 内容 all:echo $(filter-out %.o %.a,program.c program.o program.a)# bash 中执行 make $ make program.c   排序函数: $(sort list) 功能: 给字符串 list 中的单词排序 (升序) 返回: 排序后的字符串 # Makefile 内容 all:echo $(sort bac abc acb cab)# bash 中执行 make $ make abc acb bac cab   取单词函数: $(word n,text) 功能: 取字符串 text 中的 第n个单词 (n从1开始) 返回: text 中的第n个单词, 如果n 比 text 中单词个数要大, 则返回空字符串 # Makefile 内容 all:echo $(word 1,aa bb cc dd)echo $(word 5,aa bb cc dd)echo $(word 4,aa bb cc dd)# bash 中执行 make $ make aadd   取单词串函数: $(wordlist s,e,text) 功能: 从字符串text中取从s开始到e的单词串. s和e是一个数字. 返回: 从s到e的字符串 # Makefile 内容 all:echo $(wordlist 1,3,aa bb cc dd)echo $(word 5,6,aa bb cc dd)echo $(word 2,5,aa bb cc dd)# bash 中执行 make $ make aa bb ccbb   单词个数统计函数: $(words text) 功能: 统计字符串 text 中单词的个数 返回: 单词个数 # Makefile 内容all:echo $(words aa bb cc dd)echo $(words aabbccdd)echo $(words )# bash 中执行 make $ make 4 1 0   首单词函数: $(firstword text) 功能: 取字符串 text 中的第一个单词 返回: 字符串 text 中的第一个单词 # Makefile 内容 all:echo $(firstword aa bb cc dd)echo $(firstword aabbccdd)echo $(firstword )# bash 中执行 make $ make aa aabbccdd   3.4.2 文件名函数 取目录函数: $(dir names...) 功能: 从文件名序列 names 中取出目录部分 返回: 文件名序列 names 中的目录部分 # Makefile 内容 all:echo $(dir /home/a.c ./bb.c ../c.c d.c)# bash 中执行 make $ make /home/ ./ ../ ./   取文件函数: $(notdir names...) 功能: 从文件名序列 names 中取出非目录部分 返回: 文件名序列 names 中的非目录部分 # Makefile 内容 all:echo $(notdir /home/a.c ./bb.c ../c.c d.c)# bash 中执行 make $ make a.c bb.c c.c d.c   取后缀函数: $(suffix names...) 功能: 从文件名序列 names 中取出各个文件名的后缀 返回: 文件名序列 names 中各个文件名的后缀, 没有后缀则返回空字符串 # Makefile 内容 all:echo $(suffix /home/a.c ./b.o ../c.a d)# bash 中执行 make $ make .c .o .a   取前缀函数: $(basename names...) 功能: 从文件名序列 names 中取出各个文件名的前缀 返回: 文件名序列 names 中各个文件名的前缀, 没有前缀则返回空字符串 # Makefile 内容 all:echo $(basename /home/a.c ./b.o ../c.a /home/.d .e)# bash 中执行 make $ make /home/a ./b ../c /home/   加后缀函数: $(addsuffix suffix,names...) 功能: 把后缀 suffix 加到 names 中的每个单词后面 返回: 加过后缀的文件名序列 # Makefile 内容 all:echo $(addsuffix .c,/home/a b ./c.o ../d.c)# bash 中执行 make $ make /home/a.c b.c ./c.o.c ../d.c.c   加前缀函数: $(addprefix prefix,names...) 功能: 把前缀 prefix 加到 names 中的每个单词前面 返回: 加过前缀的文件名序列 # Makefile 内容 all:echo $(addprefix test_,/home/a.c b.c ./d.c)# bash 中执行 make $ make test_/home/a.c test_b.c test_./d.c   连接函数: $(join list1,list2) 功能: list2 中对应的单词加到 list1 后面 返回: 连接后的字符串 # Makefile 内容 all:echo $(join a b c d,1 2 3 4)echo $(join a b c d,1 2 3 4 5)echo $(join a b c d e,1 2 3 4)# bash 中执行 make $ make a1 b2 c3 d4 a1 b2 c3 d4 5 a1 b2 c3 d4 e   3.4.3 foreach 语法: $(foreach var,list,text)   示例: # Makefile 内容 targets : a b c d objects : $(foreach i,$(targets),$(i).o)all:echo $(targets)echo $(objects)# bash 中执行 make $ make a b c d a.o b.o c.o d.o   3.4.4 if 这里的if是个函数, 和前面的条件判断不一样, 前面的条件判断属于Makefile的关键字 语法: $(if condition,then-part) $(if condition,then-part,else-part)   示例: # Makefile 内容 val : a objects : $(if $(val),$(val).o,nothing) no-objects : $(if $(no-val),$(val).o,nothing)all:echo $(objects)echo $(no-objects)# bash 中执行 make $ make a.o nothing   3.4.5 call - 创建新的参数化函数 语法: $(call expression,parm1,parm2,parm3...)   示例: # Makefile 内容 log debug $(1) endall:echo $(call log,正在 Make)# bash 中执行 make $ make debug 正在 Make end   3.4.6 origin - 判断变量的来源 语法: $(origin variable) 返回值有如下类型: 类型 含义 undefinedvariable 没有定义过defaultvariable 是个默认的定义, 比如 CC 变量environmentvariable 是个环境变量, 并且 make时没有使用 -e 参数filevariable 定义在Makefile中command linevariable 定义在命令行中overridevariable 被 override 重新定义过automaticvariable 是自动化变量  示例: # Makefile 内容 val-in-file : test-file override val-override : test-overrideall:echo $(origin not-define) # not-define 没有定义echo $(origin CC) # CC 是Makefile默认定义的变量echo $(origin PATH) # PATH 是 bash 环境变量echo $(origin val-in-file) # 此Makefile中定义的变量echo $(origin val-in-cmd) # 这个变量会加在 make 的参数中echo $(origin val-override) # 此Makefile中定义的override变量echo $(origin ) # 自动变量, 具体前面的介绍# bash 中执行 make $ make val-in-cmdval-cmd undefined default environment file command line override automatic   3.4.7 shell 语法: $(shell shell command) 它的作用就是执行一个shell命令, 并将shell命令的结果作为函数的返回. 作用和 shell command 一样, 是反引号   3.4.8 make 控制函数 产生一个致命错误: $(error text ...) 功能: 输出错误信息, 停止Makefile的运行 # Makefile 内容 all:$(error there is an error!)echo 这里不会执行!# bash 中执行 make $ make Makefile:2: *** there is an error!. Stop.   输出警告: $(warning text ...) 功能: 输出警告信息, Makefile继续运行 # Makefile 内容 all:$(warning there is an warning!)echo 这里会执行!# bash 中执行 make $ make Makefile:2: there is an warning! 这里会执行!   3.5 Makefile中一些GNU约定俗成的伪目标 如果有过在Linux上, 从源码安装软件的经历的话, 就会对 make clean, make install 比较熟悉. 像 clean, install 这些伪目标, 广为人知, 不用解释就大家知道是什么意思了. 下面列举一些常用的伪目标, 如果在自己项目的Makefile合理使用这些伪目标的话, 可以让我们自己的Makefile看起来更专业, 呵呵 :) 伪目标 含义 all所有目标的目标其功能一般是编译所有的目标clean删除所有被make创建的文件install安装已编译好的程序其实就是把目标可执行文件拷贝到指定的目录中去print列出改变过的源文件tar把源程序打包备份. 也就是一个tar文件dist创建一个压缩文件, 一般是把tar文件压成Z文件. 或是gz文件TAGS更新所有的目标, 以备完整地重编译使用check 或 test一般用来测试makefile的流程转载于:https://www.cnblogs.com/wang_yb/p/3990952.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做网站成都求几个能用的地址2021

文章目录一、第1种方式1. 因依赖2. 工具类测试方法3. 服务端接收二、第2种方式三、第3种方式3.1. 引依赖3.2. 工具类测试3.3. 服务端代码一、第1种方式 1. 因依赖 <!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient --><dependency>…

广州翼讯资讯科技有限公司 网站地方建立网站做SEM

go-zero整合单机版Redis并实现增删改查 本教程基于go-zero微服务入门教程&#xff0c;项目工程结构同上一个教程。 go-zero微服务入门教程&#xff08;点击进入&#xff09; 本教程主要实现go-zero框架整合单机版Redis&#xff0c;并暴露接口实现对Redis数据的增删改查。 本…

政务网站建设经验交流发言百度推广怎么运营

目录 1、QT介绍 2、QT的特点 3、QT模块 3.1基本模块 3.2扩展模块 4、QT工程创建 1.选择应用的窗体格式 2.设置工程的名称与路径 3.设置类名 4.选择编译器 5、QT 工程解析 xxx.pro 工程配置 xxx.h 头文件 main.cpp 主函数 xxx.cpp 文件 6、纯手工创建一个QT 工程…

嘉兴型网站系统总部在什么网站上可以做中学数学家教

全世界只有3.14 % 的人关注了青少年数学之旅在这个资讯丰富且易获取的时代&#xff0c;越来越多的人不愿意花时间阅读书籍&#xff0c;碎片化阅读成了主流。人们获取的东西多而杂&#xff0c;很难系统、全面。海量信息对人是冲击&#xff0c;更是诱惑。谁不想了解天下奇闻&…

网站建设先进跟我学seo从入门到精通

前言 从刚开始学习阶段&#xff0c;一直是用的keil5开发stm32程序&#xff0c;自从看到稚晖君推荐的CLion开发嵌入式程序后&#xff0c;这次尝试在CLion上开发stm32程序。 1、配置CLion用于STM32开发的环境 这里我就不详细写了&#xff0c;没必要重新写&#xff0c;网上教程很多…

商城网站微信支付接口申请流程网站留言板怎么做

《基于单片机的物流皮带传输监控系统设计 实物仿真》 整体功能&#xff1a; 本设计采用以单片机为核心控制器&#xff0c;以及传感器检测部分作为输入部分&#xff0c;以报警、显示、洒水、排烟、电机停止模块作为输出部分&#xff0c;构成整个物流皮带传输监控系统。 本设计…

北京哪个网站最好重庆哪个网站建设比较好

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标从 0 开始&#xff09;&#xff0c;矩阵中有空格子&#xff08;用 . 表示&#xff09;和墙&#xff08;用 表示&#xff09;。 同时给你迷宫的入口 entrance &#xff0c;用 entrance [entra…

简洁的网站建设合同武进做网站的公司

通信&#xff0c;在古代是通过书信与他人互通信息的意思。 今天&#xff0c;“通信”这个词的外沿已经得到了极大扩展&#xff0c;它目前的大意是指双方或多方借助某种媒介实现信息互通的行为。 如果按照当代汉语的方式理解“通信”&#xff0c;那么古代的互遣使节、飞鸽传书…

济南网站建设直播苗木企业网站源码

一、首先需要思考&#xff0c;我们在页面导出excel&#xff0c;用python导出如何写入文件的 封装前需要确认python导出excel接口返回的是一个什么样的数据类型 如下&#xff1a;我们先看下不对返回结果做处理&#xff0c;直接接收数据类型是一个对象&#xff0c;无法获取返回值…

代码随想录算法训练营第五天 | leetcode 242 349 202 1

有效的字母异位词 题目:判断两个字符串的字母是否一样 解题思路:通过字母在Ascll表对应的数字可以定义一个26容量大小的数组,将字符串包含的字母映射到数组中,再用另一个字符串对数组进行操作 代码如下: class So…

CF2146 Codeforces Round 1052 (Div. 2) 游记

A 秒了,B 挂了,1t寄了,差点掉到青名。省流 A 秒了,B 挂了,1t寄了,差点掉到青名。9.21 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 毫无压力的新开一把,飞线接上了电源,不会因为电脑没电下班了。 赛时…

原码补码反码与位操作

今天搜索互联网那个引擎了解了原码补码反码的相关概念 原码是最直观的编码方式,用最高位表示符号(0为正,1为负),其余位表示数值的绝对值 正数的反码与原码相同;负数的反码是对其原码的数值位取反(符号位不变) …

如何安装 SQLPro Studio for Mac?v2024.21.dmg 文件安装步骤详解(附安装包)

如何安装 SQLPro Studio for Mac?v2024.21.dmg 文件安装步骤详解(附安装包)​一、安装前准备​确保你下的是靠谱的文件​ SQLPro Studio for Mac v2024.21.dmg​ 应该是一个 ​DMG 格式的安装包,安装包下载:https…

全新正版营销网站怎么给钓鱼网站做防红

计算函数的变分是指在变分法中寻找函数的极值。变分法是一种数学方法&#xff0c;用于求解函数或泛函的极值问题。在物理学、工程学和数学的最优化问题中&#xff0c;变分法是寻找函数使得某个泛函&#xff08;函数的函数&#xff09;达到极值的过程。 在数学上&#xff0c;泛…

网站建设方案平台架构做网站需要备案吗

2017年2月8日&#xff0c;那是一个阴天。为了完成高翔博士的《一起做RGB-D SLAM》教程&#xff0c;我在 Ubuntu 14.04 安装 g2o。遇到困难&#xff0c;怎奈我眼瞎&#xff0c;找错了方向&#xff0c;浪费时间&#xff0c;没有成功安装。 问题如下&#xff08;跳到最后一个问题描…

郑州炫彩网站建设万网网站建设流程

IO流IO流使用场景 什么是IO流常用的IO流字节流字符流缓冲流 BIO、NIO、AIO的区别 IO流 IO流使用场景 如果操作的是纯文本文件&#xff0c;优先使用字符流如果操作的是图片、视频、音频等二进制文件。优先使用字节流如果不确定文件类型&#xff0c;优先使用字节流。字节流是万能…

献县网站建设公司wordpress主题更新失败

2023年8月18日&#xff0c;周五上午 今天在B站看Qt教学视频的时候遇到了 目录 语法和typedef或using结合我的总结 语法 返回类型 (*指针变量名)(参数列表)以下是一些示例来说明如何声明不同类型的函数指针&#xff1a; 声明一个不接受任何参数且返回void的函数指针&#xf…

深圳外贸网站商城相片制作图片

避免索引失效原则(二)注&#xff1a;继上一篇文章继续讲解&#xff1a;避免索引失效原则(一)https://www.cnblogs.com/StanleyBlogs/p/10482048.html#4195062作者 &#xff1a; Stanley 罗昊【转载请注明出处和署名&#xff0c;谢谢&#xff01;】体验SQL优化中的概率情况在上一…

带有互动的网站开发网页设计素材 模板材料

安卓自定义属性主要有3个步骤 在values文件夹新建attrs.xml文件中声明属性&#xff0c;包括属性名和格式&#xff0c;format常用属性有string ,integer,reference等 <?xml version"1.0" encoding"utf-8"?> <resources><!-- 声明属性集…

建设网站 (公司)学做网站要代码

苹果的应用讲究用户体验 有的时候仔细想想 的确&#xff0c;很多细节决定了用户体验 比如说惯性拖动 可以说之前没有任何一家厂商能把触摸惯性拖动做的像苹果的UI那么流畅 Cocos2D中实现能够惯性拖动的选择界面 完成的效果&#xff1a; 制作一个简单的图层&#xff0c;通过传入…