第一回    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
g++    -c    second.cpp

利用这些命令,编译器生成两个新的目标代码文件first.o和second.o,放在工作目录中。文件包含从这两个源代码文件生成的目标代码文件,但还不能运行,因为它们都没有main()函数。要想生成可执行文件,还需下面的要诀来配合:

g++    -c    main.cpp
g++    -o    runme    main.o     first.o    second.o

这样就生成了可执行文件runme,借助此文件就可发挥出武功的威力来了。