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

📄 gcc的安装(installation)与启用(setup).htm

📁 gcc的安装相关资料 详细介绍了gcc的安装步骤和方法
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0063)http://member.netease.com/~jnkey/linuxflr/howto/GCC-HOWTO3.html -->
<HTML><HEAD><TITLE>GCC的安装(installation)与启用(setup)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY text=#000000 bgColor=#ffeedd><A 
href="http://member.netease.com/~jnkey/linuxflr/howto/GCC-HOWTO.html"><EM>The 
Linux GCC HOWTO中译版V0.1</EM></A> <B>:</B> 
<EM>GCC的安装(installation)与启用(setup)</EM><BR><B>Previous:</B> <A 
href="http://member.netease.com/~jnkey/linuxflr/howto/GCC-HOWTO2.html"><EM>上哪抓这些东东?</EM></A><BR><B>Next:</B> 
<A 
href="http://member.netease.com/~jnkey/linuxflr/howto/GCC-HOWTO4.html"><EM>移植(Porting)与编译(Compiling)程式</EM></A> 

<HR noShade>

<H2><A name=11></A>3. GCC的安装(installation)与启用(setup)</H2>
<H3><A name=12></A>3.1. GCC的版本<A name=index.12></A> <A name=index.13></A><A 
name=index.14></A></H3>
<P>你可以在shell的提示符号下键入<CODE>gcc 
-v</CODE>,萤幕上就会显示出你目前正在使用的GCC的版本.而这也是一个相当可靠的方法,可以确定你现在所用的是ELF或是a.out.在我的系统上,执行gcc 
-v的结果是:</P>
<P>
<BLOCKQUOTE><CODE><PRE>$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
</PRE></CODE></BLOCKQUOTE>
<P></P>
<P>上面的讯息说明了几件重要的事情: 
<UL>
  <LI><CODE>i486</CODE>. 
  这是指出(indicates)你目前在用的gcc是为了486的微处理器(processor)而写的-可能你的电脑是386或者是586.这3种微处理器的晶片(chips)所编译而成的程式码,彼此间是可以相容使用的.差别之处是486的程式码在某些地方有加上padding的功能,所以可以在486上面跑得比较快.这对386的机器而言,在执行程式的效能(performance)上并没有什麽不良的影响(detrimental 
  effect),只不过真的(does)会让程式码变得稍稍的大了些. 
  <LI><CODE>box</CODE>. 
  这可以说一点也<EM>不</EM>重要;不过也可能另有所指(像是<CODE>slackware</CODE>或者是<CODE>debian</CODE>),或者根本什麽也不是(所以罗!完整的目录名称是<CODE>i486-linux</CODE>).假如你是实践派的代表,亲自动手建立属於自己的gcc,那麽你可以在建立的过程中(build 
  time)设定这一项,以装点门面(cosmetic effect).就像我做的一样<CODE>:-)</CODE>. 
  <LI><CODE>linux</CODE>. 
  其实这是指<CODE>linuxelf</CODE>,或者是<CODE>linuxaout</CODE>.这一点会令人引起不必要的困惑,究竟是指哪一种会根据你所用的版本而异. 

  <UL>
    <LI><CODE>linux</CODE> 意指ELF若版本序号是2.7.0或是更新的版本;否则的话,就是a.out的了. 
    <LI><CODE>linuxaout</CODE> 
    意指a.out的格式.当<CODE>linux</CODE>的定义(definition)从a.out更换到ELF时,linuxaout就会顺水推舟,摇身一变,成了一个目标物件(target).因此,你不会看到任何版本新於2.7.0的gcc有linuxaout格式的. 
    <A name=index.15></A>
    <LI><CODE>linuxelf</CODE> 
    已经过时了.通常那是指2.6.3版的gcc,而这个版本也可用来产生ELF的可执行档(executables).要注意的是,gcc 
    2.6.3版在产生ELF程式码时会有bugs-如果你目前用的是这个版本,建议你赶快升级. </LI></UL>
  <LI><CODE>2.7.2</CODE> 版本的序号. </LI></UL>
<P></P>
<P>所以,总结起来,我有2.7.2版的gcc,可以产生ELF格式的程式码.就这麽简单,惊讶吧!eh?</P>
<H3><A name=13></A>3.2. 东东装好後都到哪儿去了?</H3>
<P>如果安装gcc时没有仔细的看著萤幕,或者你是从一个完整的发行系统内把gcc单独抓出来安装的话,那麽也许你会想知道到底这些东东装好後是住在整个档案系统(file-system)的那个地方.几个重点如下:</P>
<P>
<UL>
  <LI><CODE>/usr/lib/gcc-lib/</CODE><EM>target</EM><CODE>/</CODE><EM>version</EM><CODE>/</CODE> 
  (与子目录(sub-directories))大部份的编译器(compilers)就是住在这儿的.在这儿有可执行的程式,实际在做编译的工作;另外,还有一些特定版本的(version-specific)程式库与标头档(include 
  files)等. 
  <LI><CODE>/usr/bin/gcc</CODE> 指编译器的驱动程式(driver)--就是你实际在命令列(command 
  line)上执行的程式.这个目录可供各种版本的gcc使用,只要你用不同的编译器目录(如上所述)来安装就可以了.要知道内定的版本是那一个,在shell提示符号下打<CODE>gcc 
  -v</CODE>.要是想强迫执行某个版本,就换打<CODE>gcc -V </CODE><EM>version</EM>.例如: 
  <BLOCKQUOTE><CODE><PRE># gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
# gcc -V 2.6.3 -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.6.3/specs
gcc driver version 2.7.2 executing gcc version 2.6.3
</PRE></CODE></BLOCKQUOTE>
  <LI><CODE>/usr/</CODE><EM>target</EM><CODE>/(bin|lib|include)/</CODE>. 
  如果你装了数种的目标物件(multiple 
  targets),例如a.out与elf,或者某一种的交叉编译器(cross-compiler)等等;那些属於非主流目标物件(non-native 
  target(s))的程式库,binutils(<CODE>as</CODE>, <CODE>ld</CODE>等等)工具与标头档(header 
  files)等都可以在这儿找到.即使你只安装了一种gcc,还是可以在这儿找到这些原本就是替它们准备的东东.如果不是在这儿,那麽就应该是在<CODE>/usr/(bin|lib|include)</CODE>了. 

  <LI><CODE>/lib/</CODE>,<CODE>/usr/lib</CODE> 
  与其它的目录等,都是主流系统(native-system)的程式库目录.许多的应用程式都会用到<CODE>/lib/cpp</CODE> 
  ,因此你也需要它---作法上,不是从<CODE>/usr/lib/gcc-lib/</CODE><EM>target</EM><CODE>/</CODE><EM>version</EM><CODE>/ 
  </CODE>目录里拷贝,就是弄个符号连结(symlink)指向那儿. 
  [译者注:所谓native,是指目前你的系统是以a.out或elf的格式为主,或者内定的gcc是哪一种版本等等.native的意思是'本土的','本国的'与'天生的'......等等;当你拿到一片CD-ROM重头至尾将Linux安装完成,让Linux出生,成为你个人特色浓厚的作业平台之後,如果再加装一些不一样的目标物件,自然就有'本土'与'外省'( 
  无关政治),'本国'与'外国','天生'与'人为'等等的区别,同时也含有内定(default)的意思在.假若再附加上你个人的价值观判断与喜好,我想用主流(native)与非主流(non-native)来翻译应该还算恰当.] 
  <A name=index.16></A></LI></UL>
