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

📄 使用autotools进行项目管理 - mark zhong's blog.htm

📁 有关Makefile生成的全攻略
💻 HTM
📖 第 1 页 / 共 2 页
字号:
        <TBODY>
        <TR>
          <TD height=157>/* config.h.in. Generated automatically from 
            configure.in by autoheader. */ 
            <P>/* Name of package */<BR>#undef PACKAGE</P>
            <P>/* Version number of package */<BR>#undef 
        VERSION</P></TD></TR></TBODY></TABLE><BR>现在要手工添加一个文件了Makefile.am:<BR>
      <TABLE width="75%" bgColor=#999999 border=0>
        <TBODY>
        <TR>
          <TD>AUTOMAKE_OPTIONS = foreign <BR>bin_PROGRMAS = 
            hello<BR>hello_SOURCES = hello.cpp</TD></TR></TBODY></TABLE><BR>运行automake 
      -add-missing,目录下会生成Makefile.in。<BR>运行autoconf, 
      目录下会生成configure脚本。<BR>所有工作现在就已经做完了。试试运行一下:<BR>./configure<BR>make<BR>make 
      install<BR>是不是非常专业,非常酷? <BR><BR><BR>2.分析<BR><BR>2.1 
      分析configu.in<BR><BR>在上面的实战中我们修改了configure.in(这个文件能完成我们大部分跨平台的设置和检查,也可以定制编译及链接时的行为)和手工创建了Makefile.am。<BR><BR>configure.in文件必须在开始所有工作之前调用AC_INIT宏,并且在结束所有工作后调用AC_OUTPUT宏。而事实上,也只有这两个宏是configure.in文件所必须的。AC_INIT语法如下:<BR>        <SPAN 
      class=style5>AC_INIT(unique_file_in_source_dir)</SPAN><BR>unique_file_in_source_dir是在源代码目录下的一个文件,对AC_INIT的调用在所产生的配置脚本文件中生成一条shell命令,通过检查unique_file_source_dir是否存在来验证当前目录是否正确。<BR><BR>AC_OUTPUT创建名为Makefile或其它名字的输出文件,其语法如下:<BR>        <SPAN 
      class=style5>AC_OUTPUT([file...[, extra_cmds[, init_cmds]]]) 
      </SPAN><BR>其中file是用空格分隔的输出文件列表,通过复制file.in到file来生成这些文件。extra_cmds是一个命令列表,附加在config.status之后,在重新生成配置脚本时会用到它,init_cmds也将插入到config.status中,但其位置在extra_cmds之前。<BR>configure.in文件的结构大致如下:<BR>
      <TABLE width=200 bgColor=#999999 border=0>
        <TBODY>
        <TR>
          <TD>AC_INIT<BR>  测试程序<BR>  测试函数库<BR>  测试头文件<BR>  测试类型定义<BR>  
            测试结构<BR>  测试编译器行为<BR>  测试库函数<BR>  
      测试系统调用<BR>AC_OUTPUT</TD></TR></TBODY></TABLE><BR>以上顺序并不是必须的。例如函数库的存在与否直接影响到是否包含相应的头文件,所以对头文件的检查要放在检查完函数库之后。在configure.in文件中,通常每一个宏调用应该占据单独的一行,这是因为多数autoconf宏都需要一个新行来结束命令。在使用宏读取或设置环境变量时,可以把这些变量当作一个宏而放在同一行上。<BR><BR>一个多参数的宏调用可以超过每宏一行的规则。这时应该使用'\'来续行并且用m4所能识别的括号[]来括起所有参数,示例如下:<BR>  
       AC_CHECK_HEADERS([unistd.h termios.h termio.h sgtty.h \<BR>    
      sys/timer.h ]) <BR>   AC_CHECK_HEADERS(unistd.h termios.h termio.h sgtty.h 
      sys/<BR>   timer.h 
      )<BR>两种定义方式是等价的。第二个例子是把整个宏写在同一行内。<BR><BR>在configure.in的第一行是一句注释<BR>  <SPAN 
      class=style5>dnl Process this file with autoconf to produce a configure 
      script.</SPAN><BR>dnl是m4的注释符号。也可以使用#做为注释符号<BR><BR>2.2 
      分析Makefile.am<BR><BR>automake会把Makefile.am按configure.in中的定义生成Makefile.in。 
      <BR><SPAN 
      class=style5>AUTOMAKE_OPTIONS</SPAN><BR>  设置automake的选项。automake主要是帮助软件开发人员维护软件的配套文档,在执行automake时,会检查目录下是否存在标准软件文档中应具备的文件,例如:"NEWS"、"INSTALL"、"ChangeLog"等。设为foreign时,则不进行检查。<BR><SPAN 
      class=style5>bin_PROGRAMS</SPAN><BR>  定义你要生成的可执行文档名。如果要生成多个可执行文档,每个文档名用空格分隔。<BR><SPAN 
      class=style5>hello_SOURCES</SPAN><BR>   
      定义hello这个可执行文档的源程序和要依赖的头文件等相关文件。如果有多个可执行文档,则每个可执行文档都要有相对应的filename_SORUCES。<BR><BR>如果在你的目录树,源代码放在./src 
      / 
      子目录下,则使用SUBDIRS宏,来指定子目录,在子目录中要放一个通常的Makefile.am文件。<BR><BR>三、autotools使用进阶<BR>3.1 几个常用的autoconf宏<BR>AC_PROG_CC    
       <BR>  决定使用哪个C编译器,并设置输出变量CC<BR>AC_PROG_CXX   <BR>   
      决定使用哪个C++编译器,并设置输出变量CC<BR>AC_PROG_CC_C_O  <BR>   决定编译器是否接受-c或-o选项,如果不接受,定义 
        NO_MINUS_C_MINUS_O<BR>AC_CHECK_LIB(lib,function[,action_if_found[,action_if_no_found,[,other_libs]]])  
      <BR>   通过把一个C程序链接到函数库lib来判断在lib库中是否存在指定的函数。在测 <BR>   
      试成功时执行shell命令section_if_found或者在action_if_found为空时,在输<BR>   
      出变量LIB中添加-llib。action_if_not_found把other_libs选项传给link命令。<BR>  
       这个函数是测试宏中最常用的一个。<BR>AC_HEADER_STDC<BR>   如果系统支持ANSI/ISO 
      C头文件,定义STDC_HEADERS。<BR>AC_HEADER_SYS_WAIT<BR>  
       如果系统有POSIX兼容的头文件sys/wait.h,定义输出变量HAVE_SYS_WAIT<BR>AC_HEADER_DIRENT<BR>  
       顺序检查头dirent.h、sysdir/ndir.h、sys/dir.h和ndir.h中是否定义了DIR,并<BR>   
      根据结果定义HAVE_DIRENT_H、HAVE_SYS_NDIR_H、<BR>   
      HAVE_SYS_DIR_H、或HAVE_NDIR_H<BR>3.2 一个进阶的例子<BR>
      <P>四、更详细的autoconf的参考(部分宏的介绍) 五、参考 <BR>????</P><BR>
      <P align=right><A 
      href="http://www.free-think.org/mark/article/0001/items/index.html">...更多</A></P></TD></TR></TBODY></TABLE>
