荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Ohoh (Linux), 信区: Linux
标  题: GCC HOWTO中译版V0.2 --- 3. GCC的安装与GCC的设定
发信站: 荔园晨风BBS站 (Thu Nov 22 23:18:32 2001), 转信

3.1 GCC的版本
在shell的提示符号下键入gcc -v,萤幕上就会显示出你目前正在使用的GCC的版本
。同时这也是一个相当可靠的方法,可以确定你现在所用的是ELF或是a.out。在我
的系统上,执行gcc -v的结果是:



$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2


上面的讯息指出了几件重要的事情:

i486 这是指明你现在正在用的gcc是为了486的微处理器而写的---你的电脑可能是
386或是586。这3种微处理器的晶片所编译而成的程式码,彼此间是可以相容使用
的。差别之处是486的程式码在某些地方有加上padding的功能,所以可以在486上
面跑得比较快。这对386的机器而言,执行程式的效能并不会有什麽不良的影响,
只不过真的会让程式码变得稍稍的大了一些。
box 这可以说一点也不重要;不过也可能另有所指(像是slackware或者是debian
),或者根本什麽也不是(所以罗!完整的目录名称是i486-linux)。假如你是实
务派的佼佼者,亲自动手建立属於自己的gcc,那麽你可以在建立的过程中设定这
一项,以装点门面。就像我做的一样:-)。
linux 其实这是指linuxelf或是linuxaout。这一项会令人引起不必要的困惑,究
竟是指哪一种会根据你所用的版本而异。
linux 意指ELF若版本序号是2.7.0.(或是更新的版本);否则的话,就是a.out的
了。
linuxaout 意指a.out的格式。当linux的定义从a.out更换到ELF时,linuxaout就
会顺水推舟,摇身一变,成了一个目标物。因此,你不会看到任何版本新於2.7.
0.的gcc有linuxaout的。
linuxelf 已经过时了。通常这是指2.6.3版的gcc,而且这个版本也可以用来产生
ELF的可执行档。要注意的是,gcc 2.6.3版在产生ELF程式码时会有bugs,所以如
果你目前用的恰好是这个版本,建议你赶快升级。
2.7.2 版本的序号。
所以,总结起来,我有2.7.2版的gcc,可以产生ELF格式的程式码。就这麽简单,
惊讶吧!eh?


3.2 东东装好後都到哪儿去了?
如果安装gcc时没有仔细的看著萤幕,或者你是从一个完整的发行系统里把gcc单独
抓出来安装的话,那麽也许你会想知道到底这些东东装好後是住在整个档案系统的
那些地方。几个重点如下:


/usr/lib/gcc-lib/target/version/ (与子目录)大部份的编译器就是住在这个
地方的。在这儿有可执行的程式,实际在做编译的工作;另外,还有一些特定版本
的程式库与标头档等也会储存在此。
/usr/bin/gcc 指的是编译器的驱动程式---也就是你实际在命令列(command
line)上执行的程式。这个目录可供各种版本的gcc使用,只要你用不同的编译器目
录(如上所述)来安装就可以了。要知道内定的版本是那一个,在shell提示符号
下打gcc -v。要是想强迫执行某个版本,就换打gcc -V version。例如:

# 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

/usr/target/(bin|lib|include)/ 如果你装了数种的目标物件,例如a.out与elf
,或是某一种的交叉编译器(cross-compiler)等等,那些属於非主流目标物件(
non-native target(s))的程式库,binutils(as、ld等等)工具与标头档等都可
以在这儿找到。即使你只安装了一种gcc,还是可以在这儿找到这些原本就是替它
们准备的东东。如果不是在这儿,那麽就应该是在/usr/(bin|lib|include)了。

/lib/,/usr/lib 与其它的目录等都是主流系统(native-system)的程式馆目录
。许多的应用程式都会用到/lib/cpp,因此你也需要它---作法上,不是从
/usr/lib/gcc-lib/target/version/ 目录里拷贝,就是弄个符号连结(symlink)
指向那儿。 [译者注:所谓的native,是指目前你的系统是以a.out或elf的格式为
主,或者内定的gcc是哪一种版本等等。native的意思是‘本土的’、‘本国的’
与‘天生的’……等等;当你拿到一片CD-ROM重头至尾将Linux安装完成,让
Linux出生,成为你个人特色浓厚的作业平台後,如果再加装一些不一样的目标物
件,自然就有‘本土’与‘外省’( 无关政治),‘本国’与‘外国’、‘天生
’与‘人为’等等的区别,同时也含有内定(default)的意思在。假若再附加上
你个人的价值观判断和喜好,我想用主流(native)与非主流(non-native)来翻
译应该还算恰当。]

