📄 00000003.htm
字号:
标档」,这样一来,当 我们一去make all时,由於all是由progs所构成,因此会 <BR>跳到第18行去,而第18行 的$(PROGS)是cshow,为做本make最终产生的档案,为一 <BR>可执行档,第20行的cshow.o 便是最终的目的档,那cshow和cshow.o又是如何产生 <BR>的?这和第22、25、28行有关, 这几行是利用下一节的「字尾规则」,稍後再论 <BR>。 <BR> <BR> 范例一中第32和35行是makefile中另外常见的规则,其目的不是「产生」目的 <BR>档 ,而是去「删除」某些档案,35行的动作包含在32之中,35行的目的是删除可 <BR>执行档 (rm -f $(PROGS));而32行会先执行35行的动作,再去删除*.o和*~的档 <BR>;若是我 们更新了一大群source的部份时,最好要make clean,否则仍会发生. <BR>o和其source 间版本不同的错误。 <BR> <BR>字尾规则 <BR> 通常我们会以特定的字尾来表示不同档案的种类,如.c 便是代表c语言的原始 <BR>档 , 而.o 通常代表此档经特定的编译程式所产生的目的档,由於在同一系统中 <BR>同一语 言原始档的编译程式皆相同,我们便可为这些原始档定出一定的编译方式 <BR>,这便是字 尾规则(Suffix rule)的用意所在,字尾规则通常是在於定义 <BR>Makefile的内建依存 规则;字尾规则的语法如下: <BR> <BR>.字尾一.字尾二: <BR> 命令 <BR> <BR> 其中的意义是字尾一的档案经「命令」的作用後产生字尾二的档案,如范例一 <BR>中 的第22和23行: <BR> <BR>22 .c.o: <BR>23 $(CC) $(CFLAGS) -c -o $*.o $< <BR> 这便是一个字尾规则,22阐述.c和.o的关系,23行便是描述.o如何由.c产生, <BR>其 中$*和$<请参考表二的说明,例如有个test.c,在23行展开时便成为: <BR> <BR> gcc -fomit-frame-pointer -O2 -s -c -o test.o test.c <BR> <BR> 而且因为$<的关系,若是test.o的时间比test.c还晚,则不进行编译的动作, <BR>这 项特性能节省编译的时间,避免不必要的动作,因为有这项特性,我们更须注 <BR>意一件 事:当读者ftp下一个更新的版本至旧有的程式项中时,若是须要重新编译 <BR>,在make 之前最好先make clean,免得同一档名的.o虽比.c新,但真正的内容版 <BR>本却比.c旧。 <BR> <BR> 「空字尾」规则是字尾规则的特殊形态,所产生的档案便是依存档去掉字尾的 <BR>情 况,一般情况中用於产生最後的可执行档,如范例一中的第28、29及30行,第 <BR>29行的 实际作用,便是将.o档连结成最後的档案,第30行再将其权限改变成可执 <BR>行的形式。 <BR> <BR> 第42行也是「空字尾」规则,主要目的在於产生.depend档,在.depend档中记 <BR>载 各依存档彼此的关系,make在执行时会参考到此档。 <BR> <BR>多档案程式 <BR> make有一个很方便的特性是对於多档案的程式,能作完善的管理。所谓的多档 <BR>案 程式,就是程式本身由多个.c所组成,只要在makefile中定好档案间的关系, <BR>接下来 就无需挂虑到底那一档需要编译了。对於多档案程式,一般的方式是保留 <BR>个别对应到 .c的.o档,连结时再把各个.o连在一起,这个方式的好处在於当修改 <BR>了其中之一的.c 後,make便只需重新编译修改过的即可,真是省时又方便,接下 <BR>来我们就利用图一的 这个程式来说明。 <BR> <BR>图一: <BR> <BR>main <BR>| <BR>--------------+------------- <BR>| | | <BR>| | | <BR>main.o input.o output.o <BR>| | | <BR>| | | <BR>main.c input.c output.c <BR> <BR> 图一是main这个程式的结构,主要由main.o、input.o和output.o组成, <BR>main.o、 input.o和output.o各自依存於如图的叁个.c档,这般的档案结构是很常 <BR>见的方式,对 於如此的多档案程式,我们只需修改范例一中的第13行: <BR> <BR> PROGS_O = main.o input.o output.o <BR> <BR> 如此一来,make便能自动的决定何时需要、何时不需重新作编译的动作。 <BR> <BR>核心重组 <BR> Linux本身便附有核心程式的原始码,这使得使用者可以很方便的"制造"出一 <BR>个 核心程式出来,尤其是自行更改或是向外取得某部份原始程式後、或是想要更 <BR>改对一 些设备的支援时,便是重编核心的时机,"重编核心"好像是一件多麽不同 <BR>的事,其实 真正的动作也只是再去编译、连结出一个程式,而且所编连出的核心 <BR>,不管是由lilo 或是loadlin.exe所启动,在编译的过程中原来的核心程式并未先 <BR>删除,唯有各部份 的程式都编好後才去组成核心程式,所以重编核心这件事是 <BR>Linux爱好者所不可放弃 的一件事,因为每台PC的设备并不相同,核心依实际的情 <BR>况去芜存菁後,才能发挥最 大的功用。 <BR> <BR> 当安装了必要的套件後,Linux的核心原始程式放在/usr/src/linux之中,这 <BR>儿 linux是一个连结档,连结到不同的版本子目录,要重编核心,需以root签入或 <BR>是以 su命令转成root身份,当成为root後,只需键入cd ~/linux便可进入上述的 <BR>原始程 式子目录内;自十几年前的CP/M作业系统开始,至今天的DOS、OS/2、 <BR>NextStep至於 未来的Windows或是NT,我们一般的使用者很难一窥作业系统的真正 <BR>面目,更遑论去 自行修改了,但在此我们见到的是一套有着多人、多工、网路支 <BR>援等完整的作业系统 ,同时又紧紧的配合PC的硬体,以PC的观点来发展,这样的 <BR>作业系统,怎不令人窝心 呢?而且程式码完全公开,是研究作业系统不可多得的 <BR>典范,就是此原因,Linux还 在不断发展中,更重要的一点是使用者再也不是一个 <BR>旁观者,若是发现那儿有bug, 更可提笔上阵,自行创作一番。 <BR> <BR> 在原始程式子目录下,有许多不同的子目录,如BOOT、FS、INIT等,每个子目 <BR>录 有着不同功能的source,如FS便是管理File System的部份,对作业系统有兴 <BR>趣的读 者我们以後再来专论;由於这儿的的Makefile太过冗长,因此笔者不引述 <BR>,若是看不 太懂Makefile的一些Shell Script指令,可以参考陈仁和所着「 <BR>Linux管理与操作手 册--Shell的使用」。 <BR> <BR> 接下来我们便要实际的穿越编译核心,第一步便是以root的身份进入source子 <BR>目 录,接下来通常是make clean,作用是删除旧的.o各核心程式及相关档案,若 <BR>是之 前并没更改source,此步骤当然可省略;接下来是更改设定,这也是要重编 <BR>核心的原 因之一,键入make config後,便会询问一连串的问题,这些问题便是 <BR>config.in的 内容. <BR> <BR> 整体设定过程可以看得出有些杂乱无章,这是因为Linux所支援的是因应硬体 <BR>发 展的结果,所以看得出是叠床架屋的样子,config的结果是设定一些变数以供 <BR>make时 使用,在Makefile中可以见到若某些变数存在时便包含入对应的子目录, <BR>在编译时就 会一同处理。 <BR> <BR> 设定完成後,接下来是建立.depend档,此档记录真正要组成核心的档案间之 <BR>依 存关系,而make dep或make depend都可达到相同的目的。 <BR> <BR> 再过去Linux是由lilo所输入解压缩和启动的,所以直接键入make zlilo便可 <BR>, 此时便开始约十到二十分钟的编译,若是想继续工作,可切换到别的console去 <BR>,或 者是键入: <BR> <BR> make zlilo & 1>/dev/null 2>/dev/null <BR> <BR>将工作送至背景,将讯息抑制。 <BR> <BR> 除了lilo,我们也可由A磁碟机来启动,这时便需以make zdisk来将核心送到 <BR>开 机片上;在光碟月刊八月号上介绍了另一个由DOS来启动的程式loadlin.exe, <BR>而且也 出现了umsdos的安装方式,这对使用者来说是莫大的方便,因为在过去想 <BR>安装Linux 的人来说,要重割硬碟是件很不便的事,而且事先旧有的资料要如何处 <BR>理也是很伤脑 筋,这使得想认识Linux的人裹足不前,现在不利因素皆已去除,方 <BR>便大门已开,读 者可利用八月号的光碟直接安装(不过请先取得Q和U套件),就把 <BR>Linux直接装入DOS的 linux子目录,再用开机片开机,对於原来的程式或资料不会 <BR>造成损坏,就能使Linux 动起来,若是再利用多重开机和loadlin.exe,在一开机 <BR>就能选择作业系统,是再也 方便不过的事了,如果是利用这种方式开机者,重编 <BR>核心要利用make zImage来作, 并在组译完成後,将zImage拷到loadlin.exe能读 <BR>到的地方,如/dev/hda0/loadlin( Linux和DOS不在同一分割中)或 <BR>/DOS/loadlin(使用umsdos),记得要cp过去,不然 重组徒然浪费时间而已。 <BR> <BR> Linux是一个极新的领域,其免费、强大的特性,加上源源不断的支援,与其 <BR>它 作业系统比较起来丝毫不逊色。多人、多工早就是她的基本功能,图型介面漂 <BR>亮又好 用,但Linux并不是完美无瑕,当某天抱怨完不便和缺点後,便是写个程式 <BR>「修理」一番的最好时机。 <BR> <BR>-- <BR> <BR>※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.116.64.6] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -