跟我一起makefile学习笔记

一、术语解析

1.自动化变量

$<:所有的依赖集合。扩展成依靠列表中的第一个依靠文件

$@:规则的目标所对应的所有文件,扩展成当前规则的目的文件名。注:&(OBJECTS)才是所有目标的集合。【疑难辨析,到底有何本质不同】

$?:

$^:扩展成整个依靠的列表(除掉了里面所有重复的文件名)


$@   扩展成当前规则的目的文件名, $ <   扩展成依靠列表中的第一个依靠文件(如foo.o   :   foo.c   foo.h   bar.h ,则$<代表foo.c),而   $^   扩展成整个依靠的列表(除掉了里面所有重复的文件名)。利用这些变量,我们可以把上面的   makefile   写成: 

[cpp]  view plain copy
  1. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">===   makefile   开始   ===   
  2. OBJS   =   foo.o   bar.o   
  3. CC   =   gcc   
  4. CFLAGS   =   -Wall   -O   -g   
  5. myprog   :   $(OBJS)   
  6.     $(CC)   $^   -o   $@              //此时,$^代表整个依靠的列表,是foo.c,bar.c(隐规则)???  $@代表myprog吧  
  7. foo.o   :   foo.c   foo.h   bar.h   
  8.     $(CC)   $(CFLAGS)   -c   $ <   -o   $@        //{1}lt;代表foo.c,&@代表foo.o  
  9. bar.o   :   bar.c   bar.h   
  10.     $(CC)   $(CFLAGS)   -c   $ <   -o   $@   
  11. ===   makefile   结束   === </pre>  
  12. <pre></pre>  
  13. <p></p>  
  14. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  15. $@表示一个目标的集合(一个判断特征:多目标),可以理解为C中的数组,依次取出目标,并执行命令。</p>  
  16. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  17. 请看示例2:</p>  
  18. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  19. </p>  
  20. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code"><pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">bigoutput littleoutput : text.g   
  21.  generate text.g -$(subst output,,$@)  
  22. //上述规则等价于  
  23. bigoutput : text.g   
  24.  generate text.g -big > bigoutput   
  25. littleoutput : text.g   
  26.  generate text.g -little > littleoutput </pre>  
  27. <pre></pre>  
  28. <p></p>  
  29. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  30. <strong>2.关键字</strong></p>  
  31. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  32. 1)<span style="font-family:monospace; white-space:pre"><span style="color:#ff6666">wildcard:</span></span></p>  
  33. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  34. </p>  
  35. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  36. <span style="color:#ff6666">比较:objects = *.o  //不展开</span></p>  
  37. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  38. <span style="color:#ff6666">            objects := $(wildcard *.o) //展开. 让objects的值是所有.o文件的集合</span></p>  
  39. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  40. <span style="color:#ff6666"><span style="color:#333333">在 GNU Make 里有一个叫 ’wildcard’ 的函 数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。你可以像下面所示使用这个命令:          SOURCES = $(wildcard *.c)          这行会产生一个所有以 ".c" 结尾的文件的列表,然后存入变量 SOURCES 里。当然你不需要一定要把结果存入一个变量。 </span></span></p>  
  41. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  42. <strong>3.伪目标.PHONY,clean,all</strong></p>  
  43. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  44. all     : $(OUTDIR) $(OUTDIR)/$(OUTBINNAME).PHONY : all</p>  
  45. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  46. ===============================温馨提示:伪目标=======================================</p>  
  47. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  48. </p>  
  49. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">all : prog1 prog2 prog3   
  50. .PHONY : all   
  51. prog1 : prog1.o utils.o   
  52.  cc -o prog1 prog1.o utils.o   
  53. prog2 : prog2.o   
  54.  cc -o prog2 prog2.o   
  55. prog3 : prog3.o sort.o utils.o   
  56.  cc -o prog3 prog3.o sort.o utils.o </pre>  
  57. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  58. <span style="color:#ff6666">由于伪目标的特性,总是被执行的。所以,all,prog1,prog2,prog3都是可执行文件。</span></p>  
  59. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  60. ====================================================================================</p>  
  61. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  62. </p>  
  63. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  64. <span style="font-family:Arial; color:#333333; font-size:14px; line-height:26px"></span></p>  
  65. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  66. <strong>3.标签label</strong></p>  
  67. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  68. <strong>4..PHONY : clean     </strong>//代表clean是个伪目标文件</p>  
  69. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  70. <strong>5.环境变量MAKEFILES:</strong>建议不用,因为它类似于全局变量,会使你所有的Makefile都受其影响。当你的makefile出现怪事时,可以检查环境变量中是否有它。</p>  
  71. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  72. <strong>6.-M选项</strong>:自动生成依赖性,自动包含头文件。</p>  
  73. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  74.     如我们执行命令:  cc -M main.c  <br>  
  75.     输出:main.o : main.c defs.h </p>  
  76. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  77. 7.可执行文件。如exec:</p>  
  78. <h1 style="padding-right:0px; padding-left:0px; padding-bottom:0px; margin:0px; padding-top:0px">  
  79. 二、变量定义</h1>  
  80. <div>这里的变量就像C语言中的宏定义。</div>  
  81. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  82. </p>  
  83. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  84. </p>  
  85. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">#方式一:定义多行变量  
  86. define variable  
  87. value  
  88. value  
  89. endef  
  90. #方式二:  
  91. variable = value  
  92. #方式三:  
  93. variable := value  
  94. #方式四:  
  95. variable += value  
  96. #方式五:  
  97. variable ?= value</pre><pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code"><pre class="cpp" name="code">=   :从后往前定义,后面的值决定最终。这种方式要小心使用。还是使用:=为妙啊。当然简单的情况下还是使用这个好。  
  98. :=  
  99. +=  :追加  
  100. ?=  :  
  101.   
  102. </pre>  
  103. <pre></pre>  
  104. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code"><pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code"></pre><span style="font-size:18px"><strong>三、通配符</strong></span>  
  105. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  106. </p>  
  107. <pre class="cpp" name="code">*  
  108. ?  
  109. ...  
  110. ~  
  111. %</pre><br>  
  112. <p></p>  
  113. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  114. 注意:若文件句中有*,则可以加上转义字符\*</p>  
  115. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  116. ===========     实例解析   ==============</p>  
  117. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  118. 1)*.c与%.c是同义吗?</p>  
  119. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  120. </p>  
  121. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  122. ===================================</p>  
  123. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  124. <strong><span style="font-size:18px">四、使用函数</span></strong></p>  
  125. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  126. <strong>1. $(subst <from>,<to>,<text>) </strong></p>  
  127. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  128. 把字串text中的from替换成to</p>  
  129. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  130. <strong>2.$(patsubst <pattern>,<replacement>,<text>) </strong></p>  
  131. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  132. 模式字串替换函数:pattern(模式)</p>  
  133. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  134. 示例:    $(patsubst %.c,%.o,x.c.c bar.c)   把 x.c.c bar.c符合模式%.c替换成%.o,替换结果为x.c.o bar.</p>  
  135. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  136. <strong>3.filter函数</strong></p>  
  137. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  138. </p>  
  139. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">files = foo.elc bar.o lose.o   
  140. $(filter %.o,$(files)): %. %.c   //filter表示过滤取出files集合中后缀为%.o的文件  
  141. $(CC) -c $(CFLAGS) {1}lt; -o $@   
  142. $(filter %.elc,$(files)): %.elc: %.el   
  143.  emacs -f batch-byte-compile {1}lt; </pre><strong><span style="color:#ff6666">4.</span></strong><span style="font-family:simsun; font-size:14px; line-height:21px"><strong><span style="color:#ff6666">foreach <wbr>函数</span></strong></span>  
  144. <p></p>  
  145. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  146. <span style="font-family:simsun; color:#464646; font-size:14px; line-height:21px">foreach 函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell (/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的foreach语句而构建的。它的语法是:<br>  
  147.  <wbr>$(foreach <wbr><var>;,<list>;,<text>;)</span></p>  
  148. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  149. <span style="font-family:simsun; color:#464646; font-size:14px; line-height:21px">这个函数的意思是,把参数<list>;中的单词逐一取出放到参数<var>;所指定的变量中,然后再执行< text>;所包含的表达式。每一次<text>;会返回一个字符串,循环过程中,<text>;的所返回的每个字符串会 以空格分隔,最后当整个循环结束时,<text>;所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。<br>  
  150. 所以,<var>;最好是一个变量名,<list>;可以是一个表达式,而<text>;中一般会使用<var>;这个参数来依次枚举<list>;中的单词。举个例子:<br>  
  151. </span></p>  
  152. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">names := a b c d  
  153. files := $(foreach n,$(names),$(n).o)</pre>上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,“$(n).o”每次根据“$(n)”计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$(files)的值是“a.o <wbr>b.o <wbr>c.o <wbr>d.o”。  
  154. <p></p>  
  155. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  156. <span style="font-family:simsun; color:#464646; font-size:14px; line-height:21px">注意,foreach中的<var>;参数是一个临时的局部变量,foreach函数执行完后,参数<var>;的变量将不在作用,其作用域只在foreach函数当中。</span></p>  
  157. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  158. <span style="font-family:simsun; color:#464646; font-size:14px; line-height:21px"><br>  
  159. </span></p>  
  160. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  161. <span style="font-size:18px"><strong>五、静态模式</strong></span></p>  
  162. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  163. <span style="font-size:18px"><strong><br>  
  164. </strong></span></p>  
  165. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  166. <span style="font-size:24px"><span style="font-size:18px"><strong><br>  
  167. </strong></span></span></p>  
  168. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  169. <span style="font-size:18px"><strong>六、Makefile规则</strong></span></p>  
  170. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  171. <span style="color:#ff9966">target ... : prerequisites ... <br>  
  172.             command</span><br>  
  173. </p>  
  174. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  175. target:是一个目标文件,可以是object file(多个文件),也可以是执行文件,还可以是标签。</p>  
  176. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  177. prerequisites:是生成 target所需要的文件或目标</p>  
  178. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  179. ======================  温馨提示  ===============================</p>  
  180. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  181. </p>  
  182. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o   
  183.  cc -o edit main.o kbd.o command.o display.o  insert.o search.o files.o utils.o             //小心观察比较,这里的CC跟的是-o,后面跟的是edit,main.o等。下面的CC跟的是-c,其后                                                                                                                                                         //跟的是.c  
  184. main.o : main.c defs.h   
  185.  cc -c main.c </pre>  
  186. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  187. </p>  
  188. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  189. ==============================================================</p>  
  190. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  191. <span style="font-size:18px"><strong>七、 让make自动推导</strong></span></p>  
  192. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  193. 1.只要makefile看到.o文件它就会自动推导找到生成自己的.c文件</p>  
  194. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  195. 自动推导文件及文件所依赖的命令</p>  
  196. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  197. <br>  
  198. </p>  
  199. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  200. <strong>八、其它 </strong></p>  
  201. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  202. <strong>1.文件搜寻</strong></p>  
  203. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  204. 1)</p>  
  205. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  206. </p>  
  207. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">VPATH = src:../headers</pre>  
  208. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  209. </p>  
  210. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  211. 上面指令指定 了两个目录“src”和“<span style="color:#ff6666">../headers</span>”,当然当前目录永远是最先搜索的对象。<span style="color:#ff6666">目录由“:”分开。</span><br>  
  212. </p>  
  213. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  214. 2)</p>  
  215. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">   vpath %.c foo   
  216.    vpath %.c blish   
  217.    vpath %.c bar </pre>  
  218. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  219. </p>  
  220. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  221. 上面指令表示先在foo目录中搜索.c文件,然后依次在blish目录,bar目录搜索。</p>  
  222. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  223. 3)</p>  
  224. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  225. vpath %.h ../headers<br>  
  226. </p>  
  227. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  228. 上面是模式搜索</p>  
  229. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  230. <strong><span style="font-size:18px">九、实例分析</span></strong></p>  
  231. <p style="padding-right:0px; padding-left:0px; padding-bottom:2px; margin:4px 0px; padding-top:2px">  
  232. </p>  
  233. <pre class="cpp" style="MARGIN: 4px 0px; BACKGROUND-COLOR: rgb(240,240,240)" name="code">[root@localhost new2416]# make CC=arm-linux-gcc  
  234. mkdir   obj   
  235. arm-linux-gcc -c -O2 -o  obj/main.o main.c   
  236. arm-linux-gcc -c -O2 -o  obj/bmp.o bmp/bmp.c  
  237. arm-linux-gcc -c -O2 -o  obj/lcddriver.o lcddriver/lcddriver.c  
  238. arm-linux-gcc -c -O2 -o  obj/disp.o disp/disp.c  
  239. arm-linux-gcc -c -O2 -o  obj/zklib.o zklib/zklib.c  
  240. arm-linux-gcc -c -O2 -o  obj/gps.o gps/gps.c  
  241. arm-linux-gcc -c -O2 -o  obj/usb.o usb/usb.c  
  242. arm-linux-gcc -c -O2 -o  obj/timer.o timer/timer.c  
  243. arm-linux-gcc -c -O2 -o  obj/anet.o anet/anet.c  
  244. arm-linux-gcc -c -O2 -o  obj/omc.o omc/omc.c  
  245. arm-linux-gcc -o  obj/go obj/main.o  obj/bmp.o  obj/lcddriver.o  obj/disp.o  obj/zklib.o  obj/gps.o  obj/usb.o  obj/timer.o  obj/anet.o  obj/omc.o  -lpthread  -lm  
  246. Finished!  
  247. Binfile is obj/go!  
  248. </pre>上例一个难点是从相应目录中找到.c文件生成.o文件。  
  249. <p><br>  
  250. </p>  
  251. <p><strong><span style="font-size:18px">十、隐晦规则</span></strong></p>  
  252. <p>1.$(objects) : defs.h</p>  
  253. <p><br>  
  254. </p>  
  255. <p><span style="font-size:18px"><strong>十一、注意事项</strong></span></p>  
  256. <p><span style="color:#ff6666">1.命令一定要以Tab键开头,否则不会被执行</span></p>  
  257. <p><br>  
  258. </p>  
  259. <pre></pre>  
  260. <pre></pre>  
  261. <pre></pre>  
  262. <pre></pre>  
  263. <pre></pre>  
  264. <pre></pre>  
  265. <pre></pre>  
  266. <pre></pre>  
  267. <pre></pre>  
  268. <pre></pre>  
  269. <pre></pre>  
  270. <pre></pre>  
  271. <pre></pre>  
  272. <pre></pre>  
  273. <pre></pre>  
  274. <pre></pre>  
  275. <pre></pre>  
  276. <pre></pre>  
  277. <pre></pre>  
  278. </pre></pre></pre>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值