📄 linux联盟 善用gnu make做开发].htm
字号:
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>TOPDIR = /home/xiaowp
SUBDIR := $(TOPDIR)/project
SUBDIR += /src</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR> SUBDIR在第一次定义时使用“:=”将其值设置为“/home/xiaowp/project”,而在第二次定义时则使用“+=”在已有的基础上添加“/src”,这样就使得SUBDIR的最终值变为“/home/xiaowp/project/src”。许多程序员在Makefile中只使用简单展开变量,以避免可能出现的错误。 <BR><BR> 除了用户自定义变量之外,在Makefile中还可以使用环境变量、自动变量和预定义变量。使用环境变量的方法相对来讲比较简单,make在启动时会自动读取系统当前已经定义了的环境变量,并且会创建与之具有相同名称和数值的变量。需要注意的是,如果用户在Makefile中定义了相同名称的变量,那么用户自定义变量将会覆盖同名的环境变量。 <BR><BR>
<CENTER>表1 常用自动变量<BR><IMG src="http://tech.ccidnet.com/pub/attachment/2004/11/358763.jpg"></CENTER><BR><BR> 此外,make还提供了一些预定义变量和自动变量,但它们看起来都不如自定义变量那么直观。之所以称为自动变量是因为make会自动用特定的、熟知的值来替换它们,表1给出了常用的部分自动变量。 <BR><BR> 利用make的自动变量和预定义变量,可以简化前面给出的那个Makefile文件: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>OBJS = control.o ui.o main.o
CC = GCC
CFLAGS = -Wall
all : program
program : $(OBJS)
$(CC) $(OBJS) -o $@
control.o : control.c
$(CC) $(CFLAGS) -c -o $@ $<
ui.o : ui.c
$(CC) $(CFLAGS) -c -o $@ $<
main.o : main.c
$(CC) $(CFLAGS) -c -o $@ $<
clean :
$(RM) program $(OBJS)</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR> <B>伪目标</B> <BR><BR> 在Makefile中,并不是所有的目标都对应于磁盘上的文件。有的目标存在只是为了形成一条规则,从而完成特定的工作,并不生成新的目标文件,这样的目标称为伪目标。它并不是真正意义上的目标文件,只是为了满足Makefile的语法规则而存在的。 <BR><BR> 在已经给出的Makefile文件中,最后一个目标clean就是伪目标。它规定了make应该执行的命令。当make处理到目标clean时,会先查看其对应的依赖对象。由于clean没有任何依赖对象,所以make会认为该目标是最新的而不会执行任何操作。为了编译这个目标体,必须手工执行如下命令:# make clean <BR><BR> 作为惯例,clean目标一般用于删除最终生成的可执行文件和在编译过程中产生的所有目标文件。问题是,如果恰巧有一个名为clean的文件存在时该怎么办呢?此时因为在这个规则里没有任何依赖对象,所以目标文件肯定是最新的,规则中的命令无论如何也不会被执行,即使用命令“make clean”也无济于事。解决这一问题的方法是标明该规则中的目标是伪目标,并不对应于任何文件。这可以通过.PHONY目标实现。它告诉make不检查规则的目标文件是否存在于磁盘上,也不查找任何隐含规则,而直接假设指定的目标需要被更新就行了。在使用了.PHONY之后,前面的给出的Makefile文件就将变为如下的内容: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>OBJS = control.o ui.o main.o
CC = GCC
CFLAGS = -Wall
all : program
program : $(OBJS)
$(CC) $(OBJS) -o $@
control.o : control.c
$(CC) $(CFLAGS) -c -o $@ $<
ui.o : ui.c
$(CC) $(CFLAGS) -c -o $@ $<
main.o : main.c
$(CC) $(CFLAGS) -c -o $@ $<
.PHONY : clean
clean :
$(RM) program $(OBJS)</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR> <B>其它规则</B> <BR><BR> 除了可以在Makefile中明确指定规则(显示规则)之外,make还维护了一整套隐式规则。隐式规则可以在用户没有完整地给出某些命令的时候,自动执行恰当的操作。隐式规则最大的好处是可以简化Makefile的编写和维护,例如前面给出的Makefile运用隐式规则后可以简化为如下内容: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>OBJS = control.o ui.o main.o
program : $(OBJS)
$(CC) $(OBJS) -o $@
.PHONY : clean
clean :
$(RM) program $(OBJS)</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR> 默认目标program依赖于control.o、ui.o和main.o三个目标文件,但Makefile中并没有给出怎样编译生成这些目标的规则。此时make就会使用隐式规则,对每一个名为foo.o的目标文件,找到与之对应的源代码foo.c,然后使用“gcc -c foo.c -o foo.o”命令来生成对应的目标文件。 <BR><BR> 除了系统预定义的隐式规则外,在Makefile中还可以定义自己的隐式规则,这种规则也被称为模式规则。模式规则类似于普通规则,但它的目标必须含有“%”这一通配符,以便能与任何非空字符相匹配,与目标对应的依赖文件中也必须使用通配符,例如下面的规则: <BR><BR><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR><BR><BR> 上面的规则将告诉make所有形为foo.o的目标文件,都应该根据指定的命令从源文件foo.c编译而来。 <BR><BR> <B>小结</B> <BR><BR> 在构建大型的软件项目时,make是一个优秀的持续集成工具。它对于软件开发过程来讲非常重要。本文介绍了基本的make命令,以及如何编写简单实用的Makefile文件,相信用户已经能够使用make来管理软件项目的创建和维护过程了。</font></td>
</tr>
</table>
<table width="574" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="574"><hr size="1"></td>
</tr>
</table>
<table width="577" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="740" class=c> </td>
</tr>
<tr>
<td height="30" align="right"> 【<a href=../comment.asp?action=list&Filename=20041116131107.htm target=_blank><font
color=#cc0000>查看评论</font></a>】【<font color="#999999"><a href="../vote.asp?Filename=20041116131107.htm"
target="_blank"><font color="#CC0000">投它一票</font></a></font>】
<script language=JavaScript>
<!-- Begin
if (window.print) {
document.write('【<a href="#" onClick="javascript:window.print()"><font color=cc0000>打印本文</font></a>】 ');
}
// End -->
</script>
【<a href="javascript:doZoom(16)"><font color=#cc0000>大</font></a> <a href="javascript:doZoom(14)"><font
color=#cc0000>中</font></a> <a href="javascript:doZoom(12)"><font color=#cc0000>小</font></a>】【<a
href="javascript:window.close()"><font color=#cc0000>关闭窗口</font></a>】</td>
</tr>
</table>
<table width="577" border="0" cellspacing="0" cellpadding="0">
<tr>
</tr>
</table>
<span class="style2"><strong>本站部分文章搜集于网络如有侵权请告知本站</strong></span>
<table width="577" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="733" bgcolor="#EEEEEE"><font color="#003366"> 相关新闻</font></td>
</tr>
</table>
<table width="572" height="12" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><script language=JavaScript
src="../about.asp?about=善用GNU Make做开发&title=善用GNU Make做开发"></script></td>
</tr>
</table>
<table width="76%" border="0" cellspacing="0" cellpadding="0">
<tr align="left" valign="top">
<td colspan="2" align="center"><form action="../comment.asp?action=add&Filename=20041116131107.htm" method="post" name="comment"
target="_blank">
<table width="560" border="0" align="left" cellpadding="0" cellspacing="1" bgcolor="#333333">
<tr bgcolor="#FFFFFF">
<td height="27" colspan="2" bgcolor="#CCCCCC"> <font color="#003366">发表评论: 姓名:
<input name="commenter" type="text" size="15">
email:</font>
<input name="email" type="text" size="15"></td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="537" height="91" bgcolor="#F0F3F7">
<textarea name="comment" cols="70" rows="5"></textarea>
</td>
<td width="20" align="center" valign="middle" bgcolor="#F0F3F7"></td>
</tr>
<tr bgcolor="#FFFFFF">
<td height="27" colspan="2" bgcolor="#F0F3F7"><div align="center">
<input type="submit" name="Submit" value="提交">
</div></td>
</tr>
</table>
</form></td>
</tr>
</table></td>
</tr>
</table></td>
</tr>
</table></td>
<td width="183" valign="top" bgcolor="#FFFFFF"><table width="100%" border="0">
<tr>
<td><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" width="100%">
<tr>
<td bgcolor="#FFFFFF" height="2"></td>
</tr><tr>
<td bgcolor="#FFFFFF" height="2"></td>
</tr>
<tr>
<td valign="bottom"><div align="center">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="148" height="400">
<param name="movie" value="../pic/005.swf">
<param name="quality" value="high">
<embed src="../ads/sw.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="148" height="400"></embed>
</object>
<center><br>
</div></td>
</tr>
<tr>
<td width="100%">
</td>
</tr>
</table></td>
</tr>
</table></td>
</tr>
</table>
<table width="762" height="20" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="762" height="20" background="../pic/lbg.gif"></td>
</tr>
</table>
<table width="762" height="148" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr>
<td height="148" align="center" valign="middle"><table width="632" height="118" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="632" height="28" align="center" valign="middle"> <a href="../tougao.asp">在线投稿</a>
| <a href="../aboutme.asp">关于我们</a> | <a href="../linkme.asp">合作联系</a> |
<a href="../copyright.asp">版权声明</a> | <a href="../ads.asp">广告服务</a> | <a href="../ceo.asp">管理团队</a>
| <a href="../map.asp">网站地图</a> |<a href="../login.asp">管理入口</a> | </td>
</tr>
<tr>
<td align="center" valign="middle" background="images/line.gif"></td>
</tr>
<tr>
<td align="center" valign="middle"><p>xxlinux版权所有 站长QQ:9334391 378871952<br>
建议使用:1024*768分辨率,16位以上颜色、<br>
Netscape6.0、IE5.0以上版本浏览器和中文大字符集<br>
<script>var tc_user="cuiwenzhe";var tc_class="2";</script>
<script src="http://stat.t2t2.com/stat.js"></script>
<script src="http://c.21dx.com/count/count.asp?view=xxlinux"></script>
<br>
</p>
</td>
</tr>
</table></td>
<td width="2"></td>
</tr>
</table>
</center>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -