⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8.htm

📁 makefile文件详解
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>20CN网络安全小组--makefile(8) </title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><meta name="keywords" content="黑客,安全,网络,编程,黑客软件,安全软件,hacker,UNIX,Linux,FreeBSD"><meta name="description" content="黑客,安全,网络,编程,黑客软件,安全软件,hacker,UNIX,Linux,FreeBSD"><STYLE type=text/css>A {  font-size: 12px; color: 004d9c; TEXT-DECORATION: none}A:visited { TEXT-DECORATION: none}A:active {  TEXT-DECORATION: none}A:hover {  color: #0000FF; text-decoration: none}.9p {  font-size: 12px }.10p {  font-size: 10pt}.9pten {  font-size: 9pt; font-family: "verdana, Helvetica, Times New Roman, sans-serif"}.textinfo {  font-size: 10.5pt; font-family: "verdana, Helvetica, Times New Roman, 宋体, sans-serif"; line-height: 21px ;letter-spacing:}.code {  font-size: 10pt; font-family: "Courier New,  sans-serif"}</STYLE></head><body bgcolor="#FFFFFF" leftmargin="0" topmargin="4" marginwidth="0" marginheight="0"><div align="center"><table width="768" border="1" bordercolor="#FFFFFF" class="9p"> <tr> <td bordercolor="ffffff" colspan="2" bgcolor="ffffff" align="right">     <a href="http://www.20cn.net/aboutus.html">关于我们</a>   | <a href="http://www.20cn.net/joinus.html">加入我们</a>   | <a href="http://www.20cn.net/help.html">网站结构</a>   | <a href="http://www.20cn.net/linkus.html">交换连接</a>   | <a href="mailto:webmaster@20cn.com">联系我们</a> </td> </tr></table><table width="768" border="1" height="51" bordercolor="5296ff" class="9p">  <tr>    <td height="43" bordercolor="ffffff" colspan="2" bgcolor="ffffff">      <table width="100%" bgcolor="ffffff" bordercolor="ffffff" cellpadding="0" cellspacing="0" border="0">        <tr>          <td ><img src="http://www.20cn.net/images/logo.jpg"></td>          <td width="%100" height="40" align="center"><img src="http://www.20cn.net/images/banner.gif"></td>        </tr>      </table>    </td>  </tr>  <tr>    <td width="559" height="23" align="center">          | <a href="http://www.20cn.net/ns/html/">最新文档</a>          | <a href="http://www.20cn.net/ns/wz/">技术文摘</a>          | <a href="http://www.20cn.net/ns/ld/">安全漏洞</a>          | <a href="http://www.20cn.net/ns/cn/">菜鸟乐园</a>          | <a href="http://www.20cn.net/ns/hk/">黑客进阶</a>          | <a href="http://www.20cn.net/netdemon/">技术文库</a>          | <a href="http://www.20cn.net/download/" target="_blank">软件下载</a>          | <a href="http://www.20cn.net/club/" target="_blank">技术论坛</a>          |    </td>    <td width="193" bgcolor="adcbef" height="23">      <div align="center">        <script language=JavaScript src="http://www.20cn.net/date.js"></script>      </div>    </td>  </tr></table><!-- End Herder -->  <table width="768" border="1" bordercolor="5296ff">    <tr>      <td colspan="3" bordercolor="#FFFFFF">        <table width="100%" border="0" cellspacing="0" class="9p">          <tr>            <td width="74%"> 您现在的位置 >> <a href="http://www.20cn.net/">返回首页</a></td>            <td width="26%" align="center">		文档发表时间:2002-08-01            </td>        </table>      </td>    </tr>    <tr valign="top">      <td colspan="3" bordercolor="#FFFFFF">    <table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#adcbef" bordercolor="#adcbef">     <tr bgcolor="#F7F7F7" valign="top">      <td class="9p">       <table border="0" cellpadding="0" cellspacing="10" width="100%">        <tr>         <td class="textinfo">          <p>makefile(8)  <span style="font-size: 9pt">(阅览<font color="#FF0000">                <script src="http://www.20cn.net/cgi-bin/ns/count.cgi?id=20020801151230"></script>                </font>次)</span></p>              <p>makefile(8) <br><br> <br>作者:ermiao     发表时间:2002/07/09 09:19am<br> <br>标  题: 关于makefile(8) <br>2.8 一个更好的 makefile <br>这是一个我为我大多数项目设计的 makefile 。它应该可以不需要修 改的用在大部分项目里。我主要把它用在 djgpp 上,那是一个 DOS 版的 gcc 编译器。因此你可以看到执行的命令名、 'alleg' 程序包、 和 RM -F 变量都反映了这一点。 <br>=== makefile 开始 === <br>###################################### <br># <br># Generic makefile <br># <br># by George Foot <br># email: george.foot@merton.ox.ac.uk <br># <br># Copyright (c) 1997 George Foot <br># All rights reserved. <br># 保留所有版权 <br># <br># No warranty, no liability; <br># you use this at your own risk. <br># 没保险,不负责 <br># 你要用这个,你自己担风险 <br># <br># You are free to modify and <br># distribute this without giving <br># credit to the original author. <br># 你可以随便更改和散发这个文件 <br># 而不需要给原作者什么荣誉。 <br># (你好意思?) <br># <br>###################################### <br>### Customising <br># 用户设定 <br># <br># Adjust the following if necessary; EXECUTABLE is the target <br># executable's filename, and LIBS is a list of libraries to link in <br># (e.g. alleg, stdcx, iostr, etc). You can override these on make's <br># command line of course, if you prefer to do it that way. <br># <br># 如果需要,调整下面的东西。 EXECUTABLE 是目标的可执行文件名, LIBS <br># 是一个需要连接的程序包列表(例如 alleg, stdcx, iostr 等等)。当然你 <br># 可以在 make 的命令行覆盖它们,你愿意就没问题。 <br># <br>EXECUTABLE := mushroom.exe <br>LIBS := alleg <br># Now alter any implicit rules' variables if you like, e.g.: <br># <br># 现在来改变任何你想改动的隐含规则中的变量,例如 <br>CFLAGS := -g -Wall -O3 -m486 <br>CXXFLAGS := $(CFLAGS) <br># The next bit checks to see whether rm is in your djgpp bin <br># directory; if not it uses del instead, but this can cause (harmless) <br># `File not found' error messages. If you are not using DOS at all, <br># set the variable to something which will unquestioningly remove <br># files. <br># <br># 下面先检查你的 djgpp 命令目录下有没有 rm 命令,如果没有,我们使用 del 命令来代替,但有可能给我们 'File not found' 这个错误信息,这没 # 什么大碍。如果你不是用 DOS ,把它设定成一个删文件而不废话的命令。  (其实这一步在 UNIX 类的系统上是多余的,只是方便 DOS 用户。 UNIX  用户可以删除这5行命令。) <br><br>ifneq ($(wildcard $(DJDIR)/bin/rm.exe),) <br>RM-F := rm -f <br>else <br>RM-F := del <br>endif <br># You shouldn't need to change anything below this point. <br># <br># 从这里开始,你应该不需要改动任何东西。(我是不太相信,太NB了!) <br>SOURCE := $(wildcard *.c) $(wildcard *.cc) <br>OBJS := $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCE))) <br>DEPS := $(patsubst %.o,%.d,$(OBJS)) <br>MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS)) <br>MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS)) \ <br>$(patsubst %.d,%.cc,$(MISSING_DEPS))) <br>CPPFLAGS += -MD <br>..PHONY : everything deps objs clean veryclean rebuild <br>everything : $(EXECUTABLE) <br>deps : $(DEPS) <br>objs : $(OBJS) <br>clean : <br>@$(RM-F) *.o <br>@$(RM-F) *.d <br>veryclean: clean <br>@$(RM-F) $(EXECUTABLE) <br>rebuild: veryclean everything <br>ifneq ($(MISSING_DEPS),) <br>$(MISSING_DEPS) : <br>@$(RM-F) $(patsubst %.d,%.o,$@) <br>endif <br>-include $(DEPS) <br>$(EXECUTABLE) : $(OBJS) <br>gcc -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS)) <br>=== makefile 结束 === <br>有几个地方值得解释一下的。首先,我在定义大部分变量的时候使 用的是 := 而不是 <br>= 符号。它的作用是立即把定义中参考到的函 数和变量都展开了。如果使用 = 的话, <br>函数和变量参考会留在那 儿,就是说改变一个变量的值会导致其它变量的值也被改 <br>变。例 如: <br>A = foo <br>B = $(A) <br># 现在 B 是 $(A) ,而 $(A) 是 'foo' 。 <br>A = bar <br># 现在 B 仍然是 $(A) ,但它的值已随着变成 'bar' 了。 <br>B := $(A) <br># 现在 B 的值是 'bar' 。 <br>A = foo <br># B 的值仍然是 'bar' 。 <br>make 会忽略在 # 符号后面直到那一行结束的所有文字。 <br>ifneg...else...endif 系统是 makefile 里让某一部分码有条件的 失效/有效的工 <br>具。 ifeq 使用两个参数,如果它们相同,它把直 到 else (或者 endif ,如果没有 <br><br>else 的话)的一段码加进 makefile 里;如果不同,把 else 到 endif 间的一段码加入 makefile (如果有 else )。 ifneq 的用法刚好相反。 'filter-out' 函数使用两个用空格分开的列表,它把第二列表中所 有的存在于第一列 表中的项目删除。我用它来处理 DEPS 列表,把所 有已经存在的项目都删除,而只保留缺少的那些。 <br>我前面说过, CPPFLAGS 存有用于隐含规则中传给预处理器的一些 旗标。而 -MD 开关 类似 -M 开关,但是从源码文件 .c 或 .cc 中 形成的文件名是使用后缀 .d 的(这就 解释了我形成 DEPS 变量的 步骤)。DEPS 里提到的文件后来用 '-include' 加进了 makefile 里,它隐藏了所有因文件不存在而产生的错误信息。 如果任何依靠文件不存在, makefile 会把相应的 .o 文件从磁碟 上删除,从而使得 make 重建它。因为 CPPFLAGS 指定了 -MD , 它的 .d 文件也被重新产生。 最后, 'addprefix' 函数把第二个参数列表的每一项前缀上第一 个参数值。 这个 makefile 的那些目的是(这些目的可以传给 make 的命令行 来直接选用): <br>everything:(预设) 更新主要的可执行程序,并且为每一个 源码文件生成或更新一个 '.d' 文件和一个 '.o' 文件。 deps: 只是为每一个源码程序产生或更新一个 '.d' 文件。 objs: 为每一个源码程序生成或更新 '.d' 文件和目标文件。 clean: 删除所有中介/依靠文件( *.d 和 *.o )。 <br>veryclean: 做 `clean' 和删除可执行文件。 <br>rebuild: 先做 `veryclean' 然后 `everything' ;既完全重建。 <br>除了预设的 everything 以外,这里头只有 clean , veryclean , 和 rebuild 对用户是有意义的。 我还没有发现当给出一个源码文件的目录,这个 makefile 会失败的 情况,除非依靠 文件被弄乱。如果这种弄乱的情况发生了,只要输入 `make clean' ,所有的目标文件和依靠文件会被删除,问题就应该 被解决了。当然,最好不要把它们弄乱。如果你发现在某种情况下这 个 makefile 文件不能完成它的工作,请告诉我,我会把它整好的。 <br>3 总结 <br>我希望这篇文章足够详细的解释了多文件项目是怎么运作的,也说明了 怎样安全而合理的使用它。到此,你应该可以轻松的利用 GNU Make 工 具来管理小型的项目,如果 你完全理解了后面几个部分的话,这些对于 你来说应该没什么困难。 GNU Make 是一件强大的工具,虽然它主要是用来建立程序,它还有很多 别的用处。如果想要知道更多有关这个工具的知识,它的句法,函数, 和许多别的特点,你应该参 <br>看它的参考文件 (info pages, 别的 GNU 工具也一样,看它们的 info pages. )。 <br><br> <br> <br></p>              <p align="right"><a href="javascript:history.go(-1)" class="textinfo">返回            </a></p>         </td>        </tr>       </table>      </td>     </tr>    </table>   </td>  </tr> </table> <!-- Start Fooder --><p align="center" class="9p">建议您使用<font face="Verdana, Arial, Helvetica, sans-serif">IE</font>浏览器<font color="#FF0000" face="Verdana, Tahoma, Times New Roman, 宋体, MS Sans Serif">800×600</font>以上分辩率浏览以获最佳效果<br><br><font face="Verdana, Arial, Helvetica, sans-serif">20CN</font>网络安全小组版权所有<br><font face="Verdana, Tahoma, Times New Roman, 宋体, MS Sans Serif">Copyright &copy;2000-2003 20CN Network Security Group. All Rights Reserved.</font><br>如有任何问题及建议请写信至<a href="mailto:webmaster@20cn.net"><font color="#000000" face="Verdana, Tahoma, Times New Roman, 宋体, MS Sans Serif">webmaster@20cn.net</font></a></p><p align="center" class="9p"><img src="http://www.20cn.net/images/powerd-4.4bsd.gif" border="0"></p><p align="center" class="9p"><script language="JavaScript">var urodz = new Date("DEC 31, 2000");var now = new Date();var ile = now.getTime() - urodz.getTime();var dni = Math.floor(ile / (1000 * 60 * 60 * 24)) + 1;if (dni > 0)   document.write("建站第 " + dni + " 天")else    document.write("建站第 " + dni + " 天");</script><br></p></div></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -