GCC技術參考大全_第1頁
GCC技術參考大全_第2頁
GCC技術參考大全_第3頁
GCC技術參考大全_第4頁
GCC技術參考大全_第5頁
已閱讀5頁,還剩85頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、代碼的質量參差不齊因為有如此之多的程序員參與開發過程,而且代碼注釋中也 內嵌了大量的內部文檔,所以文檔的質量和數量也有變化。所幸的是,有大量的程序員正在努力地提高代碼和注釋的質量。而且,也不是必須閱讀內嵌的注釋才能使 用編譯程序。但如果要對編譯程序做些工作,你會發現還是要花些時間閱讀代碼中內嵌的注釋。 測量編譯程序的質量的惟一方 法是詢問它的用戶。全世界的用戶數目很難估計(自由軟件就有這樣的特性),但一定是巨大的。它被用于某些版本的 UNIX ,這些 UNIX 自帶系統供應商提供的本地編譯程序。事實上,我知道一個很大的 UNIX 供應商就在自己內部的項目中使用 GCC ,即便該供應商也有自己的

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

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

7、如, -C89 選項只應用于 C 語言,指定適用于 1989 年的標準。 · 指定平臺 GCC 編譯程序可以為多種平臺生成目標代碼,而有些選項只能應用于為某個指定平臺生成代碼。例如,如果輸出平臺是 Intel 386 ,那么 -fp-ret-in-387 選項可用來指出要將函數調用返回的浮點數保存在硬件的浮點寄存器中。 · 普適 很多選項對所有語言和平臺都適用。例如, -O 選項指示編譯程序要優化輸出代碼。 使用編譯程序不知道的選項總會產生出錯消息。使用目標平臺不適用的選項也會產生出錯消息。 gcc 程序能夠自己處理所有已知的選項,而將未知其他選項傳遞下去來編譯指定語言。如

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

9、系統 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 (續表) 硬件 操作系統 PowerPC AIX 4.3.3 Sparc Solaris 2.7 要注意保證 GCC 可以在表 1-1 中列出的主要平臺上正確運行,而且也要很好地處理其次列在表 1-2 中的平臺。 表 1-2 GCC 應用的次要平臺 硬件 操作系統 PowerPC Linux Sparc Linux ARM Linux Intel x86 Cygw

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

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

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

13、)組合成可執行程序。 注意,前端和后端是完全分離開的。任何語言都可用語法分析器產生樹結構,而由 GCC 進行編譯。類似地,任何機器只要能將程序的樹結構翻譯成匯編語言,就能夠編譯由前端處理的所有語言。 實際操作過程絕對不像描述的那樣簡單,但這確實能夠實現。1.6 語言 GCC 可以編譯多種語言,但所有這些語言之間有個基本關系。語法分析器由于每種語言語法的惟一性而完全不同,但隨著編譯過程的前進,這些語言的代碼就越來越相似。如前所述, GNU 編譯集合可以接受任何形式編程語言的輸入,產生的輸出也可以在很多不同平臺上運行。 GCC 的基本語言是 C 語言。整個編譯系統由 C 編譯程序開始,然后漸漸加了

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

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

16、是因為它的基本能力就是快速而準確地實現復雜計算。 Fortran 甚至還將復雜的數字作為它的基本數據類型,而基本數值數據類型可具有很高的精確度。 這種語言的結構比其他的現代語言要麻煩一些,但它包含的一些基本函數和功能的實現是結構化編程所必需的。最新的 Fortran 標準在這一點上有所擴展,無疑是一種非?,F代的語言。 Java 是包含進 GCC 的最年輕的語言。 Java 語言和 C+ 一樣是基于 C 語言的,但它使用了一些不同的方法來實現類的語法。 C+ 更加靈活, Java 則是通過限制對象的構造函數和析構函數去除了 C+ 的不確定性,它繼承的是一些嚴格無歧義的形式。 Java 和 GCC

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

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

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

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

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

22、jc1 實際的 Java 編譯程序 libgcc 該庫包含的例程被作為編譯程序的一部分,是因為它們可被連接到實際的可執行程序中。它們是特殊的例程,連接到可執行程序,來執行基本的任務,例如浮點運算。這些庫中的例程通常都是平臺相關的 libgcj 運行時庫包含所有的核心 Java 類 libobjc 對所有 Objective-C 程序都必須的運行時庫 libstdc+ 運行時庫,包括定義為標準語言一部分的所有的 C+ 類和函數 表 1-4 列出的軟件和 GCC 協同工作,目的是實現編譯過程。有些是很基本的(例如 as 和 ld ),而其他一些則是非常有用但不是嚴格需要的。盡管這些工具中的很多都是

23、各種 UNIX 系統的本地工具,但還是能夠通過 GNU 包 binutils 得到大多數工具。安裝 binutils 的過程將在第 2 章中介紹。 表 1-4 GCC 使用的軟件工具 工具 描述 addr2line 給出一個可執行文件的內部地址, addr2line 使用文件中的調試信息將地址翻譯成源代碼文件名和行號。該程序是 binutils 包的一部分 ar 這是一個程序,可通過從文檔中增加、刪除和析取文件來維護庫文件。通常使用該工具是為了創建和管理連接程序使用的目標庫文檔。該程序是 binutils 包的一部分 as GNU 匯編器。實際上它是一族匯編器,因為它可以被編譯或能夠在各種不同

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

25、 GNU 軟件問題的在線系統 (續表) 工具 描述 gprof 該程序會監督編譯程序的執行過程,并報告程序中各個函數的運行時間,可以根據所提供的配置文件來優化程序。該程序是 binutils 包的一部分 ld GNU 連接程序。該程序將目標文件的集合組合成可執行程序。該程序是 binutils 包的一部分 libtool 一個基本庫,支持 make 程序的描述文件使用的簡化共享庫用法的腳本 make 一個工具程序,它會讀 makefile 腳本來確定程序中的哪個部分需要編譯和連接,然后發布必要的命令。它讀出的腳本(叫做 makefile 或 Makefile )定義了文件關系和依賴關系 nlm

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

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

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

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

30、c-testresults 測試結果和對測試以及測試結果的討論都會發到這里 java 關于 GCC 的 Java 前端的開發和維護的討論列表,以及 Java 的運行時庫的討論列表 java-patches 關于 Java 前端和 Java 運行時庫的源代碼補丁被發布到該討論組及 gcc-patches 郵件組 libstdc+ 該討論組用來討論標準 C+ 庫的開發和維護 表 1-6 GCC 的只讀郵件組 郵件組名 描述 gccadmin 該郵件組收到的消息來自 的 gccadmin 賬號運行的長時間任務 gcc-announce 該郵件列表信息較少,主要用來公布最新的版

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

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

33、專有的軟件。然而,并不限制任何人用 GCC 作為工具創建自己需要形式的軟件。變成生成程序中的二進制位以及片斷不要求該程序得到 GPL 許可。 GPL 的另一種方案是弱通用公共許可證( Lesser General Public License , LGPL )。該許可證以前叫做庫 GPL ,但這個名字由于可能產生誤導就改變了它滿足一些庫,但不會是所有庫。 LGPL 允許專有程序使用的庫例程以及共享的和非靜態連接的庫。例子就是標準 C 庫的 GNU 版本。 下面是 GPL 的文本。它用非常清楚的語言描述了許可的細節。文檔的末尾是對處理過程的描述,遵照此過程可以將自己的軟件放在 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 允許所有人復制和發布這一許可證原始文檔的副本,但絕對不允許對它進行任何修改。 導言 大 多數軟件許可剝奪你共享和修改軟件的自由。相比之下, GNU 通用公共許可力圖保證你共享和修改自由軟件的自由保證軟件對所有用戶是自由的。通用公共許可適用于大多數自由軟件協會的軟件,以及由使用這些軟件而承 擔義務的作者所開發的軟件。(自由軟件

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

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

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

38、(以下“修改”一詞包括但不限于翻譯行為)。被許可的人則稱為“您”。 本許可不適用于復制、發布及修改以外的行為;這些行為不在本許可范圍內。執行本程序的行為并不受限制,而本程序的輸出只有在其內容構成基于本程序所生的著 作(而非只是因為執行本程序所造成)時,是受到本許可約束的。至于程序輸出的內容是否構成本程序的衍生著作,則取決于本程序的具體用途。 1. 您可以對所收受的本程序源碼,無論以何種媒介,復制與發布其完整的復制品,然而您必須符合以下條件:以顯著及適當的方式在每份復制品上發布適當的著作權標 示及無擔保聲明;維持所有有關本許可以及無擔保聲明的原貌;并將本許可的副本連同本程序一起交付其他任一位程序

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

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

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

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

43、二進制格式),除非該部分本身就附加在可執行程序中。 如果可執行代碼或目標代碼的發布方式,是以指定的地點存取,供人復制,則提供可自相同地點復制源碼的使用機會,看作是對源碼的發布,然而第三人并不因此而負有將目標代碼連同源碼一起復制的義務。 4. 除本許可所明示的方式外,不得對程序加以復制、修改、再授權或發布。任何企圖以其他任何方式進行復制、修改、再授權或發布程序的行為均為無效行為,并將自 動終止您基于本許可所享有的權利。但依照本許可規定,從您手中收受復制品或權利的人,只要遵守本許可規定,他們所獲得的許可并不會因此終止。 5. 因為您并未在本許可上簽名,所以無需接受本許可。但除此之外,別無其他方式可

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

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

