📄 使用autotools进行项目管理 - mark zhong's blog.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0056)http://blog.csdn.net/zgzjw/archive/2004/06/26/27052.aspx -->
<HTML><HEAD><TITLE>mark zhong's blog</TITLE>
<META content="MSHTML 6.00.2900.2668" name=GENERATOR>
<META http-equiv=Content-Type content="text/html; charset=utf-8"><LINK media=all
href="使用autotools进行项目管理 - mark zhong's blog.files/style.css" type=text/css
rel=stylesheet><LINK media=print
href="使用autotools进行项目管理 - mark zhong's blog.files/print.css" type=text/css
rel=stylesheet><LINK title=RSS href="http://blog.csdn.net/zgzjw/rss.aspx"
type=application/rss+xml rel=alternate></HEAD>
<BODY>
<FORM language=javascript id=Form1 name=Form1
onsubmit="if (!ValidatorOnSubmit()) return false;" action=27052.aspx
method=post><INPUT type=hidden name=__VIEWSTATE>
<SCRIPT language=javascript
src="使用autotools进行项目管理 - mark zhong's blog.files/WebUIValidation.js"
type=text/javascript></SCRIPT>
<DIV class=pagelayout>
<DIV class=header>
<DIV><A class=headermaintitle id=Header1_HeaderTitle
href="http://blog.csdn.net/zgzjw/">mark zhong's blog</A> </DIV>
<DIV></DIV></DIV>
<DIV class=leftcolumn>
<H1 class=listtitle>导航</H1>
<UL class=list>
<LI class=listitem><A id=MyLinks1_HomeLink title=到聚合站点
href="http://blog.csdn.net/">CSDNBlog</A>
<LI class=listitem><A id=MyLinks1_PersonalHome title="访问 mark zhong's blog"
href="http://blog.csdn.net/zgzjw/">我的首页</A>
<LI class=listitem><A id=MyLinks1_ContactLink accessKey=9
href="http://blog.csdn.net/zgzjw/contact.aspx">联系作者</A>
<LI class=listitem><A id=MyLinks1_Syndication
href="http://blog.csdn.net/zgzjw/Rss.aspx">聚合</A><A id=MyLinks1_XMLLink
href="http://blog.csdn.net/zgzjw/Rss.aspx"><IMG alt=""
src="使用autotools进行项目管理 - mark zhong's blog.files/xml.gif" border=0></A>
<LI class=listitem><A id=MyLinks1_Admin
href="http://blog.csdn.net/zgzjw/login.aspx">登录</A> </LI></UL>
<DIV class=listtitle>Blog统计</DIV>
<UL class=list>
<LI class=listitem>文章 - 7
<LI class=listitem>收藏 - 0
<LI class=listitem>评论 - 11
<LI class=listitem>Trackbacks - 0 </LI></UL>
<H3 class=listtitle>文章</H3>
<UL class=list>
<LI class=listitem><A
href="http://blog.csdn.net/zgzjw/category/91190.aspx">linux</A><A
href="http://blog.csdn.net/zgzjw/category/91190.aspx/rss">(RSS)</A></LI></UL>
<H3 class=listtitle>收藏</H3>
<UL class=list></UL>
<H3 class=listtitle>相册</H3><!--category title-->
<UL class=list>
<LI class=listitem><A
href="http://blog.csdn.net/zgzjw/Gallery/17469.aspx">文章</A></LI></UL>
<H3 class=listtitle>存档</H3>
<UL class=list>
<LI><A href="http://blog.csdn.net/zgzjw/archive/2005/01.aspx">2005年01月(1)</A>
<LI><A href="http://blog.csdn.net/zgzjw/archive/2004/12.aspx">2004年12月(1)</A>
<LI><A href="http://blog.csdn.net/zgzjw/archive/2004/11.aspx">2004年11月(3)</A>
<LI><A href="http://blog.csdn.net/zgzjw/archive/2004/09.aspx">2004年09月(1)</A>
<LI><A
href="http://blog.csdn.net/zgzjw/archive/2004/06.aspx">2004年06月(1)</A></LI></UL>
<DIV class=spacer> </DIV></DIV>
<DIV class=centercolumn>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>
<DIV class=post>
<DIV class=postTitle><A
href="http://blog.csdn.net/zgzjw/archive/2004/06/26/27052.aspx">使用autotools进行项目管理</A>
<SCRIPT
language=javascript>document.title="使用autotools进行项目管理 - "+document.title</SCRIPT>
</DIV>
<DIV class=postText>
<TABLE cellSpacing=0 cellPadding=0 width=800 align=center border=0>
<TBODY>
<TR></TR>
<TR>
<TD colSpan=3>
<P align=left><FONT face="Verdana, Arial, Helvetica, sans-serif"><FONT
size=5>Mark Zhong's HomgPage</FONT><FONT size=2> </FONT></FONT></P>
<P align=left>?</P></TD></TR>
<TR>
<TD vAlign=top width=178>
<P class=teaser><A class=style2
href="http://www.free-think.org/mark/index.html">主页</A></P>
<P class=style2>
<P><SPAN class=teaser><SPAN class=style2>其它语言:</SPAN><BR></SPAN><A
href="http://www.free-think.org/mark/index.html">英语</A><SPAN
class=teaser><BR></SPAN></P>
<P class=teaser><SPAN class=style2>文章</SPAN>:<BR><A class=style2
href="http://www.free-think.org/mark/article/0001/article/0001.html">autotools的使用</A><BR><A
class=style2
href="http://www.free-think.org/mark/article/0001/article/index.html">...更多</A></P>
<P class=style2>
<P class=teaser><SPAN class=style2>书籍资源:</SPAN> <BR><A class=style2
href="http://www.free-think.org/mark/article/0001/book/autotools/index.html">AutoTools</A><BR><A
class=style2
href="http://www.free-think.org/mark/article/0001/book/index.html">...更多</A></P>
<P class=style2>
<P class=teaser><SPAN class=style2><A
href="mailto:mark@free-think.org">给我发EMAIL</A></SPAN></P>
<P>
<P class=teaser><SPAN><BR><BR></SPAN></P>
<P>?</P></TD>
<TD vAlign=top width=12>?</TD>
<TD vAlign=top width=450>
<TABLE class=slugTable cellSpacing=0 cellPadding=0 width="100%"
border=0><TBODY>
<TR>
<TD class=slugText> 使用autotools配置管理跨平台项目</TD>
<TD align=right>?</TD></TR></TBODY></TABLE><BR>
<P>一、简介 </P>
<P> 1.程序的跨平台<BR>???? 开发能够运行在多种不同平台上的软件是一项需要很多技巧和努力的工作。必须有多种平台的相关知识。 </P>
<P> 仅仅创建能够在多种不同的*NIX系统上运行的程序也要做大量的工作。首先,代码本身必须是可移植的,可移植代码很少对运行时的硬件以及可以使用的软件库等有所假设。
</P>
<P> 开发者必须对不同系统的编译和运行环境,甚至是硬件系统结构有足够多的了解。<A
href="http://www.gnu.org/">GNU/Linux</A>中普遍使用的GNU软件,虽然也存在于许多其他的操作系统和硬件平台,但是这不是操作系统必须的。此外也可能存在以下情况:</P>
<UL>
<LI>编译器可能不遵循ISO标准
<LI>函数库可能缺少关键的特性
<LI>操作系统的API可能有所不同
<LI>文件系统所做的约定有所不同 </LI></UL>
<P> 因此,在LINUX下的开发人员不得不编写一个通用的makefile,并且告诉用户如何编辑这个makefile文件以适应本机环境。
</P>
<P> 一般开源项目和GNU的项目的源代码都是通过configure命令生成Makefile来进行编译的。如果你想使你的
项目表现的更专业一点,想省去写Makefile的麻烦,如果你想管理好有一堆源代码的项目。那么这篇文章非常 适合你。 </P>
<P> 2.autotools的构成和历史<BR>
其实GNU/Autotools是由一组命令行工具构成,它们包括:Autoconf,Automake,Libtool等。它们最早只是
一组UNIX下的shell script。更详细的信息,可以访问<A
href="http://www.gnu.org/manual/manual.html">GNU Manual</A>。 </P>
<P> 3.它们是怎样工作的<BR> 下图是整个autotools的工作流程及架构图:<BR><IMG height=492 src=""
width=558></P>
<P>图中文字颜色为绿色的文件是Linux下的可执行文件。<BR>
以下详细的为大家介绍一下该流程。Makefile是最终文档,在发布源代码包时并不存在,一般是由使用者在自己的平台上生成。要完成该工作,首先要准备好configure.in,Makefile.am,
aclocal.m4,如有需要可准备好config.h.in。configure.in可以手动创建,也可以由autoscan命令生成的模板文件configure.scan重命名得到,autoscan只需在源代码树根目录下运行一次既可。aclocal.m4由aclocal程序生成。当准备好configure.in和aclocal.m4时既可运行autoconf以生成configure可执行文件。准备好Makefile.am文件后,既可运行automake生成Makefile.in文件,最后在编译以前运行一次configure,检查系统并生成Makefile。然后就是make,make
install了:),下面我们将以一个C++源程序为例做为这个流程的一个实践。</P>
<P>二、实战与分析</P>
<P>1.实战<BR>hello.cpp</P>
<TABLE width=470 bgColor=#999999>
<TBODY>
<TR>
<TD height=130>
<P>#include <IOSTREAM><BR>#include "config.h"<BR>using namespace
std;<BR><BR><BR>int main(void)<BR>{<BR> cout << "hello,world"
<<
endl;<BR>}</P></TD></TR></TBODY></TABLE><BR>运行autoscan,目录下将生成configure.scan:<BR>
<TABLE width="75%" border=0>
<TBODY>
<TR>
<TD borderColor=#0 bgColor=#999999>dnl Process this file with
autoconf to produce a configure script.
<P>AC_INIT(hello.cpp)<BR>AM_INIT_AUTOMAKE(hello, 1.0)</P>
<P>dnl Checks for programs.<BR>AC_PROG_CXX</P>
<P>dnl Checks for libraries.</P>
<P>dnl Checks for header files.</P>
<P>dnl Checks for typedefs, structures, and compiler
characteristics.</P>
<P>dnl Checks for library function</P>
<P>AC_OUTPUT(Makefile)</P></TD></TR></TBODY></TABLE><BR>其中AM_INIT_AUTOMAKE宏和最后一行的Makefile是手工增加的。
修改完成后把configure.scan重命名为configure.in。<BR><BR>运行aclocal当前目录下会生成aclocal.m4文件。aclocal必须在configure.in文件存在时运行。<BR><BR>运行autoheader当前目录下会生成config.h.in:<BR>
<TABLE borderColor=#ffffff width="75%" bgColor=#999999 border=0>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -