第一回 Unix开国创业 诸侯割据各据一方 Linux中兴话说天下大事,纷纭变幻,世事多扰。Unix王国自从贝尔兄开基立业以来,经历了开国之初的。。。 此一段讲述Unix的开国历史。介绍几位开国元勋,如C语言等。 此一段讲述Unix的发展史。并展开出Unix的四分五裂的诸侯割据局面。 此一段讲述Unix的中兴史,讲出一位开明的君主Linux,我们的故事就是围绕着Linux而展开。 Linux乃是皇族的一支没落的世家,自Unix王国四分五裂,几个皇族的正统血脉打的不可开交的时候,Linux就降生在一个不起眼的平民家庭,他从小就在平民当中长大,吃百家饭, 第二回话说GCC是何许人也,此君来自GNU山寨,其祖上是跟随Unix一起开疆扩土的功臣之一。至于那个山寨的来历,说书人一张嘴表不了两家话,待以后再作交待。GCC出自名将之家,颇有祖上之遗风,十八般武艺样样精通,真可谓是将门之后,青出于蓝而胜于蓝。这GCC在本套书中是个举足轻重的人物,因而有必要对其作个详细的交待。 GCC自小时起就表现出非凡的“语言”天赋,手下的“编译”兵器天下闻名。其看家本领是“C语言”,借助于“C语言”的威力,他打遍天下无敌手,Linux的天下就是依靠他的“C语言”一手开创的,由此可知其在Linux王国中的地位了。该武功在本套书中的武功榜中排名第一。 GCC的本领之二便是“C++语言”,这套本领可是GCC学自一世外高人的了不起的武功,该武功在本套书中的武功榜中排名第二,它是从“C语言”中演化出的另一套高明的武功,虽比及“C语言”还略有些稚嫩,但其别出心裁的武功境界却是“C语言”难以企及的。可以这样说,“C语言”就象降龙十八掌一样势大力沉,开国打江山之时无往而不利,但是要用它来治理国家、规划百年大计就有些捉襟见肘。而“C++语言”却在以文治国,规划蓝图方面甚为擅长,本套书就是着重讲GCC如何使用“C++语言”武功及此套武功的精华所在。 先来表一表GCC如何“编译”这“C++语言”。话说了半天,“编译”乃是使用“C++语言”这门武功所必备的兵器,要想充分发挥出“C++语言”语言的威力,首先需要将兵器之特性了解的清清楚楚。 好,话不多说,转入正题,且看一看GCC是如何使用这兵器的。 此兵器分为四段,分别叫做:“预处理器cpp”,“编译器egcs”,“汇编器as”,“链接器ld”。“预处理器cpp”可充分展开“C++语言”中#include和宏之类“指令”之威力;“编译器egcs”则是充分发挥出了“C++语言”之精要,将C++语句变成汇编语句;“汇编器as”则将汇编语句变成机器代码——一种只有计算机才识别的指令;“链接器ld”合并机器代码文件和库文件(常用的C++类库的机器代码),生成了江湖上谈虎色变的真正的威力。这四段必须联合在一起才能发挥出该兵器的威力,缺少任一个都不行。要想充分使出此兵器,还需要很多要诀,如: 要想看“预处理器cpp”将“C++语言”变成了什么,就可以用此要诀:gcc -E 要想看“编译器egcs”将“C++语言”变成了什么,就可以用此要诀:gcc -S 要想看“汇编器ld”将“C++语言”变成了什么,就可以用此要诀:gcc -C。但要注意当编译没有没有main()的模块(也就是只有被调用函数的实现)时,必须使用-C要诀,因而此要诀是使用最多的一个。 这-E,-S,-C便是GCC使用这“编译”兵器的要诀之一。 要想看武功使出时的威力,也就是执行编译过的程序,就需要指定可执行程序的名字,在Unix世界中,当不指定可执行程序名时,GCC用的缺省名为a.out,但是当使用这个要诀:gcc -o 可执行文件名,此后就会将编译成功的可执行文件以此文件名形式出现,那么使用此文件名也就可以发挥出武功的威力了。 在编译“C++语言”时,常会出现使用时的警告信息,那么为了要练成神功,就需要将增加编译器的的警告级以找出并纠正更微小的缺陷,一般刚刚学习时可能出现更多的错误,因此要用较低的警告级。此要诀即为:gcc -Wall -W。但练到高级时,则可使用要诀gcc -w来关闭所有警告。 要想检查“编译”过程中间阶段发出的所有命令,用要诀:gcc -v(v即英文单词verbose,冗长之意)。此要诀一用,即可显示出兵器使用时的四个阶段所分别使用的各个命令,还可以显示四阶段期间发生的所有文件引用。一般来说,如果不知道武功为何使用错误时(即程序为什么无法编译),可以使用此要诀找出原因。 在兵器的“预处理器cpp”段,需要对程序中的#include“头文件名”查找头文件,但有时在武功不到家时很容易找不到,因此,用要诀:gcc -I目录名,就可以在指定的此目录中寻找头文件了。 下面我们就看一看这些要诀联合使用的威力: 假设源程序存放在三个源代码文件(first.cpp,second.cpp和main.cpp)中,只有main.cpp有main()函数,其他文件包含这个程序使用的函数。可以用要诀-c编译first.cpp和second.cpp源代码文件: g++ -c first.cpp 利用这些命令,编译器生成两个新的目标代码文件first.o和second.o,放在工作目录中。文件包含从这两个源代码文件生成的目标代码文件,但还不能运行,因为它们都没有main()函数。要想生成可执行文件,还需下面的要诀来配合: g++ -c main.cpp 这样就生成了可执行文件runme,借助此文件就可发挥出武功的威力来了。 |