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

📄 如何使用gcc编译器 - c43w的专栏 - csdnblog.htm

📁 关于C+编程思想的课件
💻 HTM
📖 第 1 页 / 共 4 页
字号:
  <LI><A id=MyLinks1_HyperLink1 href="http://search.csdn.net/search_blog.asp" 
  target=_blank>搜索</A> 
  <LI><A id=MyLinks1_Admin href="http://writeblog.csdn.net/">登录</A> </LI></UL>
<H3>Blog统计</H3>
<UL class=list>
  <LI class=listitem>原创 - 8 
  <LI class=listitem>翻译 - 0 
  <LI class=listitem>转贴 - 0 
  <LI class=listitem>点击 - 1440 
  <LI class=listitem>评论 - 24 
  <LI class=listitem>Trackbacks -0 </LI></UL>
<H3 class=listtitle>文章</H3>
<UL class=list>
  <LI class=listitem><A 
  href="http://blog.csdn.net/c43w/category/118757.aspx">DATABASE</A><A 
  href="http://blog.csdn.net/c43w/category/118757.aspx/rss">(RSS)</A>
  <LI class=listitem><A 
  href="http://blog.csdn.net/c43w/category/118759.aspx">OTHERS</A><A 
  href="http://blog.csdn.net/c43w/category/118759.aspx/rss">(RSS)</A>
  <LI class=listitem><A 
  href="http://blog.csdn.net/c43w/category/118758.aspx">PROGRAME</A><A 
  href="http://blog.csdn.net/c43w/category/118758.aspx/rss">(RSS)</A></LI></UL>
<H3 class=listtitle>收藏</H3>
<UL class=list></UL>
<H3 class=listtitle>相册</H3><!--category title-->
<UL class=list>
  <LI class=listitem><A href="http://blog.csdn.net/c43w/Gallery/118938.aspx">My 
  friend's Photo</A>
  <LI class=listitem><A href="http://blog.csdn.net/c43w/Gallery/118936.aspx">My 
  Photo</A></LI></UL>
<H3 class=listtitle>程序设计</H3>
<UL class=list>
  <LI class=listitem><A 
  href="http://blog.csdn.net/VisionCat/category/96409.aspx" 
  target=_blank>Dev-Cpp/Mingw32 环境介绍</A></LI></UL>
<H3 class=listtitle>网络技术</H3>
<UL class=list>
  <LI class=listitem><A href="http://www.chinaren.com/s2005/technology.shtml" 
  target=_blank>网络通信URL</A></LI></UL>
<H3 class=listtitle>存档</H3>
<UL class=list>
  <LI><A href="http://blog.csdn.net/c43w/archive/2005/05.aspx">2005年05月(4)</A>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/04.aspx">2005年04月(4)</A></LI></UL><SPAN 
id=Anthem_RecentComments1_ltlComments__><SPAN 
id=RecentComments1_ltlComments></SPAN></SPAN></DIV>
<DIV id=main>
<DIV class=Tag>
<SCRIPT language=javascript 
src="如何使用gcc编译器 - c43w的专栏 - CSDNBlog.files/urltag.aspx"></SCRIPT>

<DIV style="CLEAR: both"></DIV></DIV>
<SCRIPT>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</SCRIPT>

<DIV class=post>
<DIV class=postTitle><A 
href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx"><IMG height=13 
src="如何使用gcc编译器 - c43w的专栏 - CSDNBlog.files/authorship.gif" width=15 
border=0>&nbsp;如何使用gcc编译器</A> </DIV>
<DIV class=postText><FONT size=3><STRONG>目录</STRONG>: </FONT>
<UL>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#229lfindex0">GCC 
  rules </A>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#229lfindex1">开始... 
  </A>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#229lfindex2">预编译 
  </A>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#229lfindex3">编译 
  </A>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#229lfindex4">汇编 
  </A>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#229lfindex5">连接 
  </A>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#229lfindex6">另外两个重要选项 
  </A>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#229lfindex7">调试 
  </A>
  <LI><A 
  href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#229lfindex8">小结&nbsp;</A><!-- HEAD OF THE ARTICLE --><BR>&nbsp; 
  </LI></UL>
<P><STRONG><FONT size=3>摘要</FONT>:</STRONG> </P>
<P>要想读懂本文,你需要对C语言有基本的了解,本文将介绍如何使用gcc编译器。首先,我们介绍如何在命令行方式下使用编译器编译简单的C源代码。然后,我们简要介绍一下编译器究竟作了那些工作,以及如何控制编译过程。我们也简要介绍了调试器的使用方法。 
<BR><BR><!-- HR divider -->
<TABLE height=1 cellSpacing=0 cellPadding=0 width=572 align=center border=0>
  <TBODY>
  <TR>
    <TD bgColor=#8282e0><IMG height=2 alt="" src="" 
width=1></TD></TR></TBODY></TABLE><!-- BODY OF THE ARTICLE --><A 
name=229lfindex0>&nbsp;</A> </P>
<H2>GCC rules </H2>
<P>你能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的可执行文件中加入了什么?可能会加入各种后门和木马。Ken 
Thompson是一个著名的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门和永久的木马。请到 <A 
href="http://www.acm.org/classics/sep95">这里</A>&nbsp; 
阅读他对这个杰作的描述。幸运的是,我们有了gcc。当你进行 <CODE>configure; make; make install </CODE>时, 
gcc在幕后做了很多繁重的工作。如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏,不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要做些什么,按什么顺序做。我们将看看如何编译C程序,以及如何使用编译选项让gcc按照我们的要求工作。步骤(以及所用工具)如下: 
<A 
href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#precomp">预编译</A>&nbsp; 
(gcc -E), <A 
href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#comp">编译</A>&nbsp; 
(gcc), <A 
href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#assem">汇编</A>&nbsp; 
(as),和 <A 
href="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx#link">连接</A>&nbsp; 
(ld)。 </P><A name=229lfindex1>&nbsp;</A> 
<H2>开始... </H2>
<P>首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。(各位老前辈,请原谅我)。 </P>
<P></P><PRE>#include &lt;stdio.h&gt;int main()<BR>{  printf("Hello World!\n");}</PRE>
<P></P>
<P>把这个文件保存为 <CODE>game.c</CODE>。 你可以在命令行下编译它: </P><PRE>gcc game.c</PRE>在默认情况下,C编译器将生成一个名为 <CODE>a.out</CODE> 的可执行文件。你可以键入如下命令运行它: <PRE>a.out<B>Hello World</B></PRE>每一次编译程序时,新的 <CODE>a.out</CODE> 
将覆盖原来的程序。你无法知道是哪个程序创建了 <CODE>a.out</CODE>。我们可以通过使用 <CODE>-o</CODE> 编译选项,告诉 
gcc我们想把可执行文件叫什么名字。我们将把这个程序叫做 <CODE>game</CODE>,我们可以使用任何名字,因为C没有Java那样的命名限制。 <PRE>gcc -o game game.c</PRE><PRE>game<B>Hello World</B></PRE>
<P></P>
<P>到现在为止,我们离一个有用的程序还差得很远。如果你觉得沮丧,你可以想一想我们已经编译并运行了一个程序。因为我们将一点一点为这个程序添加功能,所以我们必须保证让它能够运行。似乎每个刚开始学编程的程序员都想一下子编一个1000行的程序,然后一次修改所有的错误。没有人,我是说没有人,能做到这个。你应该先编一个可以运行的小程序,修改它,然后再次让它运行。这可以限制你一次修改的错误数量。另外,你知道刚才做了哪些修改使程序无法运行,因此你知道应该把注意力放在哪里。这可以防止这样的情况出现:你认为你编写的东西应该能够工作,它也能通过编译,但它就是不能运行。请切记,能够通过编译的程序并不意味着它是正确的。 
</P>
<P>下一步为我们的游戏编写一个头文件。头文件把数据类型和函数声明集中到了一处。这可以保证数据结构定义的一致性,以便程序的每一部分都能以同样的方式看待一切事情。 
</P><PRE>#ifndef DECK_H#define DECK_H#define DECKSIZE 52typedef struct deck_t{  int card[DECKSIZE];  /* number of cards used */  int dealt;}deck_t;#endif /* DECK_H */</PRE>
<P>把这个文件保存为 <CODE>deck.h</CODE>。只能编译 <CODE>.c</CODE> 文件,所以我们必须修改 
game.c。在game.c的第2行,写上 <CODE>#include "deck.h"</CODE>。在第5行写上 <CODE>deck_t 
deck;</CODE>。为了保证我们没有搞错,把它重新编译一次。 </P><PRE>gcc -o game game.c</PRE>
<P></P>
<P>如果没有错误,就没有问题。如果编译不能通过,那么就修改它直到能通过为止。 </P><A name=229lfindex2>&nbsp;</A> 
<H2><A name=precomp>预编译 </A></H2>
<P>编译器是怎么知道 <CODE>deck_t</CODE> 
类型是什么的呢?因为在预编译期间,它实际上把"deck.h"文件复制到了"game.c"文件中。源代码中的预编译指示以"#"为前缀。你可以通过在gcc后加上 
<CODE>-E</CODE> 选项来调用预编译器。 </P><PRE>gcc -E -o game_precompile.txt game.cwc -l game_precompile.txt  3199 game_precompile.txt</PRE>几乎有3200行的输出!其中大多数来自 
<CODE>stdio.h</CODE> 包含文件,但是如果你查看这个文件的话,我们的声明也在那里。如果你不用 <CODE>-o</CODE> 
选项指定输出文件名的话,它就输出到控制台。预编译过程通过完成三个主要任务给了代码很大的灵活性。 
<OL>
  <LI>把"include"的文件拷贝到要编译的源文件中。 
  <LI>用实际值替代"define"的文本。 
  <LI>在调用宏的地方进行宏替换。 
