《笨兔兔的故事——带你了解Ubuntu,了解Linux》
第19节

作者: 懒蜗牛Gentoo
收藏本书TXT下载
  编译又是怎么个意思呢?最初的图纸,也就是没有经过预处理的源代码,是人写的,一般懂相关语言(比如C语言)的人都能看懂。预处理之后的文件,虽然不那么直观了(TOTAL_NUMBER看着是不是比18353226直观?光写个18353226还以为是谁的QQ号呢),但终究只是做了下替换,还是人类可以看懂的。这样的代码经过gcc的编译之后,就不是普通人类可以看懂的源代码了,而是只有终极牛人才能读懂的汇编代码。汇编代码就比较贴近底层的机器码了,里面描述的都是一些基本的操作。打个比方吧,就比如描述切菜的过程,用c语言描述出来就像是“将黄瓜切片”,这么一句就搞定了。要是用汇编,那就是:左手扶住黄瓜,右手拿起刀,移动刀到黄瓜顶部,刀落下,到抬起,刀向黄瓜后部移动4毫米,刀落下,刀抬起,放下刀,走出厨房,走进卧室,找到创可贴,贴在左手食指上………… 好吧,总之,汇编是一种面向机器的,很复杂的程序设计语言。gcc的任务就是把c语言的源代码转换成贴近机器语言的汇编代码,为下一步as的工作做好准备。

  as拿到汇编代码后,对这样的代码再进行处理,得到真正的机器码,这个过程,也叫汇编。汇编之前的汇编代码是终极牛人能看的,那么机器码压根就不是人看的。汇编程序中至少还有些操作的助记符,比如什么add啊,mov啊之类的。寄存器也是有名字的,比如叫A,叫R1之类的。但是到了机器码,这些都没有了,这些都换成了各种各样的数字,一句人话都没有了。还说且黄瓜的事,要是用机器码来描述,那就相当于说:用32号设备扶住87号物体,24号设备拿起126号物体,移动126号物体到87号物体顶部,做2635号动作,再做2636号动作……

  好了,现在终于得到机器码了,机器码按说就是可以执行的代码了,但是,这时候的程序还是不能直接执行的,为什么?因为还有ld没有出场呢,他的工作叫:连接。光是一段机器码扔给机器去执行,机器照样摸不着头脑。而且,很多时候,一个程序不是一段机器码,而是由很多段机器码组成的,这些机器码分别存成很多的.o文件,这时候就需要ld出场了。ld负责把这些机器码组装起来,并且写明了各段代码的地址,从哪里开始执行之类的。就像我们造个机器人,脑袋啦,胳膊啦,大腿啦之类的都做好了,ld就是负责组装的。就算只有一段机器码,也就是只有一个.o文件,也要由ld进行一下处理,闹明白哪是头哪是尾,才能开始运行。


日期:2009-10-14 15:08:01

  (52) 规划
  说的这么热闹,其实包工队的工作过程对主人来说并不关心,他只跟gcc打交道,只管把源码交给他就好了,gcc会领导小弟们干活,最终回馈给主人一个可执行的二进制文件。中间过程中的那些个文件,主人压根也看不到。包工队的同志们,都紧密的团结在以gcc为核心的组织周围,坚持编译四步原则,坚持代码开放,为把Linux建成为软件丰富,运行稳定,老少皆宜,人人必备的操作系统而努力奋斗。

  不过,包工队毕竟只是个包工队,你要是盖个小厨房,垒个猪圈啥的,直接找他们盖就没问题了。你要是想建个CBD商圈,里边什么银行啊,商场啊,写字楼啊,炸油条的啊,卖臭豆腐的啊,修理自行车的……等等一应俱全。这么大的一个工程,你光叫个包工队来就搞不定了。得有人进行合理的统筹规划,设计施工方案,然后再让包工队去具体施工。这个规划的人就是——make

  make也是一个程序,像上边说的一样,他就是负责控制整个施工过程的(也就是编译过程啊)。对于比较小的程序,像主人的rubbish系列,也就一两个.c文件,那根本用不着make出马,直接gcc包工队去编译就行了,因为源文件的结构关系不是很复杂。可是要稍大一点的程序,像狐狸妹妹啊,皮筋老弟啊,星爷啊,基本上所有常用的软件吧,都足够复杂到需要make来对编译过程进行管理。当软件大了,编译的时候就不能是简单的把一大堆.c的源文件统统一次性编译成一个二进制文件那么简单的事情了。那么做的话很费时费力,比如说,有一个软件,源码由20个.c文件组成,分别是1.c,2,c,3.c…………20.c。这20个文件一股脑都交由gcc包工队,他们就会把这些文件都打开来,拼在一起,一次性的编译成一个叫做big的二进制文件。这时候发现了一些问题,需要修改3.c文件,修改之后得重新编译啊,那么gcc包工队又得把这20个文件全都打开,拼在一起,再从头到尾编译一次。而其实只有3.c文件修改了,完全不必这么兴师动众。那应该怎么做呢?一般的都是把这 20个文件分别编译成.o文件,比如编译成1.o,2.o,3.o……20.o,这样20个.o文件,然后再由ld把这些.o文件拼在一起,成为一个叫做big的二进制可执行文件。那么当要修改3.c的时候,只需要让gcc包工队重新将3.c编译为3.o,再让ld重新连接一遍就好了,省去了很多时间。而这个过程,如果让主人自己管理的话,会很麻烦,毕竟他们人类的大脑也不是那么靠谱的,搞着搞着就乱了。于是,make义无反顾的挑起了这个重要的担子。当然make也不能靠凭空的想象就来指导包工队干活,什么事情总得有个规划不是。make也需要一份施工的规划书,这分规划书就是Makefile。

  Makefile,顾名思义,就是make用的file。这就相当于一份施工的规划,上面写着整个工程分为几个模块,先用哪几个文件编译成一个什么什么.o,再用哪几个文件编译出一个.o,再怎么怎么一连接,最后得到编译好的二进制程序。make就根据这份文件来指导gcc他们进行施工。当有某个.c文件被后改之后,make能够根据文件的修改时间智能的判断出哪些模块需要重新编译,重新连接,然后就去让gcc重新编译那些改过的文件,最终生成新的二进制程序。有了make和Makefile,就省去了主人敲一大堆编译命令的烦恼,只要敲一个make,其他的,就交给make去做吧,他办事,你放心。


