GCC技術(shù)參考大全_第1頁(yè)
GCC技術(shù)參考大全_第2頁(yè)
GCC技術(shù)參考大全_第3頁(yè)
GCC技術(shù)參考大全_第4頁(yè)
GCC技術(shù)參考大全_第5頁(yè)
已閱讀5頁(yè),還剩85頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、GCC技術(shù)參考大全GCC ( GNU Compiler Collection , GNU 編譯程序集合)是最重要的開放源碼軟件。事實(shí)上,其他所有開放源碼軟件都在某種層次上依賴于它。甚至其他語(yǔ)言,例如 Perl 和 Python ,都是由 C 語(yǔ)言開發(fā)的,由 GNU 編譯程序編譯的。 GCC 編譯程序的歷史很有趣,遠(yuǎn)遠(yuǎn)不止是一個(gè)時(shí)間和事件的列表。這個(gè)軟件對(duì)于整個(gè)自由軟件運(yùn)動(dòng)而言具有根本性的意義。事實(shí)上,如果沒有它或類似的軟件,就不可能有自由軟件運(yùn)動(dòng)。 GCC 為 Linux 的出現(xiàn)提供了可能性。 本章概要介紹了 GCC 編譯程序集合,以及它的相關(guān)工具。這些編譯中使用的工具可以跟蹤源代碼、編輯文件

2、、控制編譯過程、提供調(diào)試信息。 本章介紹的內(nèi)容包括一個(gè)列表以及對(duì)處理過程的一些描述。該列表描述了組成編譯程序集合的文件和程序。之后介紹了將源文件變成可連接和可執(zhí)行程序的步驟。 1.1 GNU GCC 是 GNU 項(xiàng)目的一個(gè)產(chǎn)品。該項(xiàng)目始于 1984 年,目標(biāo)是以自由軟件的形式開發(fā)一個(gè)完整的類 UNIX 的操作系統(tǒng)。像所有這種規(guī)模的軟件一樣, GNU 項(xiàng)目也經(jīng)歷了一些波折,但目標(biāo)最終還是實(shí)現(xiàn)了。實(shí)際上現(xiàn)在一個(gè)功能完備的類 UNIX 操作系統(tǒng) Linux ,已經(jīng)在世界上廣為流傳了,并被不計(jì)其數(shù)的公司、政府和個(gè)人成功應(yīng)用。而該系統(tǒng)及其所有工具和應(yīng)用都是基于 GCC 的。 成千上萬的程序員都在為各種

3、GNU 項(xiàng)目(及其他自由軟件項(xiàng)目)作貢獻(xiàn),而實(shí)際上所有這些都在某種程度上依賴于 GCC 。     1.2 測(cè)量編譯程序 我 們可以在編譯的速度、生成代碼的速度,以及生成代碼的尺寸上對(duì)編譯程序進(jìn)行比較。但是很難進(jìn)行更深入的比較,因?yàn)殡m然可以得出一些數(shù)字,卻很難對(duì)這些數(shù)字 賦予某種實(shí)際意義。例如,源文件的數(shù)目( make 程序的描述文件、配置文件、頭文件、可執(zhí)行代碼,等等)顯示共有超過 15 000 個(gè)的各種文件。源文件編譯成的目標(biāo)文件、庫(kù)和可執(zhí)行程序的數(shù)目成千增長(zhǎng)。代碼的行數(shù)(這 15 000 多個(gè)文件的行數(shù))超過 3 700 000 。從任何標(biāo)準(zhǔn)來看,這都是一個(gè)大程序。

4、代碼的質(zhì)量參差不齊因?yàn)橛腥绱酥嗟某绦騿T參與開發(fā)過程,而且代碼注釋中也 內(nèi)嵌了大量的內(nèi)部文檔,所以文檔的質(zhì)量和數(shù)量也有變化。所幸的是,有大量的程序員正在努力地提高代碼和注釋的質(zhì)量。而且,也不是必須閱讀內(nèi)嵌的注釋才能使 用編譯程序。但如果要對(duì)編譯程序做些工作,你會(huì)發(fā)現(xiàn)還是要花些時(shí)間閱讀代碼中內(nèi)嵌的注釋。 測(cè)量編譯程序的質(zhì)量的惟一方 法是詢問它的用戶。全世界的用戶數(shù)目很難估計(jì)(自由軟件就有這樣的特性),但一定是巨大的。它被用于某些版本的 UNIX ,這些 UNIX 自帶系統(tǒng)供應(yīng)商提供的本地編譯程序。事實(shí)上,我知道一個(gè)很大的 UNIX 供應(yīng)商就在自己內(nèi)部的項(xiàng)目中使用 GCC ,即便該供應(yīng)商也有自己的

5、很優(yōu)秀的編譯程序。 GCC 編譯程序從未停止過改進(jìn)。如同第 2 章所描述的,通過下載某個(gè)特定版本的源代碼便可安裝已經(jīng)發(fā)布的某個(gè)版本的 GCC ,也可以直接下載最新的(或測(cè)試中的)版本。測(cè)試中的版本時(shí)刻都在改進(jìn)。有些更正是修改已有的 bug ,還有一些是為了加入新的語(yǔ)言和功能,還有一些是為了去掉某些不再應(yīng)用的功能。如果你曾經(jīng)使用過 GCC ,隔一段時(shí)間再用最新版,一定會(huì)發(fā)現(xiàn)一些變化。 1.3 命令行選項(xiàng) 每個(gè)命令行選項(xiàng)都以一個(gè)或一對(duì)連字號(hào)開始。例如,下面的命令行會(huì)編譯 ANSI 標(biāo)準(zhǔn) C 程序 muxit.c ,再產(chǎn)生一個(gè)非連接的目標(biāo)文件 muxit.o : gcc -ansi -c muxit

6、.c -o muxit.o 這些單字母選項(xiàng)后面跟著的名字可以和字母之間留有空格。例如,選項(xiàng) -omuxit.o 和 -o muxit.o 是一樣的。 下面的命令用 -v 代表詳細(xì)說明,而 -help 會(huì)打印可用的選項(xiàng),而且會(huì)打印一個(gè)詳細(xì)的包括所有命令行選項(xiàng)的列表,包括那些適用于特定語(yǔ)言的選項(xiàng)。 gcc -v -help 有可能構(gòu)造一些實(shí)際不做任何事情的命令行。例如,下面的命令將目標(biāo)文件交給編譯程序,然后指定 -c 選項(xiàng)防止激活連接程序: gcc -c brookm.o 所有的命令行選項(xiàng)大致可分為三類: · 指定語(yǔ)言 GCC 編譯程序有能力編譯多種語(yǔ)言,有些選項(xiàng)只可用于其中的一兩種。例

7、如, -C89 選項(xiàng)只應(yīng)用于 C 語(yǔ)言,指定適用于 1989 年的標(biāo)準(zhǔn)。 · 指定平臺(tái) GCC 編譯程序可以為多種平臺(tái)生成目標(biāo)代碼,而有些選項(xiàng)只能應(yīng)用于為某個(gè)指定平臺(tái)生成代碼。例如,如果輸出平臺(tái)是 Intel 386 ,那么 -fp-ret-in-387 選項(xiàng)可用來指出要將函數(shù)調(diào)用返回的浮點(diǎn)數(shù)保存在硬件的浮點(diǎn)寄存器中。 · 普適 很多選項(xiàng)對(duì)所有語(yǔ)言和平臺(tái)都適用。例如, -O 選項(xiàng)指示編譯程序要優(yōu)化輸出代碼。 使用編譯程序不知道的選項(xiàng)總會(huì)產(chǎn)生出錯(cuò)消息。使用目標(biāo)平臺(tái)不適用的選項(xiàng)也會(huì)產(chǎn)生出錯(cuò)消息。 gcc 程序能夠自己處理所有已知的選項(xiàng),而將未知其他選項(xiàng)傳遞下去來編譯指定語(yǔ)言。如

8、果傳遞下去的選項(xiàng)對(duì)指定語(yǔ)言的處理器是未知的,就會(huì)報(bào)錯(cuò)。 選項(xiàng)可以指示 gcc 只執(zhí)行特定的操作(例如連接或預(yù)處理)或什么都不做,這就是說有些標(biāo)志沒有什么特殊目的。除非用 -W 選項(xiàng)產(chǎn)生特殊警告,否則這些標(biāo)志可被識(shí)別但不采取任何動(dòng)作,只簡(jiǎn)單忽略而已。1.4 平臺(tái) GCC 編譯程序集合可以在很多平臺(tái)上運(yùn)行。平臺(tái)是指特定計(jì)算機(jī)芯片及其運(yùn)行的操作系統(tǒng)的組合。 盡管 GCC 已經(jīng)被移植到數(shù)以千計(jì)的硬件 / 軟件的組合上,但只有一些基本平臺(tái)可以用來測(cè)試發(fā)布的正確性。這些列在表 1-1 中的基本目標(biāo)平臺(tái)是最流行的,而且它們對(duì) GCC 支持的其他平臺(tái)具有代表性。 表 1-1 GCC 應(yīng)用的主要平臺(tái) 硬件 操作

9、系統(tǒng) Alpha Red Hat Linux 7.1 HPPA HPUX 11.0 Intel x86 Debian Linux 2.2 、 Red Hat Linux 6.2 和 FreeBSD 4.5 MIPS IRIX 6.5 (續(xù)表) 硬件 操作系統(tǒng) PowerPC AIX 4.3.3 Sparc Solaris 2.7 要注意保證 GCC 可以在表 1-1 中列出的主要平臺(tái)上正確運(yùn)行,而且也要很好地處理其次列在表 1-2 中的平臺(tái)。 表 1-2 GCC 應(yīng)用的次要平臺(tái) 硬件 操作系統(tǒng) PowerPC Linux Sparc Linux ARM Linux Intel x86 Cygw

10、in 在 這樣少的主要和次要平臺(tái)上測(cè)試的原因是人力問題。即使你的平臺(tái)沒有被列在上面,編譯程序還是可能在系統(tǒng)上能夠良好運(yùn)行的。而且,完整的測(cè)試集合和編譯程序 的源代碼一起提供,所以很容易驗(yàn)證編譯程序是否工作正常。另一種方法就是作為志愿者來測(cè)試你的平臺(tái),這樣編譯程序就可以在每次發(fā)布之前得到測(cè)試。 1.5 編譯程序的功能 編譯程序是一個(gè)翻譯器。它讀入一種語(yǔ)言格式的指令(通常是文本形式的編程語(yǔ)言),并將它們翻譯成可在計(jì)算機(jī)上運(yùn)行的指令集合(通常是二進(jìn)制硬件指令的集合)。 大體上講,編譯程序可以分為兩部分:前端和后端。前端讀出程序的源代碼,將找到的內(nèi)容以樹的形式轉(zhuǎn)換到內(nèi)存駐留表( memory-resi

11、dent table )中。一旦構(gòu)造了該樹,編譯程序的后端就會(huì)讀出樹中保存的信息,并將它們轉(zhuǎn)換成目標(biāo)機(jī)器上的匯編語(yǔ)言。 下面是關(guān)于將源文件翻譯成可執(zhí)行程序的大致步驟: · 詞法分析是編譯程序前端的最開始部分。它從輸入中讀出字符,確定哪些是在一起的,形成符號(hào)、數(shù)字和標(biāo)點(diǎn)符號(hào)。 · 語(yǔ)法分析處理會(huì)讀入來自詞法瀏覽器的符號(hào)流,以及后面跟著的一個(gè)規(guī)則集合,確定它們之間的關(guān)系。語(yǔ)法分析器的輸出結(jié)果是樹結(jié)構(gòu),會(huì)被傳遞給編譯程序的后端。 · 語(yǔ)法分析樹結(jié)構(gòu)會(huì)被翻譯成偽匯編語(yǔ)言( psuedo-assembly language ),叫做寄存器傳送語(yǔ)言( Register Tra

12、nsfer Language , RTL )。 · 編譯程序的后端由分析 RTL 代碼開始,然后執(zhí)行一些優(yōu)化操作。代碼中冗余和未被使用的部分會(huì)被去掉。樹中有些部分會(huì)被移動(dòng)到其他位置以防止語(yǔ)句被不必要地多次執(zhí)行??偟恼f來,有十個(gè)以上的優(yōu)化操作,而且有些優(yōu)化操作會(huì)多次瀏覽代碼。 · RTL 被翻譯成目標(biāo)機(jī)器上的匯編語(yǔ)言。 · 激活匯編器去將匯編語(yǔ)言翻譯成目標(biāo)文件。該文件不是可執(zhí)行格式 它包括可執(zhí)行的目標(biāo)代碼,但并不是最終運(yùn)行的形式。另外,它更可能包括未解析的到其他模塊例程和數(shù)據(jù)的引用。 · 連接程序?qū)碜詤R編器的目標(biāo)文件(其中有些可能保存在包含目標(biāo)文件的庫(kù)中

13、)組合成可執(zhí)行程序。 注意,前端和后端是完全分離開的。任何語(yǔ)言都可用語(yǔ)法分析器產(chǎn)生樹結(jié)構(gòu),而由 GCC 進(jìn)行編譯。類似地,任何機(jī)器只要能將程序的樹結(jié)構(gòu)翻譯成匯編語(yǔ)言,就能夠編譯由前端處理的所有語(yǔ)言。 實(shí)際操作過程絕對(duì)不像描述的那樣簡(jiǎn)單,但這確實(shí)能夠?qū)崿F(xiàn)。1.6 語(yǔ)言 GCC 可以編譯多種語(yǔ)言,但所有這些語(yǔ)言之間有個(gè)基本關(guān)系。語(yǔ)法分析器由于每種語(yǔ)言語(yǔ)法的惟一性而完全不同,但隨著編譯過程的前進(jìn),這些語(yǔ)言的代碼就越來越相似。如前所述, GNU 編譯集合可以接受任何形式編程語(yǔ)言的輸入,產(chǎn)生的輸出也可以在很多不同平臺(tái)上運(yùn)行。 GCC 的基本語(yǔ)言是 C 語(yǔ)言。整個(gè)編譯系統(tǒng)由 C 編譯程序開始,然后漸漸加了

14、其他的語(yǔ)言進(jìn)來。幸運(yùn)的是 C 語(yǔ)言是系統(tǒng)級(jí)的語(yǔ)言,能夠直接處理計(jì)算機(jī)程序的基本元素,因此在它上面再創(chuàng)建其他語(yǔ)言的編譯程序就相對(duì)容易得多。 如果你用其他語(yǔ)言而不是 C 語(yǔ)言編程,而你也對(duì) GCC 很熟悉,你會(huì)發(fā)現(xiàn)很多東西都是以 C 語(yǔ)言的形式出現(xiàn)的??蓪?C 語(yǔ)言想成一種位于 GCC 編譯程序的匯編語(yǔ)言之下的語(yǔ)言。大多數(shù)編譯程序本身都是由 C 語(yǔ)言實(shí)現(xiàn)的。 C+ 語(yǔ)言是 C 語(yǔ)言的直接擴(kuò)展(只有很小的改動(dòng)),因此要向 GCC 加入其他語(yǔ)言,它是最佳首選。 C+ 能夠完成的所有事情 C 語(yǔ)言都可以做到,所以沒有必要修改編譯程序的后端只需要在前端載入一個(gè)新的語(yǔ)法語(yǔ)義分析器。一旦產(chǎn)生中間語(yǔ)言,編譯程序

15、的其他部分就和 C 語(yǔ)言完全一樣了。 Objective-C 并不像 C 語(yǔ)言或 C+ 語(yǔ)言那樣流行,但這是另一種源自(并基于) C 語(yǔ)言的語(yǔ)言。它被看作是“對(duì)象化的 C 語(yǔ)言”,事實(shí)上也是如此。很大程度上,可以編寫 C 程序,而被當(dāng)作 Objective-C 編譯并運(yùn)行。與基本 C 語(yǔ)法完全不同的特殊語(yǔ)法是用來定義對(duì)象的,所以它和純粹的 C 代碼沒有什么混淆與沖突。 Fortran 可以做到而 C 不能做到的事情就是:科學(xué)計(jì)算。標(biāo)準(zhǔn) Fortran 函數(shù)庫(kù)(這是 Fortran 的精髓,因?yàn)樗褪钦Z(yǔ)言的一部分)是一種擴(kuò)展,已經(jīng)趨于完美,而且也歷經(jīng)很多年了。 Fortran 如今被用于科學(xué)計(jì)算

16、是因?yàn)樗幕灸芰褪强焖俣鴾?zhǔn)確地實(shí)現(xiàn)復(fù)雜計(jì)算。 Fortran 甚至還將復(fù)雜的數(shù)字作為它的基本數(shù)據(jù)類型,而基本數(shù)值數(shù)據(jù)類型可具有很高的精確度。 這種語(yǔ)言的結(jié)構(gòu)比其他的現(xiàn)代語(yǔ)言要麻煩一些,但它包含的一些基本函數(shù)和功能的實(shí)現(xiàn)是結(jié)構(gòu)化編程所必需的。最新的 Fortran 標(biāo)準(zhǔn)在這一點(diǎn)上有所擴(kuò)展,無疑是一種非?,F(xiàn)代的語(yǔ)言。 Java 是包含進(jìn) GCC 的最年輕的語(yǔ)言。 Java 語(yǔ)言和 C+ 一樣是基于 C 語(yǔ)言的,但它使用了一些不同的方法來實(shí)現(xiàn)類的語(yǔ)法。 C+ 更加靈活, Java 則是通過限制對(duì)象的構(gòu)造函數(shù)和析構(gòu)函數(shù)去除了 C+ 的不確定性,它繼承的是一些嚴(yán)格無歧義的形式。 Java 和 GCC

17、 包含的其他語(yǔ)言有很大的區(qū)別,這是由它對(duì)象代碼的形式?jīng)Q定的。 Java 會(huì)編譯成一種對(duì)象代碼的特殊格式,作為字節(jié)碼( bytecodes )被解釋器(叫做 Java 虛擬機(jī))執(zhí)行。所有 Java 程序都按照這種方式運(yùn)行,直到 GCC 編譯程序增加選項(xiàng),通過掛接一個(gè) Java 前端到已存在的 GCC 后端來產(chǎn)生本地可執(zhí)行代碼。另外,還添加了一個(gè)前端來讀出 Java 字節(jié)碼,并作為源代碼用來產(chǎn)生本地可執(zhí)行的二進(jìn)制代碼。 最新增加到 GCC 家族的是 Ada 。它是作為一個(gè)功能完善的編譯程序而加入的,最早是由 Ada Core Technologies 公司獨(dú)立開發(fā)作為 GNAT Ada 95 編譯

18、程序,在 2001 年 10 月捐贈(zèng)給 GCC 。 Ada 編譯程序的前端和其他語(yǔ)言的不同,它是由 Ada 編寫的。一般來說,安裝了 Ada 編譯程序就可以了,但在一些系統(tǒng)中會(huì)需要特殊的引導(dǎo)過程。而所有其他語(yǔ)言都是由 C 和 C+ 編寫的,因此幾乎都可以普遍移植。 作 為一種語(yǔ)言, Ada 是專門為多個(gè)程序員編寫大型程序而設(shè)計(jì)的。在編譯 Ada 程序的時(shí)候,它交叉引用程序其他部分的源代碼來驗(yàn)證正確性。這種語(yǔ)言的語(yǔ)法要求每個(gè)函數(shù)和過程都要被聲明為包的一部分,而包的配置是和聲明相匹配的。 C 和 C+ 語(yǔ)言用原型來聲明外部引用函數(shù),而 Java 使用文件命名規(guī)則定位包的成員,但這兩種技術(shù)都不像 A

19、da 那樣嚴(yán)格。 GCC 在 3.0 版之后不再支持 Chill 語(yǔ)言。就在發(fā)布版本 3.1 之前, Chill 語(yǔ)言的源代碼也從 GCC 中移走了。但 GCC 非常復(fù)雜,而 Chill 語(yǔ)言完整地作為其一部分已經(jīng)存在一段時(shí)間了,所以還會(huì)從 GCC 在線文檔中和源代碼的各種不同位置中看到對(duì) Chill 語(yǔ)言的引用。本書是在這種轉(zhuǎn)換過程中編寫的,所以還會(huì)涉及到 Chill 編譯程序選項(xiàng)和文件類型。 1.7 部分列表 GCC 是由許多組件組成的。表 1-3 列出了 GCC 的各個(gè)部分,但它們也并不總是出現(xiàn)的。有些部分是和語(yǔ)言相關(guān)的,所以如果沒有安裝某種特定語(yǔ)言,系統(tǒng)中就不會(huì)出現(xiàn)相關(guān)的文件。 表 1

20、-3 GCC 安裝的各個(gè)部分 部分 描述 c+ gcc 的一個(gè)版本,默認(rèn)語(yǔ)言設(shè)置為 C+ ,而且在連接的時(shí)候自動(dòng)包含標(biāo)準(zhǔn) C+ 庫(kù)。這和 g+ 一樣 cc1 實(shí)際的 C 編譯程序 cc1plus 實(shí)際的 C+ 編譯程序 collect2 在不使用 GNU 連接程序的系統(tǒng)上,有必要運(yùn)行 collect2 來產(chǎn)生特定的全局初始化代碼(例如 C+ 的構(gòu)造函數(shù)和析構(gòu)函數(shù)) configure GCC 源代碼樹根目錄中的一個(gè)腳本。用于設(shè)置配置值和創(chuàng)建 GCC 編譯程序必需的 make 程序的描述文件 crt0.o 這個(gè)初始化和結(jié)束代碼是為每個(gè)系統(tǒng)定制的,而且也被編譯進(jìn)該文件,該文件然后會(huì)被連接到每個(gè)可執(zhí)

21、行文件中來執(zhí)行必要的啟動(dòng)和終止程序 cygwin1.dll Windows 的共享庫(kù)提供的 API ,模擬 UNIX 系統(tǒng)調(diào)用 f77 該驅(qū)動(dòng)程序可用于編譯 Fortran f771 實(shí)際的 Fortran 編譯程序 g+ gcc 的一個(gè)版本,默認(rèn)語(yǔ)言設(shè)置為 C+ ,而且在連接的時(shí)候自動(dòng)包含標(biāo)準(zhǔn) C+ 庫(kù)。這和 c+ 一樣 gcc 該驅(qū)動(dòng)程序等同于執(zhí)行編譯程序和連接程序以產(chǎn)生需要的輸出 (續(xù)表) 部分 描述 gcj 該驅(qū)動(dòng)程序用于編譯 Java gnat1 實(shí)際的 Ada 編譯程序 gnatbind 一種工具,用于執(zhí)行 Ada 語(yǔ)言綁定 gnatlink 一種工具,用于執(zhí)行 Ada 語(yǔ)言連接

22、jc1 實(shí)際的 Java 編譯程序 libgcc 該庫(kù)包含的例程被作為編譯程序的一部分,是因?yàn)樗鼈兛杀贿B接到實(shí)際的可執(zhí)行程序中。它們是特殊的例程,連接到可執(zhí)行程序,來執(zhí)行基本的任務(wù),例如浮點(diǎn)運(yùn)算。這些庫(kù)中的例程通常都是平臺(tái)相關(guān)的 libgcj 運(yùn)行時(shí)庫(kù)包含所有的核心 Java 類 libobjc 對(duì)所有 Objective-C 程序都必須的運(yùn)行時(shí)庫(kù) libstdc+ 運(yùn)行時(shí)庫(kù),包括定義為標(biāo)準(zhǔn)語(yǔ)言一部分的所有的 C+ 類和函數(shù) 表 1-4 列出的軟件和 GCC 協(xié)同工作,目的是實(shí)現(xiàn)編譯過程。有些是很基本的(例如 as 和 ld ),而其他一些則是非常有用但不是嚴(yán)格需要的。盡管這些工具中的很多都是

23、各種 UNIX 系統(tǒng)的本地工具,但還是能夠通過 GNU 包 binutils 得到大多數(shù)工具。安裝 binutils 的過程將在第 2 章中介紹。 表 1-4 GCC 使用的軟件工具 工具 描述 addr2line 給出一個(gè)可執(zhí)行文件的內(nèi)部地址, addr2line 使用文件中的調(diào)試信息將地址翻譯成源代碼文件名和行號(hào)。該程序是 binutils 包的一部分 ar 這是一個(gè)程序,可通過從文檔中增加、刪除和析取文件來維護(hù)庫(kù)文件。通常使用該工具是為了創(chuàng)建和管理連接程序使用的目標(biāo)庫(kù)文檔。該程序是 binutils 包的一部分 as GNU 匯編器。實(shí)際上它是一族匯編器,因?yàn)樗梢员痪幾g或能夠在各種不同

24、平臺(tái)上工作。該程序是 binutils 包的一部分 autoconf 產(chǎn)生的 shell 腳本自動(dòng)配置源代碼包去編譯某個(gè)特定版本的 UNIX c+filt 程序接受被 C+ 編譯程序轉(zhuǎn)換過的名字(不是被重載的),而且將該名字翻譯成初始形式。該程序是 binutils 包的一部分 f2c 是 Fortran 到 C 的翻譯程序。不是 GCC 的一部分 gcov gprof 使用的配置工具,用來確定程序運(yùn)行的時(shí)候哪一部分耗時(shí)最大 gdb GNU 調(diào)試器,可用于檢查程序運(yùn)行時(shí)的值和行為 GNATS GNU 的調(diào)試跟蹤系統(tǒng)( GNU Bug Tracking System )。一個(gè)跟蹤 GCC 和其他

25、 GNU 軟件問題的在線系統(tǒng) (續(xù)表) 工具 描述 gprof 該程序會(huì)監(jiān)督編譯程序的執(zhí)行過程,并報(bào)告程序中各個(gè)函數(shù)的運(yùn)行時(shí)間,可以根據(jù)所提供的配置文件來優(yōu)化程序。該程序是 binutils 包的一部分 ld GNU 連接程序。該程序?qū)⒛繕?biāo)文件的集合組合成可執(zhí)行程序。該程序是 binutils 包的一部分 libtool 一個(gè)基本庫(kù),支持 make 程序的描述文件使用的簡(jiǎn)化共享庫(kù)用法的腳本 make 一個(gè)工具程序,它會(huì)讀 makefile 腳本來確定程序中的哪個(gè)部分需要編譯和連接,然后發(fā)布必要的命令。它讀出的腳本(叫做 makefile 或 Makefile )定義了文件關(guān)系和依賴關(guān)系 nlm

26、conv 將可重定位的目標(biāo)文件轉(zhuǎn)換成 NetWare 可加載模塊( NetWare Loadable Module , NLM )。該程序是 binutils 的一部分 nm 列出目標(biāo)文件中定義的符號(hào)。該程序是 binutils 包的一部分 objcopy 將目標(biāo)文件從一種二進(jìn)制格式復(fù)制和翻譯到另外一種。該程序是 binutils 包的一部分 objdump 顯示一個(gè)或多個(gè)目標(biāo)文件中保存的多種不同信息。該程序是 binutils 包的一部分 ranlib 創(chuàng)建和添加到 ar 文檔的索引。該索引被 ld 使用來定位庫(kù)中的模塊。該程序是 binutils 包的一部分 ratfor Ratfor 預(yù)

27、處理程序可由 GCC 激活,但不是標(biāo)準(zhǔn) GCC 發(fā)布版的一部分 readelf 從 ELF 格式的目標(biāo)文件顯示信息。該程序是 binutils 包的一部分 size 列出目標(biāo)文件中每個(gè)部分的名字和尺寸。該程序是 binutils 包的一部分 strings 瀏覽所有類型的文件,析取出用于顯示的字符串。該程序是 binutils 包的一部分 strip 從目標(biāo)文件或文檔庫(kù)中去掉符號(hào)表,以及其他調(diào)試所需的信息。該程序是 binutils 包的一部分 vcg Ratfor 瀏覽器從文本文件中讀取信息,并以圖表形式顯示它們。而 vcg 工具并不是 GCC 發(fā)布中的一部分,但 -dv 選項(xiàng)可被用來產(chǎn)生

28、vcg 可以理解的優(yōu)化數(shù)據(jù)的格式 windres Window 資源文件編譯程序。該程序是 binutils 包的一部分 1. 8 聯(lián)系方式 GCC 編譯程序的范圍很廣從簡(jiǎn)單的批處理工具程序到幾百萬行的規(guī)模的系統(tǒng)??偟膩碚f,當(dāng)軟件項(xiàng)目變得更大或者在某些方面變得特殊,在不能處理某些奇怪問題的 時(shí)候,就會(huì)出現(xiàn)各種情況。有些是 bug ,有些是特殊習(xí)慣,但有的不可避免地需要澄清或者至少能夠在正確的方向上引起注意。所幸的是有幫助信息可供使用,而且可以找到關(guān)于 GCC 的一切信息。 信息的主要來源是郵件組。開放的郵件組(所有的成員都可以收發(fā)郵件)的好處是可以立即展開討論。如果它有 所幫助,我建議注冊(cè)到

29、gcc-help 的郵件列表中。開放郵件組上的對(duì)話會(huì)繼續(xù)到情況被澄清或問題得到解決。表 1-5 包括所有 GCC 開放郵件組的簡(jiǎn)要描述。只讀郵件組列在表 1-6 中。 表 1-5 GCC 的開放郵件組 郵件組名 描述 gcc 這是開發(fā) GCC 的基本討論區(qū)。如果只是要注冊(cè)一個(gè)郵件組,這就是合適的選擇。它能夠讓你了解到最新的新聞和開發(fā)情況。該郵件組信件很多 gcc-bugs 討論 bug 和報(bào)告 bug 的郵件組。這里的郵件也很多 gcc-help 該郵件組適用于那些尋找問題答案的人。該郵件組信件很多 gcc-patches 源代碼補(bǔ)丁和關(guān)于補(bǔ)丁的討論會(huì)被提交到這個(gè)郵件組。該郵件組信件很多 gc

30、c-testresults 測(cè)試結(jié)果和對(duì)測(cè)試以及測(cè)試結(jié)果的討論都會(huì)發(fā)到這里 java 關(guān)于 GCC 的 Java 前端的開發(fā)和維護(hù)的討論列表,以及 Java 的運(yùn)行時(shí)庫(kù)的討論列表 java-patches 關(guān)于 Java 前端和 Java 運(yùn)行時(shí)庫(kù)的源代碼補(bǔ)丁被發(fā)布到該討論組及 gcc-patches 郵件組 libstdc+ 該討論組用來討論標(biāo)準(zhǔn) C+ 庫(kù)的開發(fā)和維護(hù) 表 1-6 GCC 的只讀郵件組 郵件組名 描述 gccadmin 該郵件組收到的消息來自 的 gccadmin 賬號(hào)運(yùn)行的長(zhǎng)時(shí)間任務(wù) gcc-announce 該郵件列表信息較少,主要用來公布最新的版

31、本發(fā)布,以及其他關(guān)于 GCC 的重要事件 gcc-cvs 每個(gè)登入到 CVS 倉(cāng)庫(kù)的人都會(huì)發(fā)消息到該郵件組 gcc-cvs-wwwdocs 每個(gè)登入到 HTML 文檔的 CVS 倉(cāng)庫(kù)的人都會(huì)發(fā)消息到該郵件組 gcc-prs 每次當(dāng)報(bào)告的問題進(jìn)入 GNATS 數(shù)據(jù)庫(kù)的時(shí)候都會(huì)向該郵件組發(fā)消息 gcc-regression 發(fā)送到這個(gè)郵件組的消息包含的是 GCC 回歸測(cè)試的運(yùn)行結(jié)果 java-announce 這個(gè)郵件組信息很少,它是用來發(fā)布關(guān)于 Java 前端或者 Java 運(yùn)行時(shí)基本函數(shù)的消息的 java-cvs 每次登入到 Java 編譯程序和 CVS 倉(cāng)庫(kù)運(yùn)行時(shí)部分的時(shí)候,都會(huì)向該郵件組(

32、以及 gcc-cvs 郵件組)發(fā)送消息 java-prs 每次報(bào)告的與 Java 有關(guān)的問題進(jìn)入 GNATS 數(shù)據(jù)庫(kù)的時(shí)候,都會(huì)向該郵件組(以及 gcc-prs 郵件組)發(fā)送消息 libstdc+-cvs 每次登入到 CVS 倉(cāng)庫(kù)的 libstc+ 部分時(shí),都會(huì)向該郵件組發(fā)送消息 GCC 編譯程序是在 GNU 通用公共許可證(也被叫做 GNU GPL ,或就叫做 GPL )之內(nèi)的。由 GPL 保證的這種許可叫做 copyleft (版權(quán)所無) 。簡(jiǎn)單的說,這就意味著任何人都有權(quán)利復(fù)制并使用該軟件,但如果它被集成進(jìn)產(chǎn)品,該產(chǎn)品就必須也是 GPL 許可證的。就是說,不能使用 GPL 軟件將它轉(zhuǎn)換成

33、專有的軟件。然而,并不限制任何人用 GCC 作為工具創(chuàng)建自己需要形式的軟件。變成生成程序中的二進(jìn)制位以及片斷不要求該程序得到 GPL 許可。 GPL 的另一種方案是弱通用公共許可證( Lesser General Public License , LGPL )。該許可證以前叫做庫(kù) GPL ,但這個(gè)名字由于可能產(chǎn)生誤導(dǎo)就改變了它滿足一些庫(kù),但不會(huì)是所有庫(kù)。 LGPL 允許專有程序使用的庫(kù)例程以及共享的和非靜態(tài)連接的庫(kù)。例子就是標(biāo)準(zhǔn) C 庫(kù)的 GNU 版本。 下面是 GPL 的文本。它用非常清楚的語(yǔ)言描述了許可的細(xì)節(jié)。文檔的末尾是對(duì)處理過程的描述,遵照此過程可以將自己的軟件放在 GPL 下。 GN

34、U GPL Version2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston , MA 02111-1307 USA 允許所有人復(fù)制和發(fā)布這一許可證原始文檔的副本,但絕對(duì)不允許對(duì)它進(jìn)行任何修改。 導(dǎo)言 大 多數(shù)軟件許可剝奪你共享和修改軟件的自由。相比之下, GNU 通用公共許可力圖保證你共享和修改自由軟件的自由保證軟件對(duì)所有用戶是自由的。通用公共許可適用于大多數(shù)自由軟件協(xié)會(huì)的軟件,以及由使用這些軟件而承 擔(dān)義務(wù)的作者所開發(fā)的軟件。(自由軟件

35、協(xié)會(huì)的其他軟件受 GNU 庫(kù)通用公共許可的保護(hù))。你也可以將它應(yīng)用到你的程序中。 當(dāng) 我們談到自由軟件( free software )時(shí),我們指的是自由而不是價(jià)格。 GNU 通用公共許可保證你有發(fā)布自由軟件的自由(如果你愿意,可以對(duì)此項(xiàng)服務(wù)收取一定的費(fèi)用);保證你能收到源程序或者在你需要時(shí)能得到它;保證你能修改軟件或 將它的一部分用于新的自由軟件;而且還保證你知道你能做這些事情。 為了保護(hù)你的權(quán)利,我們作出規(guī)定:禁止任何人不承認(rèn)你的權(quán)利,或者要求你放棄這些權(quán)利。如果你修改了自由軟件或者發(fā)布了軟件的副本,這些規(guī)定就轉(zhuǎn)化為你的責(zé)任。 例如,如果你發(fā)布了這樣一個(gè)程序的副本,不管是收費(fèi)的還是免費(fèi)的,

36、你必須將你具有的一切權(quán)利給予你的接受者;你必須保證他們能收到或得到源程序;并且將這些條款給他們看,使他們知道他們有這樣的權(quán)利。 我們采取兩項(xiàng)措施來保護(hù)你的權(quán)利。( 1 )給軟件以版權(quán)保護(hù)。( 2 )給你提供許可證。它給你復(fù)制、發(fā)布和 / 或修改這些軟件的法律許可。 同 樣,為了保護(hù)每個(gè)作者和我們自己,我們需要清楚地讓每個(gè)人明白,自由軟件沒有擔(dān)保( no warranty )。如果由于其他某個(gè)人修改了軟件,并繼續(xù)加以傳播。我們需要它的接受者明白:他們所得到的并不是原來的自由軟件。由其他人引入的任何問題,不應(yīng)損害原作 者的聲譽(yù)。 最后,所有自由軟件都不斷受到軟件專利的威脅。我們希望避免這樣的風(fēng)險(xiǎn),

37、自由軟件的再發(fā)布者以個(gè)人名義獲得專利許可證,也就是將軟件變?yōu)樗接?。為防止這一點(diǎn),我們必須明確:任何專利必須以允許每個(gè)人自由使用為前提,否則就不準(zhǔn)許有專利。 下面是有關(guān)復(fù)制、發(fā)布和修改的確切的條款和條件。 GNU 通用公共許可證 有關(guān)復(fù)制、發(fā)布和修改的條款和條件 0. 凡著作權(quán)人在其軟件或其他著作中聲明,該軟件或著作得在通用公共許可證條款下才能發(fā)布,本許可對(duì)其均適用。以下所稱的“程序”,是指任何一種適用通用公共 許可的程序和著作;“基于本程序的著作”,則指程序或任何基于著作權(quán)法所產(chǎn)生的衍生著作,換言之,是指包含本程序全部或部分的著作,不論是否完整或經(jīng)過修 改的程序,以及(或)翻譯成其他語(yǔ)言的程序

38、(以下“修改”一詞包括但不限于翻譯行為)。被許可的人則稱為“您”。 本許可不適用于復(fù)制、發(fā)布及修改以外的行為;這些行為不在本許可范圍內(nèi)。執(zhí)行本程序的行為并不受限制,而本程序的輸出只有在其內(nèi)容構(gòu)成基于本程序所生的著 作(而非只是因?yàn)閳?zhí)行本程序所造成)時(shí),是受到本許可約束的。至于程序輸出的內(nèi)容是否構(gòu)成本程序的衍生著作,則取決于本程序的具體用途。 1. 您可以對(duì)所收受的本程序源碼,無論以何種媒介,復(fù)制與發(fā)布其完整的復(fù)制品,然而您必須符合以下條件:以顯著及適當(dāng)?shù)姆绞皆诿糠輳?fù)制品上發(fā)布適當(dāng)?shù)闹鳈?quán)標(biāo) 示及無擔(dān)保聲明;維持所有有關(guān)本許可以及無擔(dān)保聲明的原貌;并將本許可的副本連同本程序一起交付其他任一位程序

39、收受者。 您可對(duì)授讓復(fù)制品的實(shí)際行為請(qǐng)求一定的費(fèi)用,也可自由決定是否提供擔(dān)保作為收費(fèi)的代價(jià)。 2. 您可以修改程序的一個(gè)或多個(gè)復(fù)制品或者程序的任何部分,以此形成基于本程序所生成的著作,并依前所述第一條規(guī)定,復(fù)制與發(fā)布修改過的程序或著作,但必須滿足以下條件: a )您必須在所修改的文件上附加顯著的標(biāo)示,說明您修改過該文件,以及修改日期。 b )必須就您所發(fā)布或發(fā)行的著作,無論是包含程序的全部還是部分的著作,或者是自程序或其他任何部分所衍生的著作,整體授權(quán)所有第三人可根據(jù)本許可規(guī)定使用,且不得因此項(xiàng)授權(quán)行為收取任何費(fèi)用。 c )若經(jīng)過修改的程序在執(zhí)行時(shí)通常以互動(dòng)方式讀取命令時(shí),您必須在最常用的方式

40、下,于開始進(jìn)入互動(dòng)方式時(shí),列出或展示以下宣告:適當(dāng)?shù)闹鳈?quán)標(biāo)示以及無擔(dān)保 聲明(或聲明由您提供擔(dān)保)、使用者可以根據(jù)這些條件再發(fā)布此程序,以及告知使用者如何瀏覽本許可的副本。(例外:若程序本身是以交互方式執(zhí)行的,然而通 常卻不回列出該宣告時(shí),那您基于本程序所生成的著作便無需列出該宣告。) 這些要求對(duì)修改過的著作是整體適用的。如果著作中可識(shí)別的一部分并非衍生自本程序,并且可合理地認(rèn)為是一個(gè)獨(dú)立、個(gè)別的著作,則當(dāng)您將其作為個(gè)別著作加以 發(fā)布時(shí),本許可及其條款將不適用于該部分。當(dāng)然當(dāng)您將上述部分作為基于程序所生的著作的一部分而發(fā)布時(shí),整個(gè)著作的發(fā)布就必須符合本許可條款的規(guī)定,而不 管這些部分的作者是

41、誰(shuí)。 因此,本條規(guī)定的意圖不在于主張或剝奪您對(duì)完全由您所完成的著作的權(quán)利;應(yīng)該說,本條規(guī)定意在行使對(duì)于基于程序的衍生著作或集合著作的發(fā)布行為的控制權(quán)。 此外,非基于本程序所生的其他著作與本程序(或基于本程序產(chǎn)生的著作)在同一存儲(chǔ)或發(fā)布媒介上的單純聚集行為,并不會(huì)使該著作因此受到本許可條件的約束。3. 可根據(jù)前面第一、二條規(guī)定,復(fù)制和發(fā)布程序(或第二條所述基于程序產(chǎn)生的著作)的目標(biāo)代碼或可執(zhí)行形式,但必須符合以下條件: a )附上完整的相對(duì)機(jī)器可讀的源碼,而這些源碼必須依前面第一、二條規(guī)定在經(jīng)常作為軟件交互的媒介上發(fā)布;或 b )附上至少三年有效的書面報(bào)價(jià)文件,提供任何第三人在支付不超過實(shí)際發(fā)布

42、源碼所需成本的費(fèi)用下,取得相同源碼的完整的機(jī)器可讀的復(fù)制品,并依照前面第一、二條規(guī)定在經(jīng)常用以作為軟件交互的媒介上發(fā)布該復(fù)制品;或 c )附上所收受的有關(guān)發(fā)布相同源碼的報(bào)價(jià)信息。(本項(xiàng)選擇僅在非營(yíng)利發(fā)布、且只在您依照前面 b 項(xiàng)方式自該書面報(bào)價(jià)文件收受程序目標(biāo)代碼或可執(zhí)行形式時(shí),才能適用。) 著 作的源碼是指對(duì)著作進(jìn)行修改時(shí)適用的形式。對(duì)于可執(zhí)行的著作而言,完整的源碼是指著作中包含所有模式的全部源碼,加上相關(guān)接口定義文件,還有用以控制該著 作編譯及安裝的描述。然而,特別的例外情況是,所發(fā)布的源碼并不需包括任何通常會(huì)隨著所執(zhí)行操作系統(tǒng)的主要組成部分(編譯程序、核心等)而發(fā)布的軟件(無 論以源碼或

43、二進(jìn)制格式),除非該部分本身就附加在可執(zhí)行程序中。 如果可執(zhí)行代碼或目標(biāo)代碼的發(fā)布方式,是以指定的地點(diǎn)存取,供人復(fù)制,則提供可自相同地點(diǎn)復(fù)制源碼的使用機(jī)會(huì),看作是對(duì)源碼的發(fā)布,然而第三人并不因此而負(fù)有將目標(biāo)代碼連同源碼一起復(fù)制的義務(wù)。 4. 除本許可所明示的方式外,不得對(duì)程序加以復(fù)制、修改、再授權(quán)或發(fā)布。任何企圖以其他任何方式進(jìn)行復(fù)制、修改、再授權(quán)或發(fā)布程序的行為均為無效行為,并將自 動(dòng)終止您基于本許可所享有的權(quán)利。但依照本許可規(guī)定,從您手中收受復(fù)制品或權(quán)利的人,只要遵守本許可規(guī)定,他們所獲得的許可并不會(huì)因此終止。 5. 因?yàn)槟⑽丛诒驹S可上簽名,所以無需接受本許可。但除此之外,別無其他方式可

44、以修改或發(fā)布程序或其衍生作品的授權(quán)許可。如不接受本許可,則這些行為在法律 上都是被禁止的。因此對(duì)程序(或任何基于本程序所生成的著作)的修改和發(fā)布行為,表示已經(jīng)接受了本許可,以及接受了所有關(guān)于復(fù)制、發(fā)布及修改程序(或基于 程序生成著作)的條款和條件。 6. 每當(dāng)再次發(fā)布程序(或任何基于程序所生成的著作)時(shí),收受者就自動(dòng)獲得原授權(quán)人所有的關(guān)于復(fù)制、發(fā)布或修改程序的權(quán)利。不得就本授權(quán)所賦予接收者行使的權(quán)利附加任何進(jìn)一步的限制。對(duì)于第三人是否履行本許可,無須負(fù)責(zé)。 7. 如果法院判決、專利侵權(quán)主張或其他任何理由(不限于專利爭(zhēng)議)的結(jié)果,使得加諸于您的條件(無論是由法院命令、協(xié)議或其他方式造成)與本許可

45、規(guī)定有所沖 突,他們并不免除您必須遵守本許可的規(guī)定。如果無法同時(shí)符合本許可條件所生成的義務(wù)及其他相關(guān)義務(wù)而進(jìn)行發(fā)布,那么后果就是不得發(fā)布該程序。例如,如果專 利授權(quán)不允許直接或間接通過您而取得復(fù)制品的人,以免付權(quán)利金的方式再發(fā)布該程序時(shí),惟一能夠同時(shí)滿足該義務(wù)及本許可的方式就是徹底避免發(fā)布本程序。 如果本條任何一部分在特殊情況下被認(rèn)定無效或無法執(zhí)行時(shí),本條其余部分仍應(yīng)適用,且本條全部?jī)?nèi)容在其他情況下仍然應(yīng)該適用。 本條的目的并不是誘使您侵害專利或其他財(cái)產(chǎn)權(quán)的權(quán)利主張,或就此類主張的有效性加以爭(zhēng)執(zhí);本條的惟一目的是保障公共授權(quán)慣例所執(zhí)行的自由軟件發(fā)布系統(tǒng)的完 整性。許多人信賴該系統(tǒng)一貫使用的應(yīng)用

46、程序,而對(duì)經(jīng)由此系統(tǒng)發(fā)布的大量軟件有相當(dāng)多的貢獻(xiàn);作者 / 貢獻(xiàn)者有權(quán)決定他或她是否希望經(jīng)由其他系統(tǒng)發(fā)布軟件,而被授權(quán)人則無該種選擇權(quán)。 本條的用意在于將本許可其他不確定部分徹底解釋清楚。 8. 如果因?yàn)閷@虬鏅?quán)保護(hù)的接口問題,而使得本程序的發(fā)布與 / 或使用局限于某些國(guó)家時(shí),則將本程序置于本許可規(guī)范之下的原著作權(quán)人得增加明確的發(fā)布地區(qū)限制條款,將一些國(guó)家排除在外,而使發(fā)布的許可只限制在未排除的 國(guó)家之內(nèi)。在該情況下,將限制條款如同以書面方式訂定于本許可內(nèi)容中,而成為本許可的條款。 9. 自由軟件協(xié)會(huì)可以隨時(shí)發(fā)布通用公共許可的修正版和 / 或新版本。新版本在精神上將近似于目前的版本,但在細(xì)節(jié)

47、上有所不同以滿足新的問題或狀況。 每個(gè)版本都有單獨(dú)的版本編號(hào)。如果程序指定授權(quán)版本編號(hào),表示其適用于該版本或是“任何新版本”時(shí),得選擇遵循該版本或任何由自由軟件協(xié)會(huì)日后所發(fā)布的更新版本的條款或條件。如果程序沒有指出授權(quán)版本編號(hào),便要選擇任一自由軟件協(xié)會(huì)所發(fā)布的版本。 10. 如果想要將部分程序納入其他自由程序,而其發(fā)布的條件有所不同時(shí),請(qǐng)寫信取得作者的許可。如果是自由軟件協(xié)會(huì)享有著作權(quán)的軟件,請(qǐng)寫信到自由軟件協(xié)會(huì);我 們有時(shí)會(huì)以特殊方式予以處理。我們的決定取決于兩項(xiàng)目標(biāo):確保自由軟件的所有衍生著作均維護(hù)在自由狀態(tài),并廣泛地促進(jìn)軟件的共享或再利用。 無擔(dān)保聲明 11. 由于本程序是無償授權(quán)的,因

48、此在法律許可范圍內(nèi),本許可對(duì)程序不負(fù)擔(dān)責(zé)任。非經(jīng)書面聲明,著作權(quán)人和 / 或其他提供程序的人,無論顯式或隱式,均是依照“現(xiàn)狀”提供程序而并無任何形式的擔(dān)保責(zé)任,其包含并不限于,就適售性以及特定目的的使用性為默認(rèn)性擔(dān)保。 有關(guān)程序品質(zhì)與效能的全部風(fēng)險(xiǎn)都由自己承擔(dān)。如果程序被證明有瑕疵,您應(yīng)該承擔(dān)所有服務(wù)、修復(fù)或改正的費(fèi)用。 12. 非經(jīng)法律要求或書面同意,任何著作權(quán)人或任何可能依前述方式修改和 / 或發(fā)布程序的人,對(duì)于您因?yàn)槭褂没虿荒苁褂贸绦蛩斐傻囊话阈?、特殊性、意外性或間接性損失,不負(fù)任何責(zé)任(包括但不限于數(shù)據(jù)損失、數(shù)據(jù)執(zhí)行不精確、或應(yīng) 由您或第三人承擔(dān)的損失,或程序無法與其他程序運(yùn)作等),

49、即便前述的著作權(quán)人或其他團(tuán)體已被告知這種損失的可能性。   條款結(jié)束   如何將這些條款用于你的新程序 如果你開發(fā)了新程序,而且希望它得到公眾最大限度的利用。最好的辦法就是將它變?yōu)樽杂绍浖?。使得每個(gè)人都能在遵守條款的基礎(chǔ)上對(duì)它進(jìn)行修改和重新發(fā)布。 為了做到這一點(diǎn),給程序附上下列聲明。最安全的方式是將它放在每個(gè)源程序的開頭,以便最有效地傳遞拒絕擔(dān)保的信息。每個(gè)文件至少應(yīng)有“版權(quán)所有”行以及在什么地方能看到聲明全文的說明。 <one line to give the program's name and a brief idea of what it does.

50、Copyright (C) year name of author> 這一程序是自由軟件,你可以遵照自由軟件協(xié)會(huì)出版的 GNU 通用公共許可證條款來修改和重新發(fā)布這一程序?;蛘哂迷S可證的第二版,或者(根據(jù)你的選擇)用任何更新的版本。 發(fā)布這一程序的目的是希望它有用,但沒有任何擔(dān)保。甚至沒有適合于特定目的的隱含的擔(dān)保。更詳細(xì)的情況請(qǐng)參閱 GNU 通用公共許可證。 你 應(yīng)該已經(jīng)和程序一起收到一份 GNU 通用公共許可證的副本。如果還沒有,寫信給自由軟件協(xié)會(huì)( The Free Software Foundation, Inc. ),地址: 59 Temple Place , Suite 33

51、0, Boston, MA 02111-1307 USA 。 還應(yīng)加上如何和你取得聯(lián)系的相關(guān)信息。如果程序以交互方式進(jìn)行工作,當(dāng)它開始進(jìn)入交互方式時(shí),使它輸出類似下面的簡(jiǎn)短聲明: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free software, and you are welcome to redistribute it under ce

52、rtain conditions; type 'show c' for details. 假設(shè)的命令 show c ' 及 show w ' 應(yīng)顯示通用公共許可證的相應(yīng)條款。當(dāng)然,你使用的命令名稱可以不同于 show c ' 及 show w ' 。根據(jù)程序的具體情況,也可以用菜單或鼠標(biāo)選項(xiàng)來顯示這些條款。 如果需要,你應(yīng)該取得你的上司(如果你是程序員)或你的學(xué)校簽署放棄程序版權(quán)的聲明。下面只是一個(gè)例子,你應(yīng)該改變相應(yīng)的名稱: Yoyodyne, Inc., hereby disclaims all copyright interest in t

53、he program 'Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice 這一許可證不允許你將程序并入專用程序。如果你的程序是一個(gè)子程序庫(kù),你可能會(huì)認(rèn)為用庫(kù)的方式和專用應(yīng)用程序連接更有用。如果你想這樣做,使用 GNU 庫(kù)通用公共許可證代替本許可證。 有大量的環(huán)境變量可供設(shè)置以影響 GCC 編譯程序的方式。利用這些變量的控制也可使用合適的命令行選項(xiàng)。 一些環(huán)境變量設(shè)

54、置在目錄名列表中。這些名字和 PATH 環(huán)境變量使用的格式相同。特殊字符 PATH_SEPARATOR (安裝編譯程序的時(shí)候定義)用在目錄名之間。在 UNIX 系統(tǒng)中,分隔符是冒號(hào),而 Windows 系統(tǒng)中為分號(hào)。 C_INCLUDE_PATH 編譯 C 程序時(shí)使用該環(huán)境變量。該環(huán)境變量指定一個(gè)或多個(gè)目錄名列表,查找頭文件,就好像在命令行中指定 -isystem 選項(xiàng)一樣。會(huì)首先查找 -isystem 指定的所有目錄。 也見 CPATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。 COMPILER_PATH 該環(huán)境變量指定一個(gè)或多個(gè)目錄名列表,如果沒

55、有指定 GCC_EXEC_PREFIX 定位子程序,編譯程序會(huì)在此查找它的子程序。 也見 LIBRARY_PATH 、 GCC_EXEC_PREFIX 和 -B 命令行選項(xiàng)。 CPATH 編譯 C 、 C+ 和 Objective-C 程序時(shí)使用該環(huán)境變量。該環(huán)境變量指定一個(gè)或多個(gè)目錄名列表,查找頭文件,就好像在命令行中指定 -l 選項(xiàng)一樣。會(huì)首先查找 -l 指定的所有目錄。 也見 C_INCLUDE_PATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。 CPLUS_INCLUDE_PATH 編譯 C+ 程序時(shí)使用該環(huán)境變量。該環(huán)境變量指定一個(gè)或多個(gè)目

56、錄名列表,查找頭文件,就好像在命令行中指定 -isystem 選項(xiàng)一樣。會(huì)首先查找 -isystem 指定的所有目錄。 也見 CPATH 、 C_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。 DEPENDENCIES_OUTPUT 為文件名設(shè)置該環(huán)境變量會(huì)讓預(yù)處理程序?qū)⒒谝蕾囮P(guān)系的 makefile 規(guī)則寫入文件。不會(huì)包括系統(tǒng)頭文件名字。 如果環(huán)境變量設(shè)置為單名,被看作是文件名字,而依賴關(guān)系規(guī)則的名字來自源文件名字。如果定義中有兩個(gè)名字,則第二個(gè)名字是用作依賴關(guān)系規(guī)則的目標(biāo)名。 設(shè)置該環(huán)境變量的結(jié)果和使用命令行選項(xiàng) -MM 、 -MF 和 -MT 的組合是一樣的。也見

57、 SUNPRO_DEPENDENCIES 。 GCC_EXEC_PREFIX 如 果定義了該環(huán)境變量,它會(huì)作為編譯程序執(zhí)行的所有子程序名字的前綴。例如,如果將變量設(shè)置為 testver 而不是查找 as ,匯編器首先會(huì)在名字 testveras 下查找。如果在此沒有找到,編譯程序會(huì)繼續(xù)根據(jù)它的普通名進(jìn)行查找。可在前綴名中使用斜線指出路徑名。 GCC_EXEC_PREFIX 的默認(rèn)設(shè)置為 prefix /lib/gcc-lib/ ,這里的 prefix 是安裝編譯程序時(shí) configure 腳本指定的名字。該前綴也用于定位標(biāo)準(zhǔn)連接程序文件,包含進(jìn)來作為可執(zhí)行程序的一部分。 如果使用 -B 命令行選項(xiàng),會(huì)重寫該設(shè)置。也見 COMPILER_PATH 。 LANG 該環(huán)境變量用于指出編譯程序使用的字符集,可創(chuàng)建寬字符文字、串文字和注釋。 定義 LANG 為 C-JIS ,指出預(yù)處理程序?qū)⒍嘧止?jié)字符按照 JIS (日語(yǔ)工業(yè)標(biāo)準(zhǔn))字符進(jìn)行解釋。 C-SJIS 可用來指出 Shift -JIS 字符而 C-EUCJP 指出日文 EUC 。 如果沒有定義 LANG ,或定義為不可識(shí)別,函數(shù) mblen() 被用來確定字符寬度,而 mbtowc() 用來將多字節(jié)序列轉(zhuǎn)換為寬字符。 LC_ALL 如果設(shè)置,該環(huán)境變量的值重寫

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論