46、程序,而對經由此系統發布的大量軟件有相當多的貢獻;作者 / 貢獻者有權決定他或她是否希望經由其他系統發布軟件,而被授權人則無該種選擇權。 本條的用意在于將本許可其他不確定部分徹底解釋清楚。 8. 如果因為專利或版權保護的接口問題,而使得本程序的發布與 / 或使用局限于某些國家時,則將本程序置于本許可規范之下的原著作權人得增加明確的發布地區限制條款,將一些國家排除在外,而使發布的許可只限制在未排除的 國家之內。在該情況下,將限制條款如同以書面方式訂定于本許可內容中,而成為本許可的條款。 9. 自由軟件協會可以隨時發布通用公共許可的修正版和 / 或新版本。新版本在精神上將近似于目前的版本,但在細節

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

48、此在法律許可范圍內,本許可對程序不負擔責任。非經書面聲明,著作權人和 / 或其他提供程序的人,無論顯式或隱式,均是依照“現狀”提供程序而并無任何形式的擔保責任,其包含并不限于,就適售性以及特定目的的使用性為默認性擔保。 有關程序品質與效能的全部風險都由自己承擔。如果程序被證明有瑕疵,您應該承擔所有服務、修復或改正的費用。 12. 非經法律要求或書面同意,任何著作權人或任何可能依前述方式修改和 / 或發布程序的人,對于您因為使用或不能使用程序所造成的一般性、特殊性、意外性或間接性損失,不負任何責任(包括但不限于數據損失、數據執行不精確、或應 由您或第三人承擔的損失,或程序無法與其他程序運作等),

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

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

51、0, Boston, MA 02111-1307 USA 。 還應加上如何和你取得聯系的相關信息。如果程序以交互方式進行工作,當它開始進入交互方式時,使它輸出類似下面的簡短聲明: 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. 假設的命令 show c ' 及 show w ' 應顯示通用公共許可證的相應條款。當然,你使用的命令名稱可以不同于 show c ' 及 show w ' 。根據程序的具體情況,也可以用菜單或鼠標選項來顯示這些條款。 如果需要,你應該取得你的上司(如果你是程序員)或你的學校簽署放棄程序版權的聲明。下面只是一個例子,你應該改變相應的名稱: 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 這一許可證不允許你將程序并入專用程序。如果你的程序是一個子程序庫,你可能會認為用庫的方式和專用應用程序連接更有用。如果你想這樣做,使用 GNU 庫通用公共許可證代替本許可證。 有大量的環境變量可供設置以影響 GCC 編譯程序的方式。利用這些變量的控制也可使用合適的命令行選項。 一些環境變量設

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

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

56、錄名列表,查找頭文件,就好像在命令行中指定 -isystem 選項一樣。會首先查找 -isystem 指定的所有目錄。 也見 CPATH 、 C_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。 DEPENDENCIES_OUTPUT 為文件名設置該環境變量會讓預處理程序將基于依賴關系的 makefile 規則寫入文件。不會包括系統頭文件名字。 如果環境變量設置為單名,被看作是文件名字,而依賴關系規則的名字來自源文件名字。如果定義中有兩個名字,則第二個名字是用作依賴關系規則的目標名。 設置該環境變量的結果和使用命令行選項 -MM 、 -MF 和 -MT 的組合是一樣的。也見

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

溫馨提示

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

評論

0/150

提交評論