3.3 标头档ㄋㄟ?标头档ㄋㄟ?
假如把你自行安装在/usr/local/include目录底下的标头档排除在外的话,Linux
还有另外3种主要的标头档:


/usr/include/与其子目录底下的标头档,大部份都是由H.J.Lu发展的libc套件
(libc binary package)所提供的。我会只说‘大部份’的原因,是因为你可能有
其它来源的标头档(像是curses与dbm程式库等等)摆在这儿;尤其是,如果你现
在用的是最新的libc发行系统的话(新版本不像旧版那样,已经不再支援curses或
dbm了。),那东东之多是人人为之咋舌的! [译者注:libc binary package意指
以二进位形式(machine code)储存之套件,并非原始码(text),若要以中文全称
译出,则成‘libc二进位档套件’,似有聱牙之嫌,故略去binary,以libc套件通
称。]
在核心原始码的发行系统内(kernel source distribution) ,
/usr/include/linux 与 /usr/include/asm (里头有这些档案:<linux/*.h> 与
 <asm/*.h>)应该有符号连结(symbolic links)可以连结至目录
linux/include/linux 与 linux/include/asm。如果你有鸿鹄之志的话,安装这些
东东後,就不应该只是拿来编译核心(kernel)而已。 把原始码解压缩(
unpacking)後,可能你也会发现,需要在核心的目录(kernel directory)底下
做make config的动作。很多的档案都会依赖<linux/autoconf.h>的帮忙,可是这
个档案却有可能因版本不同而不存在。若干核心版本里,asm就只是它自己的一个
符号连结,仅仅是在make config时才建立出来而已。 [译者注:原文提及
autoconf.h时是‘Many files depend on <linux/autoconf.h>,which
otherwise may not exist,*’。此处之otherwise之词性应为形容词(adj),指‘
另一情况’、‘另一种’、‘不同的’之意,将原文形容词子句拆开来应为:
(i) Many files depend on <linux/autoconf.h>. (ii)<linux/autoconf.h> of
other condition may not exist. 与下一句互相比对,此处应同指在不同版本之
情况下。] 所以,当你在目录/usr/src/linux底下,解开核心的程式码时,就照著
下面指示的做吧!

$ cd /usr/src/linux
$ su
# make config
(回答接下来的问题。通常回答得正不正确并不重要,除非你打算继续□造核心。
)
# cd /usr/include
# ln -s ../src/linux/include/linux .
# ln -s ../src/linux/include/asm .

诸如<float.h>、<limits.h>、<varargs.h>、<stdarg.h> 与<stddef.h>之类的档
案,会随著不同的编译器版本而异,属於你‘个人的’档案,可以在
/usr/lib/gcc-lib/i486-box-linux/2.7.2/include/与其它相类似(相同)的目录
名称的地方找到。 11/11/97译 5/14/98修正

3.4 建立交叉编译器(Building cross compilers)
将Linux当作标的作业平台(target platform)
假设你已经拿到gcc的原始码,通常你只要依循INSTALL档的指示便可完成一切的设
定。 make後面再接configure --target=i486-linux --host=XXX on platform
XXX,就能帮你变把戏了。要注意的是,你会需要Linux还有核心的标头档;同时也
需要建立交叉组译器(cross assembler)与交叉连结器(cross linker),来源是
ftp://tsx-11.mit.edu/pub/linux/packages/GCC/。


Linux当成原始作业平台(source platform)而MSDOS作为标的作业平台
Ugh。很明显的,这个大概需要用到套件“emx”或是延伸套件“go”。请自行去
ftp://sunsite.unc.edu/pub/Linux/devel/msdos看看。我并没有测试过这些个东
西,所以没有办法保证什麽。

--
                ╔═══════════════════╗
                ║  欢迎来  深圳大学荔园晨风  Linux 版  ║
                ╚═══════════════════╝

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.1.119]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店