<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>Rong Cheng's Blog</title>
  <link>http://ronchen.blogbus.com</link>
  <description><![CDATA[喜欢梵高的向日葵， 
你看那燃烧的颜色，就像我燃烧着的生命 ]]></description>
  <generator> by blogbus.com </generator>
  <lastBuildDate>Sat, 02 Dec 2006 16:52:58 +0800</lastBuildDate>
  <image>
									<url>http://public.blogbus.com/images/head.gif</url>
									<title>Rong Cheng's Blog</title>
									<link>http://ronchen.blogbus.com</link>
								</image>  <item>
   <title>I/O重定向详解</title>
   <description><![CDATA[I/O重定向 详解及例子<br />a、I/O重定向通常与 FD有关，shell的FD通常为10个，即 0～9；<br />b、常用FD有3个，为0（stdin，标准输入）、1（stdout，标准输出）、2（stderr，标准错误输出），默认与keyboard、monitor、monitor有关；<br />c、用 < 来改变读进的数据信道(stdin)，使之从指定的档案读进；<br />d、用 > 来改变送出的数据信道(stdout, stderr)，使之输出到指定的档案；<br />e、0 是 < 的默认值，因此 < 与 0<是一样的；同理，> 与 1> 是一样的；<br />............<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://ronchen.blogbus.com/logs/3621604.html">使用AutoMake轻松生成Makefile[zz]</a> 2006-10-19</div><div><a href="http://ronchen.blogbus.com/logs/3955160.html">Big-endia与Little-endian</a> 2006-12-02</div><div><a href="http://ronchen.blogbus.com/logs/2258869.html">主流 Blog 程序</a> 2006-04-13</div><div><a href="http://ronchen.blogbus.com/logs/1729467.html">移动Ad Hoc网络下变比特率流媒体码率整形策略研究</a> 2005-12-20</div><div><a href="http://ronchen.blogbus.com/logs/1522508.html">The Third International Symposium on Neural Networks (ISNN 2006)</a> 2005-10-21</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://del.icio.us/post?v=4&noui&jump=close&url=http%3A%2F%2Fronchen.blogbus.com%2Flogs%2F3956026.html&title=I%2FO%E9%87%8D%E5%AE%9A%E5%90%91%E8%AF%A6%E8%A7%A3">Del.icio.us</a></span></div><br><br><div class="sysmsg"><b><a href="http://www.gov.cn/zwgk/2008-05/18/content_981560.htm">深切哀悼四川汶川大地震遇难同胞</a></b><br><br></div>]]></description>
   <link>http://ronchen.blogbus.com/logs/3956026.html</link>
   <author>Ronnie</author>
   <pubDate>Sat, 02 Dec 2006 16:45:57 +0800</pubDate>
  </item>
  <item>
   <title>Big-endia与Little-endian</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 谈到字节排序的问题，必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据，而x86系列则采用little endian方式存储数据。ARM同时支持 big和little，实际应用中通常使用little endian。那么究竟什么是big endian，什么又是little endian呢？......</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://ronchen.blogbus.com/logs/3621649.html">优化C代码常用的几招</a> 2006-10-19</div><div><a href="http://ronchen.blogbus.com/logs/3954891.html">深层揭密extern</a> 2006-12-02</div><div><a href="http://ronchen.blogbus.com/logs/3956026.html">I/O重定向详解</a> 2006-12-02</div><div><a href="http://ronchen.blogbus.com/logs/2256563.html">谈谈手机软件(zz)</a> 2006-04-13</div><div><a href="http://ronchen.blogbus.com/logs/2180264.html">2005年10大偏执狂技术[zz]</a> 2006-04-02</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://del.icio.us/post?v=4&noui&jump=close&url=http%3A%2F%2Fronchen.blogbus.com%2Flogs%2F3955160.html&title=Big-endia%E4%B8%8ELittle-endian">Del.icio.us</a></span></div><br><br><div class="sysmsg"><b><a href="http://www.gov.cn/zwgk/2008-05/18/content_981560.htm">深切哀悼四川汶川大地震遇难同胞</a></b><br><br></div>]]></description>
   <link>http://ronchen.blogbus.com/logs/3955160.html</link>
   <author>Ronnie</author>
   <pubDate>Sat, 02 Dec 2006 16:04:31 +0800</pubDate>
  </item>
  <item>
   <title>深层揭密extern</title>
   <description><![CDATA[　C++语言的创建初衷是&ldquo;a better C&rdquo;，但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言，C++保留了一部分过程式语言的特点（被世人称为&ldquo;不彻底地面向对象&rdquo;），因而它可以定义不属于任何类的全局变量和函数。但是，C++毕竟是一种面向对象的程序设计语言，为了支持函数的重载，C++对全局函数的处理方式与C有明显的不同。......<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://ronchen.blogbus.com/logs/3955160.html">Big-endia与Little-endian</a> 2006-12-02</div><div><a href="http://ronchen.blogbus.com/logs/3621649.html">优化C代码常用的几招</a> 2006-10-19</div><div><a href="http://ronchen.blogbus.com/logs/2780170.html">C++中的虚函数(virtual function)</a> 2006-07-06</div><div><a href="http://ronchen.blogbus.com/logs/3479175.html">如何从ITU网站上下载算法标准文档和源代码</a> 2006-10-04</div><div><a href="http://ronchen.blogbus.com/logs/2694817.html">最近太忙</a> 2006-06-23</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://del.icio.us/post?v=4&noui&jump=close&url=http%3A%2F%2Fronchen.blogbus.com%2Flogs%2F3954891.html&title=%E6%B7%B1%E5%B1%82%E6%8F%AD%E5%AF%86extern">Del.icio.us</a></span></div><br><br><div class="sysmsg"><b><a href="http://www.gov.cn/zwgk/2008-05/18/content_981560.htm">深切哀悼四川汶川大地震遇难同胞</a></b><br><br></div>]]></description>
   <link>http://ronchen.blogbus.com/logs/3954891.html</link>
   <author>Ronnie</author>
   <pubDate>Sat, 02 Dec 2006 15:01:05 +0800</pubDate>
  </item>
  <item>
   <title>明天笔试微软，bless自己</title>
   <description><![CDATA[<p>         近段找工作，一而再再而三的接受笔试和鄙视，还有不确定的漫长的等待，几乎精疲力竭。</p><p>        明天笔试微软，曾最梦想去的公司，虽然没有时间准备，但是依然bless自己，早日告别这样的生活!</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://ronchen.blogbus.com/logs/2694817.html">最近太忙</a> 2006-06-23</div><div><a href="http://ronchen.blogbus.com/logs/2106678.html">浙大高分子物理郑强教授的激情演讲</a> 2006-03-21</div><div><a href="http://ronchen.blogbus.com/logs/2063601.html">Happy Birthday</a> 2006-03-14</div><div><a href="http://ronchen.blogbus.com/logs/1729467.html">移动Ad Hoc网络下变比特率流媒体码率整形策略研究</a> 2005-12-20</div><div><a href="http://ronchen.blogbus.com/logs/1712579.html">网络测试</a> 2005-12-16</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://del.icio.us/post?v=4&noui&jump=close&url=http%3A%2F%2Fronchen.blogbus.com%2Flogs%2F3803792.html&title=%E6%98%8E%E5%A4%A9%E7%AC%94%E8%AF%95%E5%BE%AE%E8%BD%AF%EF%BC%8Cbless%E8%87%AA%E5%B7%B1">Del.icio.us</a></span></div><br><br><div class="sysmsg"><b><a href="http://www.gov.cn/zwgk/2008-05/18/content_981560.htm">深切哀悼四川汶川大地震遇难同胞</a></b><br><br></div>]]></description>
   <link>http://ronchen.blogbus.com/logs/3803792.html</link>
   <author>Ronnie</author>
   <pubDate>Fri, 10 Nov 2006 20:46:16 +0800</pubDate>
  </item>
  <item>
   <title>优化C代码常用的几招</title>
   <description><![CDATA[在性能优化方面永远注意80-20原则，即20%的程序消耗了80%的运行时间，因而我们要改进效率，最主要是考虑改进那20%的代码。不要优化程序中开销不大的那80%，这是劳而无功的。<br /><br /><font size="4"><strong>第一招：以空间换时间</strong></font><br /><br />计算机程序中最大的矛盾是空间和时间的矛盾，那么，从这个角度出发逆向思维来考虑程序的效率问题，我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值：<br /><br />方法A：通常的办法<br /><br />#define LEN 32<br />char string1 [LEN];<br />memset (string1,0,LEN);<br />strcpy (string1,&quot;This is a example!!&quot;）;<br /><br />方法B：<br /><br />const char string2[LEN] =&quot;This is a example!&quot;;<br />char * cp;<br />cp = string2 ;<br /><br />使用的时候可以直接用指针来操作。<br /><br />从上面的例子可以看出，A和B的效率是不能比的。在同样的存储空间下，B直接使用指针就可以操作了，而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候，A具有更好的灵活性；如果采用方法B，则需要预存许多字符串，虽然占用了大量的内存，但是获得了程序执行的高效率。<br /><br />如果系统的实时性要求很高，内存还有一些，那我推荐你使用该招数。<br /><br /><font size="4"><strong>第二招： 使用宏而不是函数。</strong></font><br /><br />    这也是第一招的变招。函数和宏的区别就在于，宏占用了大量的空间，而函数占用了时间。大家要知道的是，函数调用是要使用系统的栈来保存数据的，如果编译器里有栈检查选 项，一般在函数的头会嵌入一些汇编语句对当前栈进行检查；同时，CPU也要在函数调用时保存和恢复当前的现场，进行压栈和弹栈操作，所以，函数调用需要一 些CPU时间。 而宏不存在这个问题。宏仅仅作为预先写好的代码嵌入到当前程序，不会产生函数调用，所以仅仅是占用了空间，在频繁调用同一个宏的时候，该现象尤其突出。<br /><br />举例如下：<br /><br />方法C：<br /><br />#define bwMCDR2_ADDRESS 4<br />#define bsMCDR2_ADDRESS 17<br />int BIT_MASK(int __bf) <br />{<br />　return ((1U &lt;&lt; (bw ## __bf)) - 1)&lt;&lt; (bs ## __bf);<br />}<br />void SET_BITS(int __dst, <br />int __bf, int __val)<br />{<br />　__dst = ((__dst) &amp; ~(BIT_MASK(__bf))) |<br />\<br />　(((__val) &lt;&lt; (bs ## __bf)) <br />&amp; (BIT_MASK(__bf))))<br />}<br />SET_BITS(MCDR2, MCDR2_ADDRESS,ReGISterNumber);<br /><br />方法D：<br /><br />#define bwMCDR2_ADDRESS 4<br />#define bsMCDR2_ADDRESS 17<br />#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)<br />#define BIT_MASK(__bf) <br />(((1U &lt;&lt; (bw ## __bf)) - 1)<br />&lt;&lt; (bs ## __bf))<br />#define SET_BITS(__dst, __bf, __val)<br />\<br />((__dst) = ((__dst) &amp; ~(BIT_MASK(__bf)))<br />| \<br />(((__val) &lt;&lt; (bs ## __bf))<br />&amp; (BIT_MASK(__bf))))<br />SET_BITS(MCDR2, MCDR2_ADDRESS,<br />RegisterNumber);<br /><br />D方法是我看到的最好的置位操作函数，是ARM公司源码的一部分，在短短的三行内实现了很多功能，几乎涵盖了所有的位操作功能。C方法是其变体，其中滋味还需大家仔细体会。<br /><br /><font size="4"><strong>第三招：数学方法解决问题</strong></font><br /><br />现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题。数学是计算机之母，没有数学的依据和基础，就没有计算机的发展，所以在编写程序的时候，采用一些数学方法会对程序的执行效率有数量级的提高。举例如下，求 1~100的和。<br /><br />方法E：<br /><br />int I , j;<br />for (I = 1 ;I&lt;=100; I ++）<br />{<br />　j += I;<br />}<br /><br />方法F<br /><br />int I;<br />I = (100 * (1+100)) / 2<br /><br />这个例子是我印象最深的一个数学用例，是我的计算机启蒙老师考我的。当时我只有小学三年级，可惜我当时不知道用公式 N×（N+1）/ 2 来解决这个问题。方法E循环了100次才解决问题，也就是说最少用了100个赋值，100个判断，200个加法（I和j）；而方法F仅仅用了1个加法，1 次乘法，1次除法。效果自然不言而喻。所以，现在我在编程序的时候，更多的是动脑筋找规律，最大限度地发挥数学的威力来提高程序运行的效率。<br /><br /><font size="4"><strong>第四招：使用位操作<br /></strong></font><br />    使用位操作。减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位，理论上可以用&quot;位运算&quot;来完成所有的运算和操作。一般的位操作是用来控制硬件的，或者做数据变换使用，但是，灵活的位操作可以有效地提高程序运行的效率。举例如下：<br /><br />方法G<br /><br />int I,J;<br />I = 257 /8;<br />J = 456 % 32;<br /><br />方法H<br /><br />int I,J;<br />I = 257 &gt;&gt;3;<br />J = 456 - (456 &gt;&gt; 4 &lt;&lt; 4);<br /><br />在字面上好像H比G麻烦了好多，但是，仔细查看产生的汇编代码就会明白，方法G调用了基本的取模函数和除法函数，既有函数调用，还有很多汇编代码和寄存器参与运算；而方法H则仅仅是几句相关的汇编，代码更简洁，效率更高。当然，由于编译器的不同，可能效率的差距不大，但是，以我目前遇到的MS C ,ARM C 来看，效率的差距还是不小。<br /><br />        对于以2的指数次方为&quot;*&quot;、&quot;/&quot;或&quot;%&quot;因子的数学运算，转化为移位运算&quot;&lt;&lt; &gt;&gt;&quot;通常可以提高算法效率。因为乘除运算指令周期通常比移位运算大。<br /><br />　　C语言位运算除了可以提高运算效率外，在嵌入式系统的编程中，它的另一个最典型的应用，而且十分广泛地正在被使用着的是位间的与（&amp;）、或（|）、非（~）操作，这跟嵌入式系统的编程特点有很大关系。我们通常要对硬件寄存器进行位设置，譬如，我们通过将AM186ER型80186处理器的中断屏蔽控制寄存器的第低6位设置为0（开中断2），最通用的做法是：<br /><br /><br />#define INT_I2_MASK 0x0040 <br />wTemp = inword(INT_MASK);<br />outword(INT_MASK, wTemp &amp;~INT_I2_MASK);    <br /><br />　　而将该位设置为1的做法是：<br /><br /><br />#define INT_I2_MASK 0x0040 <br />wTemp = inword(INT_MASK);<br />outword(INT_MASK, wTemp | INT_I2_MASK);    <br /><br />　　判断该位是否为1的做法是：<br /><br /><br />#define INT_I2_MASK 0x0040 <br />wTemp = inword(INT_MASK);<br />if(wTemp &amp; INT_I2_MASK)<br />{<br />… /* 该位为1 */<br />}    <br /><br />运用这招需要注意的是，因为CPU的不同而产生的问题。比如说，在PC上用这招编写的程序，并在PC上调试通过，在移植到一个16位机平台上的时候，可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。<br /><br />　　<br /><font size="4"><strong>第五招：汇编嵌入</strong></font><br /><br />        在熟悉汇编语言的人眼里，C语言编写的程序都是垃圾&quot;。这种说法虽然偏激了一些，但是却有它的道理。汇编语言是效率最高的计算机语言，但是，不可能靠着它来写一个操作系统吧?所以，为了获得程序的高效率，我们只好采用变通的方法--嵌入汇编，混合编程。嵌入式C程序中主要使用在线汇编，即在C程序中直接插入_asm{ }内嵌汇编语句。<br />举例如下，将数组一赋值给数组二,要求每一字节都相符。<br />char string1[1024],string2[1024];<br /><br />方法I<br /><br />int I;<br />for (I =0 ;I&lt;1024;I++)<br />　*(string2 + I) = *(string1 + I)<br /><br />方法J<br /><br />#ifdef _PC_<br />int I;<br />for (I =0 ;I&lt;1024;I++)<br />*(string2 + I) = *(string1 + I);<br />#else<br />#ifdef _ARM_<br />__asm<br />{ <br />　MOV R0,string1<br />　MOV R1,string2<br />　MOV R2,#0<br />loop:<br />　LDMIA R0!, [R3-R11]<br />　STMIA R1!, [R3-R11]<br />　ADD R2,R2,#8<br />　CMP R2, #400<br />　BNE loop<br />}<br />#endif<br /><br />再举个例子：<br /><br />/* 把两个输入参数的值相加，结果存放到另外一个全局变量中 */<br />int result; <br />void Add(long a, long *b) <br />{ <br />　_asm <br />　{ <br />　　MOV AX, a <br />　　MOV BX, b <br />　　ADD AX, [BX]<br />　　MOV result, AX<br />　} <br />}<br /><br />方法I是最常见的方法，使用了1024次循环；方法J则根据平台不同做了区分，在ARM平台下，用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说，为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节，这样的话，标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU，熟练使用相应的嵌入汇编，可以大大提高程序执行的效率。<br /><br />虽然是必杀技，但是如果轻易使用会付出惨重的代价。这是因为，使用了嵌入汇编，便限制了程序的可移植性，使程序在不同平台移植的过程中，卧虎藏龙，险象环生！同时该招数也与现代软件工程的思想相违背，只有在迫不得已的情况下才可以采用。<br /><font size="5"><br /></font><font size="4"><strong>第六招， 使用寄存器变量</strong></font><br />    当对一个变量频繁被读写时，需要反复访问内存，从而花费大量的存取时间。为此，C语言提供了一种变量，即寄存器变量。这种变量存放在CPU的寄存器中，使用时，不需要访问内存，而直接从寄存器中读写，从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量，而循环计数是应用寄存器变量的最好候选者。<br /><br />　　(1) 只有局部自动变量和形参才可以定义为寄存器变量。因为寄存器变量属于动态存储方式，凡需要采用静态存储方式的量都不能定义为寄存器变量，包括：模块间全局变量、模块内全局变量、局部static变量；<br /><br />　　(2) register是一个&quot;建议&quot;型关键字，意指程序建议该变量放在寄存器中，但最终该变量可能因为条件不满足并未成为寄存器变量，而是被放在了存储器中，但编译器中并不报错（在C++语言中有另一个&quot;建议&quot;型关键字：inline）。<br /><br />　　下面是一个采用寄存器变量的例子：<br /><br />/* 求1+2+3+….+n的值 */<br /><div style="TEXT-ALIGN: left">WORD Addition(BYTE n)<br />{<br />　register i,s=0;<br />　for(i=1;i&lt;=n;i++)<br />　{<br />　　s=s+i;<br />　}<br />　return s;<br />}    <br /></div><br />　　本程序循环n次，i和s都被频繁使用，因此可定义为寄存器变量。<br /><br /><font size="4"><strong>第七招： 利用硬件特性</strong></font><br /><br />　　首先要明白CPU对各种存储器的访问速度，基本上是：<br /><br />CPU内部RAM　&gt;　外部同步RAM　&gt;　外部异步RAM　&gt;　FLASH/ROM<br /><br />　　对于程序代码，已经被烧录在FLASH或ROM中，我们可以让CPU直接从其中读取代码执行，但通常这不是一个好办法，我们最好在系统启动后将FLASH或ROM中的目标代码拷贝入RAM中后再执行以提高取指令速度；<br /><br />　　对于UART等设备，其内部有一定容量的接收BUFFER，我们应尽量在BUFFER被占满后再向CPU提出中断。例如计算机终端在向目标机通过RS-232传递数据时，不宜设置UART只接收到一个BYTE就向CPU提中断，从而无谓浪费中断处理时间；<br /><br />　　如果对某设备能采取DMA方式读取，就采用DMA读取，DMA读取方式在读取目标中包含的存储信息较大时效率较高，其数据传输的基本单位是块，而所传输的数据是从设备直接送入内存的（或者相反）。DMA方式较之中断驱动方式，减少了CPU 对外设的干预，进一步提高了CPU与外设的并行操作程度。<br /><br />参考文献：<br />   http://purec.binghua.com/viewthread.php?tid=1318&amp;extra=page%3D1<br />  http://www.51c51.net/article/show.asp?id=560<br /><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://ronchen.blogbus.com/logs/3955160.html">Big-endia与Little-endian</a> 2006-12-02</div><div><a href="http://ronchen.blogbus.com/logs/3954891.html">深层揭密extern</a> 2006-12-02</div><div><a href="http://ronchen.blogbus.com/logs/1612236.html">Shanghai</a> 2005-11-19</div><div><a href="http://ronchen.blogbus.com/logs/1495330.html">今天接到了中兴的电话面试</a> 2005-10-09</div><div><a href="http://ronchen.blogbus.com/logs/1484102.html">音频AGC 16 bit 定点实现已经完成</a> 2005-10-04</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://del.icio.us/post?v=4&noui&jump=close&url=http%3A%2F%2Fronchen.blogbus.com%2Flogs%2F3621649.html&title=%E4%BC%98%E5%8C%96C%E4%BB%A3%E7%A0%81%E5%B8%B8%E7%94%A8%E7%9A%84%E5%87%A0%E6%8B%9B">Del.icio.us</a></span></div><br><br><div class="sysmsg"><b><a href="http://www.gov.cn/zwgk/2008-05/18/content_981560.htm">深切哀悼四川汶川大地震遇难同胞</a></b><br><br></div>]]></description>
   <link>http://ronchen.blogbus.com/logs/3621649.html</link>
   <author>Ronnie</author>
   <pubDate>Thu, 19 Oct 2006 20:31:53 +0800</pubDate>
  </item>
  <item>
   <title>使用AutoMake轻松生成Makefile[zz]</title>
   <description><![CDATA[<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14><B></B></TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>在 Unix 上写过程序的人一般都遇到过 Makefile，尤其是用 C 来开发程序的人。用 make 来开发和编译程序的确很方便，可是要写出一个MakeFile就不那么简单了。偏偏介紹 Makefile 的文件不多，GNU Make 那份印出来要几百页的文件，光看完 Overview 自己就快要先Over了，难怪许多人闻 Unix色变。本文将介绍如何利用 GNU Autoconf 及 Automake 这两套软件来帮助『自动』产生 Makefile 文件，并且让开发出来的的软件可以象 Apache, MySQL 和常見的 GNU 软件一样，只要会 ``./configure'', ``make'', ``make install'' 就可以把程序安裝到系统中。如果您有心开发 Open Source 的软件，或只是想在 Unix 系統下写写程序。希望这份介绍文件能帮助您轻松的进入 Unix Programming 的殿堂。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14><B>1. 简介</B> </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>Makefile 基本上就是『目标』(target), 『关联』(dependencies) 和『动作』三者所组成的一系列规则。而 make 就会根据 Makefile 的规则来決定如何编译 (compile) 和连接 (link) 程式。实际上，make 可做的不只是编译和连接程序，例如 FreeBSD 的 port collection 中，Makefile还可以做到自动下载远程程序，解压缩 (extract) ， 打补丁 (patch)，设定，然后编译，安装到系统中。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>Makefile 基本结构虽然很简单，但是妥善运用这些规则就可以变换出许多不同的花样。却也因为这样，许多刚刚开始学习写Makefile 时会觉得没有规范可以遵循，每个人写出来的Makefile都不大一样，不知道从哪里下手，而且常常会受到自己的开发环境的限制，只要环境参数不同或者路径更改，可能 Makefile 就得跟着修改修改。虽然有 GNU Makefile Conventions (GNU Makefile惯例例)订出一些使用 GNU 程式设计时撰写 Makefile 的一些标准和规范，但是内容很长而且很复杂，并且经常作一些调整，为了减轻程序开发人员维护Makefile 的负担，因此出现了Automake。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>程序设计者只需要写一些预先定义好的宏 (macro)，提交给Automake处理后会产生一个可以供 Autoconf 使用的 Makefile.in文件。再配合利用 Autoconf产生的自动培植设置文件 configure 即可产生一份符合符合 GNU Makefile 惯例的 Makeifle 了。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14><B>2. 上路之前</B> </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>在开始使用 Automake 之前，首先确认你的系统安装有如下软件：</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>　 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>1. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>GNU Automake </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>2. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>GNU Autoconf </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>3. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>GNU m4 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>4. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>perl </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>5. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>GNU Libtool (如果你需要产生 shared library) </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>建议最好也使用 GNU C/C++ 编译器 、GNU Make 以及其它 GNU 的工具程序来作为开发的环境，这些工具都是属于 Open Source Software 不但免费而且功能强大。如果你是使用 Red Hat Linux 可以找到所有上述软件的 rpm 文件，FreeBSD 也有现成的 package 可以直接安装，或也可以自行下载这些软件的源代码回来安装。下面的示例是在Red Hat Linux 5.2 + CLE2 的环境下所完成的。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14><B>3. 一个简单的例子</B> </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>Automake 所产生的 Makefile 除了可以做到程式的编译和连接，也已经把如何产生程序文件 (如 manual page, info 文件及 dvi 文件) 的动作，还有把源码文件包装起来以供发布都考虑进去了，所以程序源代码所存放的目录结构最好符合GNU 的标准惯例，接下来就用一个hello.c 來做为例子。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>在工作目录下建立一个新的子目录"devel"'，再在 devel 下建立一个"hello"' 的子目录，这个目录将作为存放 hello这个程序及其相关文件的地方： </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% mkdir devel</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% cd devel</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% mkdir hello </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% cd hello </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>用编辑器写一个hello.c文件， </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>#include <STDIO.H /></TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>int main(int argc, char** argv) { </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>printf(``Hello, GNU!\n''); </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>return 0; </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>} </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>接下来就要用 Autoconf 及 Automake 來产生 Makefile 文件了， </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>1. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>用 autoscan 产生一个 configure.in 的原型，执行autoscan 后会产生一个configure.scan 的文件，可以用它作为 configure.in文件的蓝本。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>　 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% autoscan </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% ls </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>configure.scan hello.c </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>2. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>编辑 configure.scan文件，如下所示，並且改名为configure.in </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>dnl Process this file with autoconf to produce a configure script. AC_INIT(hello.c) AM_INIT_AUTOMAKE(hello, 1.0) </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>dnl Checks for programs. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>AC_PROG_CC </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>dnl Checks for libraries. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>dnl Checks for header files. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>dnl Checks for typedefs, structures, and compiler characteristics. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>dnl Checks for library functions. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>AC_OUTPUT(Makefile) </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>3. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>执行 aclocal 和 autoconf ，分別会产生 aclocal.m4 及 configure 两个文件 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% aclocal </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% autoconf </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% ls </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>aclocal.m4 configure configure.in hello.c </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>4. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>编辑 Makefile.am 文件，內容如下 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>AUTOMAKE_OPTIONS= foreign </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>bin_PROGRAMS= hello </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>hello_SOURCES= hello.c </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>5. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>执行 automake --add-missing ，Automake 会根据Makefile.am 文件产生一些文件，包含最重要的 Makefile.in </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% automake --add-missing automake: configure.in: installing `./install-sh' automake: configure.in: installing `./mkinstalldirs' automake: configure.in: installing `./missing' </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>6. </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>最后执行 ./configure ， </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% ./configure creating cache ./config.cache checking for a BSD compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking whether make sets ${MAKE}... yes checking for working aclocal... found checking for working autoconf... found checking for working automake... found checking for working autoheader... found checking for working makeinfo... found checking for gcc... gcc checking whether the C compiler (gcc ) works... yes checking whether the C compiler (gcc ) is a cross-compiler... no checking whether we are using GNU C... yes checking whether gcc accepts -g... yes updating cache ./config.cache creating ./config.status creating Makefile </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>現在你的目录下已经产生了一个 Makefile 檔，下個 ``make'' 指令就可以開始編譯 hello.c 成執行檔，執行 ./hello 和 GNU 打聲招呼吧！ </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>% make gcc -DPACKAGE=\"hello\" -DVERSION=\"1.0\" -I. -I. -g -O2 -c hello.c gcc -g -O2 -o hello hello.o % ./hello Hello! GNU! </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>你還可以試試 ``make clean''，''make install''，''make dist'' 看看會有什麼結果。你也可以把產生出來的 Makefile 秀給你的老闆，讓他從此對你刮目相看 :-) </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14><B>4. 追根问底</B> </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>上述产生Makefile 的过程和以往自行编写的方式非常不一樣，舍弃传统自定义make 的规则，使用 Automake 只需用到一些已经定义好的宏就可以了。我们把宏及目标 (target)写在Makefile.am 文件内，Automake 读入 Makefile.am 文件后会把这一串已经定义好的宏展开并产生相对应的 Makefile.in 文件，然后再由 configure这个 shell script 根据 Makefile.in 产生合适的Makefile。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #666666; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><IMG height=315 src="http://www.ccw.com.cn/htm/app/linux/develop/01_7_214.gif" width=466 v:shapes="_x0000_i1025"></SPAN><FONT face="宋体, MS Song" size=2>&nbsp;</FONT></P></TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center>利用 autoconf 及 automake产生Makefile 的流程</P></TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>上图表示在上一范例中要使用的文件档案及产生出来的文件，有星号 (*) 者代表可执行文件。在此示例中可由 Autoconf 及 Automake 工具所产生的额外文件有 configure.scan、aclocal.m4、configure、Makefile.in，需要自行加入设置的有configure.in 及 Makefile.am。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>4.1 编辑 configure.in 文件 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>Autoconf 是用来产生 'configure'文件的工具。'configure' 是一个 shell script，它可以自动设定原始程序以符合各种不同平台上Unix 系统的特性，并且根据系统参数及环境产生合适的Makefile文件或C 的头文件(header file)，让原始程式可以很方便地在不同的平台上进行编译。Autoconf会读取 configure.in 文件然后产生'configure' 这个 shell script。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>configure.in 文件内容是一系列GNU m4 的宏，这些宏经autoconf处理后会变成检查系统特性的shell scripts。 configure.in 内宏的顺序并没有特别的规定，但是每一个configure.in 文件必須在所有宏前加入 AC_INIT 宏，然后在所有宏的最后加上 AC_OUTPUT宏。可先用 autoscan 扫描原始文件以产生一个 configure.scan 文件，再对 configure.scan 做些修改成 configure.in 文件。在范例中所用到的宏如下： </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>dnl </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>这个宏后面的字不会被处理，可以视为注释 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>AC_INIT(FILE) </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>该宏用来检查源代码所在路径，autoscan 会自动产生，一般无须修改它。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>AM_INIT_AUTOMAKE(PACKAGE,VERSION) </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>这个是使用 Automake 所必备的宏，PACKAGE 是所要产生软件套件的名称，VERSION 是版本编号。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>AC_PROG_CC </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>检查系统可用的C编译器，若源代码是用C写的就需要这个宏。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>AC_OUTPUT(FILE) </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>设置 configure 所要产生的文件，若是Makefile ，configure 便会把它检查出来的结果带入 Makefile.in 文件后产生合适的 Makefile。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>实际上，这里使用 Automake 时，还需要一些其他的宏，这些额外的宏我们用 aclocal来帮助产生。執行 aclocal会产生aclocal.m4 文件，如果无特别的用途，可以不需要修改它，用 aclocal 所产生的宏会告诉 Automake如何动作。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>有了 configure.in 及 aclocal.m4两个文件以后，便可以执行 autoconf来产生 configure 文件了。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>4.2 编辑Makefile.am 文件 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>接下来要编辑Makefile.am 文件，Automake 会根据 configure.in 中的宏把Makefile.am 转成 Makefile.in 文件。 Makefile.am 文件定义所要产生的目标： </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>AUTOMAKE_OPTIONS </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>设置 automake 的选项。Automake 主要是帮助开发 GNU 软件的人员来维护软件，所以在执行 automake 时，会检查目录下是否存在标准 GNU 软件中应具备的文件，例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件。设置 foreign 时，automake 会改用一般软件的标准来检查。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>bin_PROGRAMS </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>定义要产生的执行文件名。如果要产生多个执行文件，每个文件名用空白符隔开。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>hello_SOURCES </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>定义 'hello' 这个执行程序所需要的原始文件。如果 'hello'这个程序是由多个原始文件所产生，必須把它所用到的所有原始文件都列出来，以空白符隔开。假设 'hello' 还需要 'hello.c'、'main.c'、'hello.h' 三个文件的话，则定义 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>hello_SOURCES= hello.c main.c hello.h </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>如果定义多个执行文件，则对每个执行程序都要定义相对的filename_SOURCES。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>编辑好 Makefile.am 文件，就可以用 automake --add-missing来产生 Makefile.in。加上 --add-missing 选项来告诉 automake顺便假如包装一个软件所必须的文件。Automake产生生出來的 Makefile.in 文件是完全符合 GNU Makefile 的惯例，只要执行 configure这个shell script 便可以产生合适的 Makefile 文件了。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>4.3 使用 Makefile </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>利用 configure 所产生的 Makefile文件有几个预先设定的目标可供使用，这里只用几个简述如下： </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>make all </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>产生设定的目标，既次范例中的执行文件。只敲入make 也可以，此时会开始编译源代码，然后连接并产生执行文件。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>make clean </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>清除之前所编译的执行文件及目标文件(object file, *.o)。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>make distclean </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>除了清除执行文件和目的文件以外，也把 configure 所产生的 Makefile 清除掉。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>make install </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>將程序安装到系统中，若源码编译成功，且执行结果正确，便可以把程序安装到系统预先设定的执行文件存放路径中，若用 bin_PROGRAMS 宏的话，程序会被安装到 /usr/local/bin下。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>make dist </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>將程序和相关的文档包装为一个压缩文档以供发布 (distribution) 。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz 为名称的文件。PACKAGE 和 VERSION 这两个参数是根据 configure.in 文件中 AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定义。在此范例中会产生 'hello-1.0.tar.gz' 的文件。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>make distcheck </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>和 make dist 类似，但是加入检查包装以后的压缩文件是否正常，这个目标除了把程序和相关文档包装成 tar.gz 文件外，还会自动把这个压缩文件解开，执行 configure，并执行 make all ，确认编译无错误以后，户显示这个 tar.gz 文件已经准备好可以发布了。这个检查非常有用，检查过关的套件，基本上可以给任何具备 GNU 开发环境的人去重新编译成功。就 hello-1.tar.gz 这个范例而言，除了在Red Hat Linux 上，在 FreeBSD 2.2.x 也可以正确编译。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>要注意的是，利用 Autoconf 及 Automake 所产生出來的软件套件是可以在没有安装 Autoconf 及 Automake 的环境使用的，因为 configure 是一个 shell script，它己被设计为可以在一般 Unix 的 sh 这个 shell 下执行。但是如果要修改 configure.in 及 Makefile.am 文件再产生新的 configure 及 Makefile.in 文件时就一定要有 Autoconf 及 Automake 了。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14><B>5. 相关资料</B> </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>Autoconf 和 Automake 功能十分强大，可以从它们附带的 info 稳当4中找到详细的使用方法说明。你也可以从许多现有的GNU 软件或 Open Source 软件中找到相关的 configure.in 或 Makefile.am 文件，他们是学习 Autoconf 及 Automake 更多技巧的最佳范例。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>这个简介只用到了 Autoconf 及 Automake 的皮毛罢了，如果你有心加入 Open Source 软件开发的行列，希望这篇文章可以帮助你对产生 Makefile 有个简单的了解。其它有关开发 GNU 程式或 C 程序设计及 Makefile 的详细运用及技巧，建议从 GNU Coding Standards (GNU 编码规定) 读起，里面包含了 GNU Makefile 惯例，及开发 GNU 软件的标准程序和惯例。这些 GNU 软件的在线说明文件可以在 http://www.gnu.org/ 上找到。 </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14><B>6. 结束语</B> </TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>利用 Autoconf 及 Automake，产生一个 Makefile 似乎不再象以前那么困难了，而使用 Autoconf 也使得我们在不同平台上或各家 Unix 之间发布及便宜程序变的简单，这对于在Unix 系统上程序开发员来说减轻了许多负担。妥善运用这些 GNU 的工具软件，可以帮助我们更容易的去开发程序，而且更容易维护源代码。</TD></TR></TBODY></TABLE><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://ronchen.blogbus.com/logs/3956026.html">I/O重定向详解</a> 2006-12-02</div><div><a href="http://ronchen.blogbus.com/logs/2126112.html">悟透Delphi 之 第十六章 操作界面与操作逻辑 1 [zz]</a> 2006-03-24</div><div><a href="http://ronchen.blogbus.com/logs/1502899.html">累</a> 2005-10-12</div><div><a href="http://ronchen.blogbus.com/logs/1457194.html">下半年要关注的会议</a> 2005-09-23</div><div><a href="http://ronchen.blogbus.com/logs/1417477.html">MATLAB下的音频AGC实现(原创)</a> 2005-09-07</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://del.icio.us/post?v=4&noui&jump=close&url=http%3A%2F%2Fronchen.blogbus.com%2Flogs%2F3621604.html&title=%E4%BD%BF%E7%94%A8AutoMake%E8%BD%BB%E6%9D%BE%E7%94%9F%E6%88%90Makefile%5Bzz%5D">Del.icio.us</a></span></div><br><br><div class="sysmsg"><b><a href="http://www.gov.cn/zwgk/2008-05/18/content_981560.htm">深切哀悼四川汶川大地震遇难同胞</a></b><br><br></div>]]></description>
   <link>http://ronchen.blogbus.com/logs/3621604.html</link>
   <author>Ronnie</author>
   <pubDate>Thu, 19 Oct 2006 20:24:54 +0800</pubDate>
  </item>
  <item>
   <title>gcc参数详解学习笔记</title>
   <description><![CDATA[<p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">一</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">历史</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> <p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">GCC</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">最早是</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">Richard Stallman</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">在十几年前编写的针对于</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">C</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的编译器</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">,</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">意思即为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">GNU C Compiler,</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">后来发展支持</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%">&nbsp;</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">Ada</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">，</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">C++, Java, Objective C, Pascal, COBOL, </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">以及支持逻辑编程的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">Mercury</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">语言，后来其英文原名变为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">:</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%">&nbsp;</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">GNU Compiler Collection . </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">除此之外，</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">GCC</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">对于各种硬件平台都提供了完善的支持。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">一般的，</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">GCC</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的编译功能包括</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc (C</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的编译器</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">), g++(C++</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的编译器</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">)</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">，在编译过程中，一共有四步工作。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">1.</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">预处理，生成</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">i</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件，</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">C</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件编译为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.i</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件，</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">C++</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件编译为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.ii</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件，它们都为源程序的预处理结果文件</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">以最简单的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">Hello World</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">程序为例</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">:<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">*********************************<br />// test.c<br />#include &quot;stdio.h&quot;<br />#define MAX 9<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">int main()<br />{<br /> int a;<br /> a=MAX;<br /> printf(&quot;Hello Worldn&quot;);<br />}<br />*********************************<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">cpp test.c test.i</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">　</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">&nbsp;</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">可得到预处理文件</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.i</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">，通过查看该文件，我们可以看到，我们引入的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">include</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件已经被引入处理，</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">define</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">定义的部分已经被完全带入。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">2.</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">预处理文件转换成汇编语言，生成</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.s</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件。这一步利用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">egcs</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">来完成</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">(</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">mingw</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">标准包中没有见到这个预编译器，所以测试没有成功，将继续测试）</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">3.</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">汇编变为目标文件，生成</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.o</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">, </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">利用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">as</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">来完成。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">4.</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">连接目标文件，生成可执行程序，利用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">ld</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">来完成</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">. (</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">后续继续研究</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">ld</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译过程。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">)<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><br /></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">二</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.GCC</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">参数祥解</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-x language filename</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">设定文件使用的语言，这样源程序的后缀名无效了，并对</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">后接的多个编译文件都有效。这样如果存在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">和</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.cpp</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件联编会有问题，解决这个问题用到了下一个参数</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> -x none filename,</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">在下面做介绍。因为在预处理过程中对于</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">和</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.cpp</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件的处理方式是不一样的。可以使用的参数有</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">:'c','objective-c','c-header','c++','cpp-output','assembler','assembler-with-cpp'.</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译的时候，如果有这样的一个用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">C</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">语言写的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.tmp</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的文件，用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译的时候就用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc -x c test.tmp</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">就可以让</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">用编译</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">C</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">语言的方式来编译</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.tmp.<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-x none filename<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">关掉上一个选项，就是让</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">根据文件名后缀，自动识别文件类型。如用下列方式编译</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">:  gcc -x c test.tmp -x none test2.c  </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">这样可以自由地选择编译方式</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-c<br /></span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">只激活预处理，编译和汇编，也就是把程序做成</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">obj</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件。如</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc -c test.c  </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">就会生成</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.o</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件，当然这样还只是目标文件，需要经过</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">ld</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">连接器对所有的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.o</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件进行联接才能生成可执行文件</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-S<br /></span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">只激活预处理和编译，把文件编译到汇编代码。相当到对源程序做一个</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">egcs</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">操作</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">,</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">生成</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.s</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件。可以查看生成的汇编文件结果。这个对于研究汇编语言的程序员来说是很有作用的。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-E<br /></span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">只激活预处理，这个将对文件进行预处理，将对所有引入的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">include</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件和</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">define</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">定义的量进行代换，为我们开头所说的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译的第一步，即用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">cpp</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">命令将程序语言文件进行预处理</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">但这一步不生成结果文件，如果你需要生成结果文件保存，那么需要利用系统中的输出重定向。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-o<br /></span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">定制目标名称，缺省的时候在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">unix</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">和</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">linux</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">平台下</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc filename</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的结果是一个文件名为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">a.out</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的文件，</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">windows</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">下用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">mingw</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">里带的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译结果是</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">a.exe</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">。如果我们用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc -o hello.exe test.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的话，将生成</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">hello.exe</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">可执行程序。这个并不一定只限于最后一步可执行程序的生成，如用上面所讲的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-S</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">生成的汇编程序也可以用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-o</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">参数生成，比如</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> <b style="mso-bidi-font-weight: normal"><span lang="EN-US">gcc -o hello.asm -S test.c</span></b><span lang="EN-US">&nbsp;</span></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">这样</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">hello.asm</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">就是</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">经过预处理和编译之后的结果。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-pipe<br /></span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">使用管道来代替编译中的临时文件，因为编译的整个过程有几个不同的步骤，每一个步骤都是以前一个步骤的输出为输入的，这样就涉及到数据传递的问题，在没有</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-pipe</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">参数的情况下，是用临时文件的形式来进行传递的，在有该情况的时候就利用管道来传递中间数据。当然，在某些系统中，汇编不能读取管道数据，这样这个参数就不能正常工作了。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-ansi</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">关闭</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gnu c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">与</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">ansi c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">不兼容的特性，激活</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">ansi c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的专有特性</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">, </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">在此情况下，处理器会定义一个</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">__STRICT_ANSI__</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的宏，在有些头文件中会关注该宏是否被申明过，以避免某些函数的引入。此项可参照</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">ansi c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">与</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gnu c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的差别得到更多理解。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-fno-asm<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">此选项为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">ansi</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">选项功能的一部分，禁止将</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">asm, inline, typeof</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">用作关键字。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><br />-fno-strict-prototype<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">这个选项只对</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">g++</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">有作用。这个参数让编译器将所有没有参数的函数都认为是没有显式参数的个数和类型的函数，而不是没有参数。而对于</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">来说，会将没有带参数的函数认成没有显式说明的类型。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-fthis-is-variable<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">这个参数仅对</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">C++</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">程序有效</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">,</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">可以让</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">this</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">做一般变量使用，允许对</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">this</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">赋值</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-fcond-mismatch<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">允许条件表达式的第二和第三参数类型不匹配</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">表达式的值为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">void</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">型</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-funsigned-char<br />-fno-signed-char<br />-fsigned-char<br />-fno-unsigned-char<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">这四个是对</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">char</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">在编译时进行的设置，它们分别决定将</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">char</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">设为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">unsigned char</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">或</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">signed char.<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-include filename<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">加入头文件的位置，以使程序中顺利使用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">#include </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">，这样就可以在编译的时候这样编译</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">:<b style="mso-bidi-font-weight: normal">gcc test.c <p /></b></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-include ./include/test.h</span></b><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">，进行联编。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-imacros filename<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">将</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">filename</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">中的宏扩展到</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的输入文件里，宏定义本身不会出现在输入文件中。意即在编译某个文件</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的时候，它里面申明的宏如果在没有用到该参数的时候，生成目标文件之后就会被丢弃掉，而在用了这个参数之后，这些宏将被保留用于之后文件的编译。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-Dmacro<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">相当于</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">#define macro, </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">宏的内容为字符串</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">'1'</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">。如在编译的时候使用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc -o test.exe test.c -DDEBUG</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">就相当于在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">里面定义了</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">DEBUG</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">宏，值为字串</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">'1'</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">。可用如下程序测试可知：</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><br />**********************************<br />//test.c<br />#include &quot;stdio.h&quot;<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">int main()<br />{<br /> printf(&quot;Hello Worldn&quot;);<br /> #ifdef DEBUG<br />  printf(&quot;hellon&quot;);<br /> #endif<br />}<br />**********************************<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">如用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc -o test.exe test.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译，刚运行结果为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">:<br />Hello World<br /></span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">如用</span><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc -o test.exe test.c -DDEBUG</span></b><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译，则运行结果为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">:<br />Hello World<br />hello<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">因此可以在下一种编译方法中相当于在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">里面定义了</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">DEBUG</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">宏。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-Dmacro=define<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">作用同上，但设定宏的值为</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">define.<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-Umacro<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">相当于给程序中定义的宏作了一次</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">undefine.</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">即</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">:#undef macro<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-undef<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">取消了对任何非标准友的定义</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-Idir<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">#include </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的时候，先在用这个参数指定的位置找头文件，如果没有找到，则到缺省的目录找头文件</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-I-<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">取消</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-Idir</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的作用，表明以后编译的程序将不在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-Idir</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">指定的目录里寻找头文件。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-idirafter dir<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-I</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的目录里面查找失败之后，再在这个目录里面查找头文件，这样的参数为设置头文件查找的优先级问题比较有帮助。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-iprefix prefix<br />-iwithprefix dir<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">这两个参数一起用，在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-I</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">目录寻找失败的时候，到</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">prefix</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">dir</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">下查找头文件。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-nostdinc<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译器不再系统缺省的头文件目录里面找头文件。这样就可以精确地确定头文件的来源，应该比较慎用，在对编译器不是很了解的情况下容易造成编译失败</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.<p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-nostdinc C++<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">不在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">g++</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的标准路径中找头文件，但在其他的路径中继续找。在创</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">lib</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的时候用。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-C<br /></span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">为了有效的分析程序，有预处理的时候不删除注释信息，与</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-E</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">一起使用，有利用分析程序的过程。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-M<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">生成文件的关联的信息，这样就可以知道源代码文件里面关联了哪些它所依赖的头文件。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-MM<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">同上，但忽略由</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">#include </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">造成的依赖关系</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-MD<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">跟</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-M</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">相当，但是输出导入到</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.d</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件中，如</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc -MD test.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">，刚输出的依赖关系存放在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.d</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件里。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-MMD<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">跟</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-MM</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">相同，但是输出到</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">.d</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件中</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">,</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">如</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc -MMD test.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">，刚输出的依赖关系存放在</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">test.d</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">文件里。忽略</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">#include </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的关系</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-Wa,option<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">这个参数将</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">option</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">传给汇编程序，如果</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">option</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">中有逗号，则会把</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">option</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">分成多项，传给汇编程序。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-Wl,option<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">这个参数将</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">option</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">传给连接程序，如果</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">option</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">中有逗号，则会把</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">option</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">分成多项，传给连接程序。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-llibrary<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">用于制定编译的时候使用的库，如</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"> gcc -lgtk tset.c</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">则程序使用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gtk</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">库进行编译，不过需要注意的是</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gcc</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">库一般都是以</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">libname.a</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">来命名库文件，在用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-l</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">参数来加入库文件的时候，直接用</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-lname</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">来引入，而前面的</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">lib</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">被省掉。这一点需要注意。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-Ldir<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译的时候设定库文件查找的路径，不然的话，编译器只在标准库路径里面找库。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-00<br />-01<br />-02<br />-03<br /> </span><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">编译器的优化选项，</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-00</span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">表示没有优化</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">,-01</span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">为缺省值，</span></b><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-03</span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">为最高。</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-g</span></b><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">在编译的时候，产生调试信息</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-gstabs<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">以</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">stabs</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">格式声称调试信息，但不包括</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gdb</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的调试信息。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-gstabs+<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">以</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">stabs</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">格式声称调试信息，包括</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gdb</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的调试信息。</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥"><p /></span></p><p style="WORD-BREAK: break-all; LINE-HEIGHT: 150%"><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">-ggdb<br /> </span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">该参数将把</span><span lang="EN-US" style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%; FONT-FAMILY: ˎ̥">gdb</span><span style="FONT-SIZE: 10pt;<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://ronchen.blogbus.com/logs/2180264.html">2005年10大偏执狂技术[zz]</a> 2006-04-02</div><div><a href="http://ronchen.blogbus.com/logs/2106678.html">浙大高分子物理郑强教授的激情演讲</a> 2006-03-21</div><div><a href="http://ronchen.blogbus.com/logs/2063601.html">Happy Birthday</a> 2006-03-14</div><div><a href="http://ronchen.blogbus.com/logs/1997971.html">研读G.729</a> 2006-03-03</div><div><a href="http://ronchen.blogbus.com/logs/1681881.html">主流的流媒体系统</a> 2005-12-08</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://del.icio.us/post?v=4&noui&jump=close&url=http%3A%2F%2Fronchen.blogbus.com%2Flogs%2F3621442.html&title=gcc%E5%8F%82%E6%95%B0%E8%AF%A6%E8%A7%A3%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">Del.icio.us</a></span></div><br><br><div class="sysmsg"><b><a href="http://www.gov.cn/zwgk/2008-05/18/content_981560.htm">深切哀悼四川汶川大地震遇难同胞</a></b><br><br></div>]]></description>
   <link>http://ronchen.blogbus.com/logs/3621442.html</link>
   <author>Ronnie</author>
   <pubDate>Thu, 19 Oct 2006 19:56:01 +0800</pubDate>
  </item>
  <item>
   <title>如何从ITU网站上下载算法标准文档和源代码</title>
   <description><![CDATA[<p>        发现经常有朋友在这里向我要G.729的所算法文档和代码，一直没有时间认真回复，今天告诉大家一个方法，可以免费的从ITU网站上任意下载你所需要的算法文档和源代码。</p><p>1.进入<a href="http://www.itu.int/ebookshop">http://www.itu.int/ebookshop</a></p><p>2.选择 3 Free Recs</p><p>3. 然后进入了<a href="http://ecs.itu.ch/cgi-bin/ebookshop">http://ecs.itu.ch/cgi-bin/ebookshop</a>，选择第二项<br />I wish to REGISTER in order to download up to three (3) Recommendations free of charge</p><p>4，注册后密码发送到你邮箱了。</p><p>5. 选择Telecommunication Standardization Sector (ITU-T) ，从Individual ITU-T Recommendations中选G序列，然后你就可以看到所有G序列的列表了。<br />一个帐号值可以下载三个免费的文档，代码也可以，如果要下载更多，你就申请一堆邮箱吧。</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://ronchen.blogbus.com/logs/1997971.html">研读G.729</a> 2006-03-03</div><div><a href="http://ronchen.blogbus.com/logs/1531980.html">Line echo cancellation (LEC) algorithm implementation  has been finished!</a> 2005-10-24</div><div><a href="http://ronchen.blogbus.com/logs/1490016.html">Daily Digest</a> 2005-10-08</div><div><a href="http://ronchen.blogbus.com/logs/1485964.html">Next Week's Plan</a> 2005-10-05</div><div><a href="http://ronchen.blogbus.com/logs/1484102.html">音频AGC 16 bit 定点实现已经完成</a> 2005-10-04</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://del.icio.us/post?v=4&noui&jump=close&url=http%3A%2F%2Fronchen.blogbus.com%2Flogs%2F3479175.html&title=%E5%A6%82%E4%BD%95%E4%BB%8EITU%E7%BD%91%E7%AB%99%E4%B8%8A%E4%B8%8B%E8%BD%BD%E7%AE%97%E6%B3%95%E6%A0%87%E5%87%86%E6%96%87%E6%A1%A3%E5%92%8C%E6%BA%90%E4%BB%A3%E7%A0%81">Del.icio.us</a></span></div><br><br><div class="sysmsg"><b><a href="http://www.gov.cn/zwgk/2008-05/18/content_981560.htm">深切哀悼四川汶川大地震遇难同胞</a></b><br><br></div>]]></description>
   <link>http://ronchen.blogbus.com/logs/3479175.html</link>
   <author>Ronnie</author>
   <pubDate>Wed, 04 Oct 2006 19:19:44 +0800</pubDate>
  </item>
  <item>
   <title>C++中的虚函数(virtual function)</title>
   <description><![CDATA[<p>C++中的虚函数(virtual function) </p><p /><p>C++中的虚函数(virtual function) <br />1.简介 <br />    虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次：</p><p>class A<br />{<br />public:<br />    virtual void foo() { cout &lt;&lt; &quot;A::foo() is called&quot; &lt;&lt; endl;}<br />};</p><p>class B: public A<br />{<br />public:<br />    virtual void foo() { cout &lt;&lt; &quot;B::foo() is called&quot; &lt;&lt; endl;}<br />};</p><p>那么，在使用的时候，我们可以：</p><p>A * a = new B();<br />a-&gt;foo();       // 在这里，a虽然是指向A的指针，但是被调用的函数(foo)却是B的!</p><p>    这个例子是虚函数的一个典型应用，通过这个例子，也许你就对虚函数有了一些概念。它虚就虚在所谓“推迟联编”或者“动态联编”上，一个类函数的调用并不是在编译时刻被确定的，而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数，所以被成为“虚”函数。</p><p>    虚函数只能借助于指针或者引用来达到多态的效果，如果是下面这样的代码，则虽然是虚函数，但它不是多态的：</p><p>class A<br />{<br />public:<br />    virtual void foo();<br />};</p><p>class B: public A<br />{<br />    virtual void foo();<br />};</p><p>void bar()<br />{<br />    A a;<br />    a.foo();   // A::foo()被调用<br />}</p><p>1.1 多态 <br />    在了解了虚函数的意思之后，再考虑什么是多态就很容易了。仍然针对上面的类层次，但是使用的方法变的复杂了一些：</p><p>void bar(A * a)<br />{<br />    a-&gt;foo();  // 被调用的是A::foo() 还是B::foo()？<br />}</p><p>因为foo()是个虚函数，所以在bar这个函数中，只根据这段代码，无从确定这里被调用的是A::foo()还是B::foo()，但是可以肯定的说：如果a指向的是A类的实例，则A::foo()被调用，如果a指向的是B类的实例，则B::foo()被调用。</p><p>这种同一代码可以产生不同效果的特点，被称为“多态”。</p><p>1.2 多态有什么用？ <br />    多态这么神奇，但是能用来做什么呢？这个命题我难以用一两句话概括，一般的C++教程（或者其它面向对象语言的教程）都用一个画图的例子来展示多态的用途，我就不再重复这个例子了，如果你不知道这个例子，随便找本书应该都有介绍。我试图从一个抽象的角度描述一下，回头再结合那个画图的例子，也许你就更容易理解。</p><p>    在面向对象的编程中，首先会针对数据进行抽象（确定基类）和继承（确定派生类），构成类层次。这个类层次的使用者在使用它们的时候，如果仍然在需要基类的时候写针对基类的代码，在需要派生类的时候写针对派生类的代码，就等于类层次完全暴露在使用者面前。如果这个类层次有任何的改变（增加了新类），都需要使用者“知道”（针对新类写代码）。这样就增加了类层次与其使用者之间的耦合，有人把这种情况列为程序中的“bad smell”之一。</p><p>    多态可以使程序员脱离这种窘境。再回头看看1.1中的例子，bar()作为A-B这个类层次的使用者，它并不知道这个类层次中有多少个类，每个类都叫什么，但是一样可以很好的工作，当有一个C类从A类派生出来后，bar()也不需要“知道”（修改）。这完全归功于多态--编译器针对虚函数产生了可以在运行时刻确定被调用函数的代码。</p><p>1.3 如何“动态联编” <br />    编译器是如何针对虚函数产生可以再运行时刻确定被调用函数的代码呢？也就是说，虚函数实际上是如何被编译器处理的呢？Lippman在深度探索C++对象模型[1]中的不同章节讲到了几种方式，这里把“标准的”方式简单介绍一下。</p><p>    我所说的“标准”方式，也就是所谓的“VTABLE”机制。编译器发现一个类中有被声明为virtual的函数，就会为其搞一个虚函数表，也就是 VTABLE。VTABLE实际上是一个函数指针的数组，每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE，不管它有多少个实例。派生类有自己的VTABLE，但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序，同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候，编译器还会在每个实例的内存布局中增加一个vptr字段，该字段指向本类的VTABLE。通过这些手段，编译器在看到一个虚函数调用的时候，就会将这个调用改写，针对1.1中的例子：</p><p>void bar(A * a)<br />{<br />    a-&gt;foo();<br />}</p><p>会被改写为：</p><p>void bar(A * a)<br />{<br />    (a-&gt;vptr[1])();<br />}</p><p>    因为派生类和基类的foo()函数具有相同的VTABLE索引，而他们的vptr又指向不同的VTABLE，因此通过这样的方法可以在运行时刻决定调用哪个foo()函数。</p><p>    虽然实际情况远非这么简单，但是基本原理大致如此。</p><p>1.4 overload和override <br />    虚函数总是在派生类中被改写，这种改写被称为“override”。我经常混淆“overload”和“override”这两个单词。但是随着各类C++的书越来越多，后来的程序员也许不会再犯我犯过的错误了。但是我打算澄清一下：</p><p>override是指派生类重写基类的虚函数，就象我们前面B类中重写了A类中的foo()函数。重写的函数必须有一致的参数表和返回值（C++标准允许返回值不同的情况，这个我会在“语法”部分简单介绍，但是很少编译器支持这个feature）。这个单词好象一直没有什么合适的中文词汇来对应，有人译为“覆盖”，还贴切一些。 <br />overload约定成俗的被翻译为“重载”。是指编写一个与已有函数同名但是参数表不同的函数。例如一个函数即可以接受整型数作为参数，也可以接受浮点数作为参数。 <br />2. 虚函数的语法 <br />    虚函数的标志是“virtual”关键字。</p><p>2.1 使用virtual关键字 <br />    考虑下面的类层次：</p><p>class A<br />{<br />public:<br />    virtual void foo();<br />};</p><p>class B: public A<br />{<br />public:<br />    void foo();    // 没有virtual关键字!<br />};</p><p>class C: public B  // 从B继承，不是从A继承！<br />{<br />public:<br />    void foo();    // 也没有virtual关键字！<br />};</p><p>    这种情况下，B::foo()是虚函数，C::foo()也同样是虚函数。因此，可以说，基类声明的虚函数，在派生类中也是虚函数，即使不再使用virtual关键字。</p><p>2.2 纯虚函数 <br />    如下声明表示一个函数为纯虚函数：</p><p>class A<br />{<br />public:<br />    virtual void foo()=0;   // =0标志一个虚函数为纯虚函数<br />};</p><p>    一个函数声明为纯虚后，纯虚函数的意思是：我是一个抽象类！不要把我实例化！纯虚函数用来规范派生类的行为，实际上就是所谓的“接口”。它告诉使用者，我的派生类都会有这个函数。</p><p>2.3 虚析构函数 <br />    析构函数也可以是虚的，甚至是纯虚的。例如：</p><p>class A<br />{<br />public:<br />    virtual ~A()=0;   // 纯虚析构函数<br />};</p><p>    当一个类打算被用作其它类的基类时，它的析构函数必须是虚的。考虑下面的例子：</p><p>class A<br />{<br />public:<br />    A() { ptra_ = new char[10];}<br />    ~A() { delete[] ptra_;}        // 非虚析构函数<br />private:<br />    char * ptra_;<br />};</p><p>class B: public A<br />{<br />public:<br />    B() { ptrb_ = new char[20];}<br />    ~B() { delete[] ptrb_;}<br />private:<br />    char * ptrb_;<br />};</p><p>void foo()<br />{<br />    A * a = new B;<br />    delete a;<br />}</p><p>    在这个例子中，程序也许不会象你想象的那样运行，在执行delete a的时候，实际上只有A::~A()被调用了，而B类的析构函数并没有被调用！这是否有点儿可怕？</p><p>    如果将上面A::~A()改为virtual，就可以保证B::~B()也在delete a的时候被调用了。因此基类的析构函数都必须是virtual的。</p><p>    纯虚的析构函数并没有什么作用，是虚的就够了。通常只有在希望将一个类变成抽象类（不能实例化的类），而这个类又没有合适的函数可以被纯虚化的时候，可以使用纯虚的析构函数来达到目的。</p><p>2.4 虚构造函数？ <br />    构造函数不能是虚的。</p><p>3. 虚函数使用技巧 3.1 private的虚函数 <br />    考虑下面的例子：</p><p>class A<br />{<br />public:<br />    void foo() { bar();}<br />private:<br />    virtual void bar() { ...}<br />};</p><p>class B: public A<br />{<br />private:<br />    virtual void bar() { ...}<br />};</p><p>    在这个例子中，虽然bar()在A类中是private的，但是仍然可以出现在派生类中，并仍然可以与public或者protected的虚函数一样产生多态的效果。并不会因为它是private的，就发生A::foo()不能访问B::bar()的情况，也不会发生B::bar()对A::bar() 的override不起作用的情况。</p><p>    这种写法的语意是：A告诉B，你最好override我的bar()函数，但是你不要管它如何使用，也不要自己调用这个函数。</p><p>3.2 构造函数和析构函数中的虚函数调用 <br />    一个类的虚函数在它自己的构造函数和析构函数中被调用的时候，它们就变成普通函数了，不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。例如：</p><p>class A<br />{<br />public:<br />    A() { foo();}        // 在这里，无论如何都是A::foo()被调用！<br />    ~A() { foo();}       // 同上<br />    virtual void foo();<br />};</p><p>class B: public A<br />{<br />public:<br />    virtual void foo();<br />};</p><p>void bar()<br />{<br />    A * a = new B;<br />    delete a;<br />}</p><p>    如果你希望delete a的时候，会导致B::foo()被调用，那么你就错了。同样，在new B的时候，A的构造函数被调用，但是在A的构造函数中，被调用的是A::foo()而不是B::foo()。</p><p>3.3 多继承中的虚函数 3.4 什么时候使用虚函数 <br />    在你设计一个基类的时候，如果发现一个函数需要在派生类里有不同的表现，那么它就应该是虚的。从设计的角度讲，出现在基类中的虚函数是接口，出现在派生类中的虚函数是接口的具体实现。通过这样的方法，就可以将对象的行为抽象化。</p><p>    以设计模式[2]中Factory Method模式为例，Creator的factoryMethod()就是虚函数，派生类override这个函数后，产生不同的Product类，被产生的Product类被基类的AnOperation()函数使用。基类的AnOperation()函数针对Product类进行操作，当然 Product类一定也有多态（虚函数）。</p><p>    另外一个例子就是集合操作，假设你有一个以A类为基类的类层次，又用了一个std::vector&lt;A *&gt;来保存这个类层次中不同类的实例指针，那么你一定希望在对这个集合中的类进行操作的时候，不要把每个指针再cast回到它原来的类型（派生类），而是希望对他们进行同样的操作。那么就应该将这个“一样的操作”声明为virtual。</p><p>    现实中，远不只我举的这两个例子，但是大的原则都是我前面说到的“如果发现一个函数需要在派生类里有不同的表现，那么它就应该是虚的”。这句话也可以反过来说：“如果你发现基类提供了虚函数，那么你最好override它”。</p><p>4.参考资料 <br />[1] 深度探索C++对象模型，Stanley B.Lippman，侯捷译</p><p>[2] Design Patterns, Elements of Reusable Object-Oriented Software, GOF</p><a href="new.php?BlogID=1062599"></a><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://ronchen.blogbus.com/logs/3954891.html">深层揭密extern</a> 2006-12-02</div><div><a href="http://ronchen.blogbus.com/logs/2106678.html">浙大高分子物理郑强教授的激情演讲</a> 2006-03-21</div><div><a href="http://ronchen.blogbus.com/logs/1681881.html">主流的流媒体系统</a> 2005-12-08</div><div><a href="http://ronchen.blogbus.com/logs/1526322.html">预祝MM交大考试顺利!</a> 2005-10-22</div><div><a href="http://ronchen.blogbus.com/logs/1420251.html">Remember When</a> 2005-09-08</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://del.icio.us/post?v=4&noui&jump=close&url=http%3A%2F%2Fronchen.blogbus.com%2Flogs%2F2780170.html&title=C%2B%2B%E4%B8%AD%E7%9A%84%E8%99%9A%E5%87%BD%E6%95%B0%28virtual+function%29">Del.icio.us</a></span></div><br><br><div class="sysmsg"><b><a href="http://www.gov.cn/zwgk/2008-05/18/content_981560.htm">深切哀悼四川汶川大地震遇难同胞</a></b><br><br></div>]]></description>
   <link>http://ronchen.b