<P>
<HR>

<CENTER><A href="http://www.free-think.org/mark/article/0001/index.html">主页</A> 
| <A title="Visit Free Think Org" href="http://www.free-think.org/">Free Think 
Org </A>| <A href="http://udbi.free-think.org/">UDBI</A> | <A 
href="mailto:mark@free-think.org">联系我</A> | <A 
href="http://wsvf.free-think.org/">WJian HomePage</A><BR><FONT 
size=1>网页内容仅为个人意见</FONT><FONT size=1>.<BR>? 1999-2004 Mark Zhong 版权所有. 
保留所有权利</FONT><BR><BR></CENTER><BR><BR>本文引用通告地址: 
http://blog.csdn.net/zgzjw/services/trackbacks/27052.aspx <BR>[<A 
href="javascript:StorePage()">点击此处收藏本文</A>] </DIV>
<DIV class=postFoot>发表于 2004年06月26日 10:59 AM </DIV></DIV><LINK 
href="http://blog.csdn.net/zgzjw/Services/Pingback.aspx" rel=pingback><!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://blog.csdn.net/zgzjw/archive/2004/06/26/27052.aspx"
dc:identifier="http://blog.csdn.net/zgzjw/archive/2004/06/26/27052.aspx"
dc:title="使用autotools进行项目管理"
trackback:ping="http://blog.csdn.net/zgzjw/services/trackbacks/27052.aspx" />
</rdf:RDF>
-->
<SCRIPT language=JavaScript 
src="使用autotools进行项目管理 - mark zhong's blog.files/BlogJudgeShow.htm" 
type=text/javascript></SCRIPT>
<BR>
<DIV id=comments>
<H3></H3>
<DIV class=post>
<DIV class=postTitle><A href="http://www.jj-jj.cc/" 
target=_blank>尖锐湿疣</A>&nbsp;发表于<SPAN>2004-12-31 3:57 AM</SPAN>&nbsp;&nbsp;</DIV>
<DIV class=postText>Pretty cool! Thank you! <BR></DIV></DIV><BR></DIV>
<DIV class=moreinfo>
<TABLE class=comments id=CommentForm cellSpacing=1 cellPadding=1 border=0>
  <TBODY>
  <TR>
    <TD width=75></TD>
    <TD></TD>
    <TD></TD></TR>
  <TR>
    <TD width=75>大名</TD>
    <TD><INPUT id=PostComment.ascx_tbName style="WIDTH: 300px" size=40 
      name=PostComment.ascx:tbName></TD>
    <TD><SPAN id=PostComment.ascx_RequiredFieldValidator2 
      style="VISIBILITY: hidden; COLOR: red" initialvalue="" 
      evaluationfunction="RequiredFieldValidatorEvaluateIsValid" 
      errormessage="请输入名字" 
      controltovalidate="PostComment.ascx_tbName">请输入名字</SPAN></TD></TR>
  <TR>
    <TD>网址</TD>
    <TD><INPUT id=PostComment.ascx_tbUrl style="WIDTH: 300px" size=40 
      name=PostComment.ascx:tbUrl></TD>
    <TD></TD></TR>
  <TR>
    <TD>验证码</TD>
    <TD><INPUT id=PostComment.ascx_ValidationKey style="WIDTH: 150px" 
      name=PostComment.ascx:ValidationKey> <IMG 
      src="使用autotools进行项目管理 - mark zhong's blog.files/VKImage.htm" 
      align=absMiddle> </TD></TR>
  <TR>
    <TD colSpan=3>评论&nbsp; <SPAN id=PostComment.ascx_RequiredFieldValidator3 
      style="VISIBILITY: hidden; COLOR: red" initialvalue="" 
      evaluationfunction="RequiredFieldValidatorEvaluateIsValid" 
      errormessage="请输入评论" 
      controltovalidate="PostComment.ascx_tbComment">请输入评论</SPAN><BR><TEXTAREA id=PostComment.ascx_tbComment style="WIDTH: 400px; HEIGHT: 193px" name=PostComment.ascx:tbComment rows=10 cols=50></TEXTAREA></TD></TR>
  <TR>
    <TD colSpan=3><INPUT id=PostComment.ascx_chkRemember type=checkbox 
      name=PostComment.ascx:chkRemember><LABEL 
      for=PostComment.ascx_chkRemember>记住我</LABEL></TD></TR>
  <TR>
    <TD><INPUT language=javascript id=PostComment.ascx_btnSubmit onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " type=submit value=确定 name=PostComment.ascx:btnSubmit></TD>
    <TD colSpan=2><SPAN id=PostComment.ascx_Message 
    style="COLOR: red"></SPAN></TD></TR></TBODY></TABLE></DIV>
<DIV class=spacer>&nbsp;</DIV></DIV>
<DIV class=footer>Powered by: <BR><A id=Footer1_Hyperlink2 
href="http://scottwater.com/blog" name=Hyperlink1><IMG alt="" 
src="使用autotools进行项目管理 - mark zhong's blog.files/100x30_Logo.gif" border=0></A> 
<A id=Footer1_Hyperlink3 href="http://asp.net/" name=Hyperlink1><IMG alt="" 
src="使用autotools进行项目管理 - mark zhong's blog.files/PoweredByAsp.Net.gif" 
border=0></A> <BR>Copyright © zgzjw 
<P></P></DIV>
<SCRIPT language=javascript type=text/javascript>
<!--
	var Page_Validators =  new Array(document.all["PostComment.ascx_RequiredFieldValidator2"], document.all["PostComment.ascx_RequiredFieldValidator3"]);
		// -->
</SCRIPT>

<SCRIPT language=javascript type=text/javascript>
<!--
var Page_ValidationActive = false;
if (typeof(clientInformation) != "undefined" && clientInformation.appName.indexOf("Explorer") != -1) {
    if ((typeof(Page_ValidationVer) != "undefined") && (Page_ValidationVer == "125"))
        ValidatorOnLoad();
}

function ValidatorOnSubmit() {
    if (Page_ValidationActive) {
        return ValidatorCommonOnSubmit();
    }
    return true;
}
// -->
</SCRIPT>
</FORM></DIV></BODY></HTML>

⌨️ 快捷键说明

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