<P></P>
<H3><A name=14></A>3.3. 标头档ㄋㄟ?标头档ㄋㄟ?<A name=index.17></A> </H3>
<P>把你自己自行安装在<CODE>/usr/local/include</CODE>目录下的标头档(header 
files)排除在外的话,Linux还有另外3种主要的标头档(header files):</P>
<P>
<UL>
  <LI><CODE>/usr/include/</CODE>与其子目录下的标头档,大部份都是由H.J.Lu发展的libc套件(libc binary 
  package)内所提供的.我会只说'大部份(most)'的原因, 是因为你可能有其它来源的标头档(header 
  files)(像是<CODE>curses</CODE>与<CODE>dbm</CODE>程式库等等)摆在这儿;尤其是,如果你现在用的是最新的libc发行系统的话(新版本不像旧版那样,已不再支援curses或dbm了.),那东东之多是人人为之咋舌的! 
  [译者注:libc binary package意指以二进位形式(machine 
  code)储存之套件,并非原始码(text),若要以中文全称译出,则成'libc二进位档套件',似有聱牙之嫌,故略去binary,以libc套件通称.] 
  <A name=index.18></A><A name=index.19></A>
  <LI>在核心原始码的发行系统内(kernel source distribution) ,<CODE>/usr/include/linux</CODE> 
  与 <CODE>/usr/include/asm</CODE> (里头有这些档案: <CODE>&lt;linux/*.h&gt;</CODE> and 
  <CODE>&lt;asm/*.h&gt;</CODE>)应该有符号连结(symbolic 
  links),可连结至目录<CODE>linux/include/linux</CODE> 与 
  <CODE>linux/include/asm</CODE>.如果你有鸿鹄之志的话,安装这些东东後,就不应该只是拿来编译核心(kernel)而已. 
  把原始码解压缩(unpacking)後,可能你也会发现,需要在核心的目录(kernel directory)底下做<CODE>make 
  config</CODE>的动作.很多的档案都会依赖<CODE>&lt;linux/autoconf.h&gt;</CODE>的帮忙,可是这个档案却有可能因版本不同而不存在.若干核心版本里,<CODE>asm</CODE>就只是它自己的一个符号连结,仅仅是在<CODE>make 
  config</CODE>时建立出来而已. [译者注:原文提及autoconf.h时是'Many files depend on 
  <CODE>&lt;linux/autoconf.h&gt;</CODE>,which otherwise may not 
  exist,*'.此处之otherwise之词性应为形容词(adj),指'另一情况','另一种','不同的'之意,将原文形容词子句拆开来应为: (i). 
  Many files depend on <CODE>&lt;linux/autoconf.h&gt;</CODE>. 
  (ii).<CODE>&lt;linux/autoconf.h&gt;</CODE> <EM>of other condition</EM> may not 
  exist. 与下一句互相比对,此处应同指在不同版本之情况下.] 
  所以,当你在目录<CODE>/usr/src/linux</CODE>底下,解开核心的程式码时,就照著下面指示的做吧! 
  <BLOCKQUOTE><CODE><PRE>$ cd /usr/src/linux
$ su
# make config
[回答接下来的问题.通常回答得正不正确并不重要,除非你打算继续□起(go on and build)你的核心.]
# cd /usr/include
# ln -s ../src/linux/include/linux .
# ln -s ../src/linux/include/asm .
</PRE></CODE></BLOCKQUOTE><A name=index.20></A><A name=index.21></A><A 
  name=index.22></A><A name=index.23></A><A name=index.24></A>
  <LI>诸如<CODE>&lt;float.h&gt;</CODE>, 
  <CODE>&lt;limits.h&gt;</CODE>,<CODE>&lt;varargs.h&gt;</CODE>, 
  <CODE>&lt;stdarg.h&gt;</CODE> 
  与<CODE>&lt;stddef.h&gt;</CODE>之类的档案,会随著不同的编译器版本而异,属於你自己'个人'的档案,可以在 
  <CODE>/usr/lib/gcc-lib/i486-box-linux/2.7.2/include/</CODE>与其它有相类似(相同)目录名称的地方(places 
  of that ilk)找到. 11/11/97译 </LI></UL>
<P></P>
<H3><A name=15></A>3.4. 建立交叉编译器(Building cross compilers)</H3>
<H4><A name=16></A>3.4.1. 将Linux当作目标作业平台(target platform)</H4>
<P>假设你已经拿到gcc的原始码,通常你只要依循INSTALL档内的指示便可一切ok. make後面黏个<CODE>configure 
--target=i486-linux --host=XXX</CODE> on platform <CODE>XXX</CODE>,就能帮你变把戏了(do 
the trick).要注意的是,你会需要Linux与核心的标头档的;而且你也需要建立交叉组译器(cross assembler)与交叉连结器(cross 
linker),来源是<A 
href="ftp://tsx-11.mit.edu/pub/linux/packages/GCC/">ftp://tsx-11.mit.edu/pub/linux/packages/GCC/</A></P>
<H4><A name=17></A>3.4.2. Linux当成来源作业平台(source platform),MSDOS作为目标作业平台</H4>
<P>Ugh.很明显的,这个大概需要用到"emx"套件(package)或者是"go"延伸套件(extender).请自行去<A 
href="ftp://sunsite.unc.edu/pub/Linux/devel/msdos">ftp://sunsite.unc.edu/pub/Linux/devel/msdos</A>看看.我并没有测试过这个,因此也无法保证(vouch)它的功能(abilities).</P>
<HR noShade>
<A href="http://member.netease.com/~jnkey/linuxflr/howto/GCC-HOWTO.html"><EM>The 
Linux GCC HOWTO中译版V0.1</EM></A> <B>:</B> 
<EM>GCC的安装(installation)与启用(setup)</EM><BR><B>Previous:</B> <A 
href="http://member.netease.com/~jnkey/linuxflr/howto/GCC-HOWTO2.html"><EM>上哪抓这些东东?</EM></A><BR><B>Next:</B> 
<A 
href="http://member.netease.com/~jnkey/linuxflr/howto/GCC-HOWTO4.html"><EM>移植(Porting)与编译(Compiling)程式</EM></A> 
</BODY></HTML>

⌨️ 快捷键说明

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