日期:2009-10-16 16:14:13

  (53) 因地制宜
  好了,现在我们知道gcc包工队听make总管的指挥,make总管根据Makefile安排工作。这样,当得到一个软件源代码之后,如果想把这一堆源码编译出二进制的程序,只要执行一下make就好了。执行之后make会在当前目录下寻找Makefile,然后按照上面写的方案,指挥包工队:先在这里,盖一个防弹防爆防坦克防航母的厕所,然后包工队开始施工;盖完了make又发话,厕所边上盖个不带洗手间的饭馆,然后包工队又去盖饭馆;完了之后make再命令,饭馆边上再盖个防空袭防地震防海啸的厕所……就这样直到最终完成任务。

  然而事情有时候并不是那么简单,没准make命令下达之后,包工队回来报告:这鸟不拉屎的破地方连块厚点的钢板都没有怎么防坦克啊,再说一个厕所整那么结实干嘛。这时候make拿着那份Makefile也只能无奈的摇摇头,然后报告主人,说这厕所搞不定。如果像这样一上来就搞不定还好,要是都盖了一半了,甚至所有其他建筑都盖好了就剩最后这两个厕所盖不了就麻烦了,你说放弃吧,之前盖的都浪费了,你说凑合用吧,广大人民群众还不得憋死?这个时候,就需要一名可行性分析师。

  这个分析师就是configure,不过他跟make不一样,他并不是常驻在我这里的软件,而是每个源码发行的软件自带的一个脚本。简单点说,make只有一个,configure则是每个软件有自己的configure。有了configure之后,编译软件的步骤就多了一步——./configure 让这个分析师首先开始工作,他会检查当地的情况,有什么材料啊,什么库啊,什么编译器啊之类的,都检查一遍,然后因地制宜的设计一份Makefile。如果有足够的钢材,那就建防坦克的厕所,如果没有,那就不防坦克了,但好歹得有个厕所。如果这地方连砖头都不够,那就说明这个工程所依赖的东西得不到满足,那就告诉主人,盖不了。configure经过调查后,如果可以施工,会出一份Makefile,注意,一般configure调查前,目录下是没有Makefile的(当然,没有configure的情况另说),如果无法施工,会报告缺少什么东西,让主人自己想办法去。

  好,这就是我们常见的源代码软件编译的过程configure先调查,没问题了,出Makefile,make去指导施工,施工结束后,一切都造好了,最后一步就是把所有东西该放哪的放哪,那就是make install

日期:2009-10-22 15:54:07

  (54) Richard
请按 Ctrl+D 将本页加入书签
提意见或您需要哪些图书的全集整理?
上一节目录下一节
【网站提示】 读者如发现作品内容与法律抵触之处,请向本站举报。 非常感谢您对易读的支持!举报
© CopyRight 2011 yiread.com 易读所有作品由自动化设备收集于互联网.作品各种权益与责任归原作者所有.