</LI></OL>这就使你能够在整个源文件中使用符号常量(即用DECKSIZE表示一付牌中的纸牌数量),而符号常量是在一个地方定义的,如果它的值发生了变化,所有使用符号常量的地方都能自动更新。在实践中,你几乎不需要单独使用 
<CODE>-E</CODE> 选项,而是让它把输出传送给编译器。 
<P></P><A name=229lfindex3>&nbsp;</A> 
<H2><A name=comp>编译 </A></H2>
<P>作为一个中间步骤,gcc把你的代码翻译成汇编语言。它一定要这样做,它必须通过分析你的代码搞清楚你究竟想要做什么。如果你犯了语法错误,它就会告诉你,这样编译就失败了。人们有时会把这一步误解为整个过程。但是,实际上还有许多工作要gcc去做呢。 
</P><A name=229lfindex4>&nbsp;</A> 
<H2><A name=assem>汇编 </A></H2>
<P><CODE>as</CODE> 把汇编语言代码转换为目标代码。事实上目标代码并不能在CPU上运行,但它离完成已经很近了。编译器选项 
<CODE>-c</CODE> 把 .c 文件转换为以 .o 为扩展名的目标文件。 如果我们运行 </P><PRE>gcc -c game.c</PRE>我们就自动创建了一个名为game.o的文件。这里我们碰到了一个重要的问题。我们可以用任意一个 .c 
文件创建一个目标文件。正如我们在下面所看到的,在连接步骤中我们可以把这些目标文件组合成可执行文件。让我们继续介绍我们的例子。因为我们正在编写一个纸牌游戏,我们已经把一付牌定义为 
<CODE>deck_t</CODE>,我们将编写一个洗牌函数。这个函数接受一个指向deck类型的指针,并把一付随机的牌装入deck类型。它使用'drawn' 
数组跟踪记录那些牌已经用过了。这个具有DECKSIZE个元素的数组可以防止我们重复使用一张牌。 
<P></P><PRE>#include &lt;stdlib.h&gt;#include &lt;stdio.h&gt;#include &lt;time.h&gt;#include "deck.h"static time_t seed = 0;void shuffle(deck_t *pdeck){  /* Keeps track of what numbers have been used */  int drawn[DECKSIZE] = {0};  int i;  /* One time initialization of rand */  if(0 == seed)  {    seed = time(NULL);    srand(seed);  }  for(i = 0; i &lt; DECKSIZE; i++)  {    int value = -1;    do    {      value = rand() % DECKSIZE;    }    while(drawn[value] != 0);    /* mark value as used */    drawn[value] = 1;    /* debug statement */    printf("%i\n", value);    pdeck-&gt;card[i] = value;  }  pdeck-&gt;dealt = 0;  return;}</PRE>
<P>把这个文件保存为 
<CODE>shuffle.c</CODE>。我们在这个代码中加入了一条调试语句,以便运行时,能输出所产生的牌号。这并没有为我们的程序添加功能,但是现在到了关键时刻,我们看看究竟发生了什么。因为我们的游戏还在初级阶段,我们没有别的办法确定我们的函数是否实现了我们要求的功能。使用那条printf语句,我们就能准确地知道现在究竟发生了什么,以便在开始下一阶段之前我们知道牌已经洗好了。在我们对它的工作感到满意之后,我们可以把那一行语句从代码中删掉。这种调试程序的技术看起来很粗糙,但它使用最少的语句完成了调试任务。以后我们再介绍更复杂的调试器。 
</P>请注意两个问题。 
<OL>
  <LI>我们用传址方式传递参数,你可以从'&amp;'(取地址)操作符看出来。这把变量的机器地址传递给了函数,因此函数自己就能改变变量的值。也可以使用全局变量编写程序,但是应该尽量少使用全局变量。指针是C的一个重要组成部分,你应该充分地理解它。 

  <LI>我们在一个新的 .c 文件中使用函数调用。操作系统总是寻找名为'main'的函数,并从那里开始执行。 <CODE>shuffle.c</CODE> 
  中没有'main'函数,因此不能编译为独立的可执行文件。我们必须把它与另一个具有'main'函数并调用'shuffle'的程序组合起来。 </LI></OL>
<P>运行命令 </P><PRE>gcc -c shuffle.c</PRE>并确定它创建了一个名为 <CODE>shuffle.o</CODE> 
的新文件。编辑game.c文件,在第7行,在 deck_t类型的变量 <CODE>deck</CODE> 声明之后,加上下面这一行: <PRE>shuffle(&amp;deck);</PRE>现在,如果我们还象以前一样创建可执行文件,我们就会得到一个错误 <PRE>gcc -o game game.c/tmp/ccmiHnJX.o: In function `main':/tmp/ccmiHnJX.o(.text+0xf): undefined reference to `shuffle'collect2: ld returned 1 exit status</PRE>编译成功了,因为我们的语法是正确的。但是连接步骤却失败了,因为我们没有告诉编译器'shuffle'函数在哪里。那么,到底什么是连接?我们怎样告诉编译器到哪里寻找这个函数呢? 

<P></P><A name=229lfindex5>&nbsp;</A> 
<H2><A name=link>连接 </A></H2>
<P>连接器<CODE>ld</CODE>,使用下面的命令,接受前面由 <CODE>as</CODE> 创建的目标文件并把它转换为可执行文件 </P><PRE>gcc -o game game.o shuffle.o</PRE>这将把两个目标文件组合起来并创建可执行文件 <CODE>game</CODE>。 
<P></P>
<P>连接器从shuffle.o目标文件中找到 <CODE>shuffle</CODE> 
函数,并把它包括进可执行文件。目标文件的真正好处在于,如果我们想再次使用那个函数,我们所要做的就是包含"deck.h" 文件并把 
<CODE>shuffle.o</CODE> 目标文件连接到新的可执行文件中。 </P>
<P>象这样的代码重用是经常发生的。虽然我们并没有编写前面作为调试语句调用的 <CODE>printf</CODE> 函数,连接器却能从我们用 
<CODE>#include &lt;stdlib.h&gt;</CODE> 
语句包含的文件中找到它的声明,并把存储在C库(/lib/libc.so.6)中的目标代码连接进来。这种方式使我们可以使用已能正确工作的其他人的函数,只关心我们所要解决的问题。这就是为什么头文件中一般只含有数据和函数声明,而没有函数体。一般,你可以为连接器创建目标文件或函数库,以便连接进可执行文件。我们的代码可能产生问题,因为在头文件中我们没有放入任何函数声明。为了确保一切顺利,我们还能做什么呢? 
</P><A name=229lfindex6>&nbsp;</A> 
<H2><A name=lasttwo>另外两个重要选项 </A></H2>
<P><CODE>-Wall</CODE> 
选项可以打开所有类型的语法警告,以便帮助我们确定代码是正确的,并且尽可能实现可移植性。当我们使用这个选项编译我们的代码时,我们将看到下述警告: </P><PRE>game.c:9: warning: implicit declaration of function `shuffle'</PRE>这让我们知道还有一些工作要做。我们需要在头文件中加入一行代码,以便告诉编译器有关 
<CODE>shuffle</CODE> 函数的一切,让它可以做必要的检查。听起来象是一种狡辩,但这样做 
可以把函数的定义与实现分离开来,使我们能在任何地方使用我们的函数,只要包含新的头文件 
并把它连接到我们的目标文件中就可以了。下面我们就把这一行加入deck.h中。 <PRE>void shuffle(deck_t *pdeck);</PRE>这就可以消除那个警告信息了。 
<P></P>
<P>另一个常用编译器选项是优化选项 <CODE>-O#</CODE> (即 -O2)。 
这是告诉编译器你需要什么级别的优化。编译器具有一整套技巧可以使你的代码运行得更快一点。对于象我们这种小程序,你可能注意不到差别,但对于大型程序来说,它可以大幅度提高运行速度。你会经常碰到它,所以你应该知道它的意思。 
</P><A name=229lfindex7>&nbsp;</A> 
<H2><A name=debug>调试 </A></H2>
<P>我们都知道,代码通过了编译并不意味着它按我们得要求工作了。你可以使用下面的命令验证是否所有的号码都被使用了 </P><PRE>game | sort - n | less</PRE>并且检查有没有遗漏。如果有问题我们该怎么办?我们如何才能深入底层查找错误呢? 
<P></P>你可以使用调试器检查你的代码。大多数发行版都提供著名的调试器:gdb。如果那些众多的命令行选项让你感到无所适从,那么你可以使用KDE提供的一个很好的前端工具 
<A 
href="http://members.nextra.at/johsixt/kdbg.html">KDbg</A>。还有一些其它的前端工具,它们都很相似。要开始调试,你可以选择 
File-&gt;Executable 然后找到你的 <CODE>game</CODE> 程序。当你按下F5键或选择 
Execution-&gt;从菜单运行时,你可以在另一个窗口中看到输出。怎么回事?在那个窗口中我们什么也看不到。不要担心,KDbg没有出问题。问题在于我们在可执行文件中没有加入任何调试信息,所以KDbg不能告诉我们内部发生了什么。编译器选项 
<CODE>-g</CODE> 可以把必要的调试信息加入目标文件。你必须用这个选项编译目标文件(扩展名为.o),所以命令行成了: <PRE>gcc -g -c shuffle.c game.cgcc -g -o game game.o shuffle.o</PRE>这就把钩子放入了可执行文件,使gdb和KDbg能指出运行情况。调试是一种很重要的技术,很值得你花时间学习如何使用。调试器帮助程序员的方法是它能在源代码中设置“断点”。现在你可以用右键单击调用 
<CODE>shuffle</CODE> 
函数的那行代码,试着设置断点。那一行边上会出现一个红色的小圆圈。现在当你按下F5键时,程序就会在那一行停止执行。按F8可以跳入shuffle函数。呵,我们现在可以看到 
<CODE>shuffle.c</CODE> 
中的代码了!我们可以控制程序一步一步地执行,并看到究竟发生了什么事。如果你把光标暂停在局部变量上,你将能看到变量的内容。太好了。这比那条 
<CODE>printf</CODE> 语句好多了,是不是? 
<P></P><A name=229lfindex8>&nbsp;</A> 
<H2>小结 </H2>
<P>本文大体介绍了编译和调试C程序的方法。我们讨论了编译器走过的步骤,以及为了让编译器做这些工作应该给gcc传递哪些选项。我们简述了有关连接共享函数库的问题,最后介绍了调试器。真正了解你所从事的工作还需要付出许多努力,但我希望本文能让你正确地起步。你可以在 
<CODE>gcc</CODE>、 <CODE>as</CODE> 和 <CODE>ld</CODE>的 <CODE>man</CODE> 和 
<CODE>info</CODE> page中找到更多的信息。 </P>
<P>自己编写代码可以让你学到更多的东西。作为练习你可以以本文的纸牌游戏为基础,编写一个21点游戏。那时你可以学学如何使用调试器。使用GUI的KDbg开始可以更容易一些。如果你每次只加入一点点功能,那么很快就能完成。切记,一定要保持程序一直能运行! 
</P>
<P>要想编写一个完整的游戏,你需要下面这些内容: </P>
<UL>
  <LI>一个纸牌玩家的定义(即,你可以把deck_t定义为player_t)。 
  <LI>一个给指定玩家发一定数量牌的函数。记住在纸牌中要增加“已发牌”的数量,以便能知道还有那些牌可发。还要记住玩家手中还有多少牌。 
  <LI>一些与用户的交互,问问玩家是否还要另一张牌。 
  <LI>一个能打印玩家手中的牌的函数。 <I>card</I> 等于value % 13 (得数为0到12),<I>suit</I> 等于 value / 
  13 (得数为0到3)。 
  <LI>一个能确定玩家手中的value的函数。Ace的value为零并且可以等于1或11。King的value为12并且可以等于10。 
</LI></UL><BR><BR>
<P id=TBPingURL>Trackback: 
http://tb.blog.csdn.net/TrackBack.aspx?PostId=370558</P><BR></DIV>
<DIV class=postFoot>
<SCRIPT src=""></SCRIPT>
[<A title=功能强大的网络收藏夹,一秒钟操作就可以轻松实现保存带来的价值、分享带来的快乐 
href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();">收藏到我的网摘</A>]&nbsp;&nbsp; 
c43w发表于 2005年05月02日 02:06:00 </DIV></DIV><LINK 
href="http://blog.csdn.net/c43w/Services/Pingback.aspx" rel=pingback><!--<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Descriptionrdf:about="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx"dc:identifier="http://blog.csdn.net/c43w/archive/2005/05/02/370558.aspx"dc:title="如何使用gcc编译器"trackback:ping="http://tb.blog.csdn.net/TrackBack.aspx?PostId=370558" /></rdf:RDF>-->
<SCRIPT>function hide(){hideComment();}</SCRIPT>
<BR>
<DIV class=post>
<DIV class=postTitle>相关文章:</DIV>
<UL class=postText>
  <LI><A href="http://blog.csdn.net/abigfrog/archive/2003/06/09/12805.aspx" 
  target=_blank>NET编译时都做了一些什么</A> 2003-06-09 <A 
  href="http://blog.csdn.net/abigfrog/" target=_blank>abigfrog</A>
  <LI><A href="http://blog.csdn.net/duckur/archive/2004/09/14/103534.aspx" 
  target=_blank>VC中dll的lib文件和dll有什么不同?</A> 2004-09-14 <A 
  href="http://blog.csdn.net/duckur/" target=_blank>duckur</A>
  <LI><A href="http://blog.csdn.net/ForNormandy/archive/2004/08/22/81393.aspx" 
  target=_blank>为什么c++程序调用c编译器编译的函数需要在调用前加上extern“C”</A> 2004-08-22 <A 
  href="http://blog.csdn.net/ForNormandy/" target=_blank>ForNormandy</A>
  <LI><A href="http://blog.csdn.net/wujian53/archive/2006/05/03/706975.aspx" 
  target=_blank>extern "C" 的用意</A> 2006-05-03 <A 
  href="http://blog.csdn.net/wujian53/" target=_blank>wujian53</A>
  <LI><A href="http://blog.csdn.net/robin_qiu/archive/2006/03/14/624241.aspx" 
  target=_blank>如何混合使用C和C++(上)</A> 2006-03-14 <A 
  href="http://blog.csdn.net/robin_qiu/" 
target=_blank>robin_qiu</A></LI></UL></DIV><BR>
<DIV class=post id=csdn_zhaig_ad_yahoo></DIV><SPAN 
id=Anthem_Comments.ascx_ltlComments__><SPAN id=Comments.ascx_ltlComments><BR>
<DIV id=comments>
<H3></H3>没有评论。 </DIV></SPAN></SPAN>
<SCRIPT language=javascript>
ad_width=468;
ad_height=60;
adcss=2;
unionuser=19;
ad_type='j';
count=5; 
</SCRIPT>

<SCRIPT language=javascript 
src="如何使用gcc编译器 - c43w的专栏 - CSDNBlog.files/showads.js" 
type=text/javascript></SCRIPT>

<SCRIPT language=javascript 
src="如何使用gcc编译器 - c43w的专栏 - CSDNBlog.files/showgm.js" 
type=text/javascript></SCRIPT>

<SCRIPT type=text/javascript>document.write("<img src=http://counter.csdn.net/pv.aspx?id=24 border=0 width=0 height=0>");</SCRIPT>
</DIV>
<P id=footer>Powered by: <BR><A id=Footer1_Hyperlink2 
href="http://scottwater.com/blog" name=Hyperlink1><IMG 
src="如何使用gcc编译器 - c43w的专栏 - CSDNBlog.files/100x30_Logo.gif" border=0></A> <A 
id=Footer1_Hyperlink3 href="http://asp.net/" name=Hyperlink1><IMG 
src="如何使用gcc编译器 - c43w的专栏 - CSDNBlog.files/PoweredByAsp.Net.gif" border=0></A> 
<BR>Copyright © c43w </P>
<SCRIPT src="如何使用gcc编译器 - c43w的专栏 - CSDNBlog.files/counter.js"></SCRIPT>
</FORM>
<SCRIPT language=javascript type=text/javascript>
	<!--
	try{
		hide();
		}
		catch(e){
		}
	//-->
    </SCRIPT>
</BODY></HTML>

⌨️ 快捷键说明

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