国产在线中文字幕亚洲,一区视频国产精品观看,欧美日韩国产高清片,久久久久久AV无码免费网站,亚洲无码一二三四五区,日韩无码www.,sese444

您好,歡迎來(lái)到維�(kù)電子市場(chǎng)�(wǎng) 登錄 | 免費(fèi)注冊(cè)

GCC
閱讀�20217�(shí)間:2010-12-02 09:10:55

  GCC,全稱為GNU Compiler Collection,目前可以編譯的�(yǔ)言包括:C,C++,Objective-C,Fortran,Java, Ada。GCC是GNU公社的一�(gè)�(xiàng)目。是一�(gè)用于編程開發(fā)的自由編譯器。最�,GCC只是一�(gè)C�(yǔ)言編譯�,他是GNU C Compiler 的英文縮�。隨著眾多自由開�(fā)者的加入和GCC自身的發(fā)�,如今的GCC以經(jīng)是一�(gè)包含眾多�(yǔ)言的編譯器��

基本�(guī)�

  gcc所遵循的部分約定規(guī)則:

  .c為后綴的文件,C�(yǔ)言源代碼文��

  .a為后綴的文件,是由目�(biāo)文件�(gòu)成的檔案�(kù)文件�

  .C�.cc�.cxx 為后綴的文件,是C++源代碼文��

  .h為后綴的文件,是程序所包含的頭文件�

  .i 為后綴的文件,是已經(jīng)�(yù)處理過的C源代碼文件;

  .ii為后綴的文件,是已經(jīng)�(yù)處理過的C++源代碼文��

  .m為后綴的文件,是Objective-C源代碼文��

  .o為后綴的文件,是編譯后的目標(biāo)文件�

  .s為后綴的文件,是匯編�(yǔ)言源代碼文��

  .S為后綴的文件,是�(jīng)過預(yù)編譯的匯編語(yǔ)言源代碼文��

命令大全

  GCC 選項(xiàng)

  GCC 有超�100�(gè)的編譯選�(xiàng)可用. 這些選項(xiàng)中的許多你可能永�(yuǎn)都不�(huì)用到, 但一些主要的選項(xiàng)將會(huì)頻繁用到. 很多� GCC 選項(xiàng)包括一�(gè)以上的字�. 因此你必須為每�(gè)選項(xiàng)指定各自的連字�, 并且就象大多�(shù) Linux 命令一樣你不能在一�(gè)單獨(dú)的連字符后跟一組選�(xiàng). 例如, 下面的兩�(gè)命令是不同的:

  gcc -p -g test.c

  gcc -pg test.c

  條命令告� GCC 編譯 test.c �(shí)� prof 命令建立剖析(profile)信息并且把調(diào)試信息加入到可執(zhí)行的文件�. 第二條命令只告訴 GCC � gprof 命令建立剖析信息.

  �(dāng)你不用任何選�(xiàng)編譯一�(gè)程序�(shí), GCC 將會(huì)建立(假定編譯成功)一�(gè)名為 a.out 的可�(zhí)行文�. 例如, 下面的命令將在當(dāng)前目錄下�(chǎn)生一�(gè)� a.out 的文�:

  gcc test.c

  你能� -o 編譯選項(xiàng)�(lái)為將�(chǎn)生的可執(zhí)行文件指定一�(gè)文件名來(lái)代替 a.out. 例如, 將一�(gè)� count.c � C 程序編譯為名� count 的可�(zhí)行文�, 你將輸入下面的命�:

  gcc -o count count.c

  注意: �(dāng)你使� -o 選項(xiàng)�(shí), -o 后面必須跟一�(gè)文件�. -c 只編譯并生成目標(biāo)文件�

  --------------------------------------------------------------------------------

  gcc and g++分別是gnu的c & c++編譯� gcc/g++在執(zhí)行編譯工作的�(shí)�,總共需�4�

  1.�(yù)處理,生成.i的文� [�(yù)處理器cpp]

  2.將預(yù)處理后的文件不轉(zhuǎn)換成匯編�(yǔ)言,生成文件.s[編譯器egcs]

  3.有匯編變?yōu)槟繕?biāo)代碼(�(jī)器代�)� �.o的文件[匯編器as]

  4.連接目標(biāo)代碼,生成可執(zhí)行程序[鏈接器ld]

  [參數(shù)詳解]

  -x language filename

  �(shè)定文件所使用的語(yǔ)言,使后綴名�(wú)�,�(duì)以后的多�(gè)有效.也就是根�(jù)約定C�(yǔ)言的后

  綴名稱是.c�,而C++� 后綴名是.C或�.cpp,如果你很�(gè)�,決定你的C代碼文件的后�

  名是.pig 哈哈,那你就要用這�(gè)參數(shù),這�(gè)參數(shù)�(duì)他后面的文件名都起作�,除非到�

  下一�(gè)參數(shù)的使��

  可以使用的參�(shù)嗎有下面的這些

  `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a

  ssembler-with-cpp'.

  看到英文,應(yīng)該可以理解的�

  例子用法:

  gcc -x c hello.pig

  -x none filename

  �(guān)掉上一�(gè)選項(xiàng),也就是讓gcc根據(jù)文件名后綴,自動(dòng)�(shí)� 文件類型

  例子用法:

  gcc -x c hello.pig -x none hello2.c

  -c

  只激活預(yù)處理,編譯,和匯�,也就是他只把程序做成obj文件

  例子用法:

  gcc -c hello.c

  他將生成.o的obj文件

  -S

  只激活預(yù)處理和編�,就是指把文件編譯成為匯編代��

  例子用法

  gcc -S hello.c

  他將生成.s的匯編代�,你可以用文本編輯器察看

  -E

  只激活預(yù)處理,這�(gè)不生成文 �,你需要把它重定向到一�(gè)輸出文件里面.

  例子用法:

  gcc -E hello.c > pianoapan.txt

  gcc -E hello.c | more

  慢慢看吧,一�(gè)hello word 也要與處理成800行的代碼

  -o

  制定目標(biāo)名稱,缺省的時(shí)�,gcc 編譯出來(lái)的文件是a.out,很難�,如果你和我有同感

  ,改掉它,哈哈

  例子� �

  gcc -o hello.exe hello.c (�,windows用習(xí)慣了)

  gcc -o hello.asm -S hello.c

  -pipe

  使用管道代替編譯中臨�(shí)文件,在使用非gnu匯編工具的時(shí)�,可能有些問題

  gcc -pipe -o hello.exe hello.c

  -ansi

  �(guān)閉gnu c中與ansi c不兼容的特�,激活ansi c的專有特�(包括禁止一些asm inl

  ine typeof�(guān)鍵字,以及UNIX,vax等預(yù)處理�,

  -fno-asm

  此選�(xiàng)�(shí)�(xiàn)ansi選項(xiàng)的功能的一部分,它禁止將asm,inline和typeof用作�(guān)鍵字�

  -fno-strict-prototype

  只對(duì)g++起作�,使用這�(gè)選項(xiàng),g++將對(duì)不帶參數(shù)的函�(shù),都認(rèn)為是沒有顯式的對(duì)參數(shù)

  的�(gè)�(shù)和類型說(shuō)�,而不是沒有參�(shù).

  而gcc�(wú)論是否使用這�(gè)參數(shù),都將�(duì)沒有帶參�(shù)的函�(shù),�(rèn)為城沒有顯式�(shuō)明的類型

  -fthis-is-varialble

  就是向傳�(tǒng)c++看齊,可以使用this�(dāng)一般變量使�.

  -fcond-mismatch

  允許條件 表達(dá)式的第二和第三參�(shù)類型不匹�,表達(dá)式的值將為void類型

  -funsigned-char

  -fno-signed-char

  -fsigned-char

  -fno-unsigned-char

  這四�(gè)參數(shù)是對(duì)char類型�(jìn)行設(shè)�,決定� char類型�(shè)置成unsigned char(前兩�(gè)�

  �(shù))或� signed char(后兩�(gè)參數(shù))

  -include file

  包含某�(gè)代碼,�(jiǎn)單來(lái)�(shuō),就是便以某�(gè)文件,需要另一�(gè)文件的時(shí)�,就可以用它設(shè)

  �,功能就相�(dāng)于在代碼中使 �#include<filename>

  例子用法:

  gcc hello.c -include /root/pianopan.h

  -imacros file

  將file文件的宏,�(kuò)展到gcc/g++的輸入文 �,宏定義本身并不出�(xiàn)在輸入文件中

  -Dmacro

  相當(dāng)于C�(yǔ)言中的#define macro

  -Dmacro=defn

  相當(dāng)于C�(yǔ)言中的#define macro=defn

  -Umacro

  相當(dāng)于C�(yǔ)言� �#undef macro

  -undef

  取消�(duì)任何非標(biāo)�(zhǔn)宏的定義

  -Idir

  在你� �#include"file"的時(shí)�,gcc/g++�(huì)先在�(dāng)前目錄查找你所制定的頭文件,�

  果沒有找�,他回到缺省的頭文件目錄找,如果� �-I制定了目�,�

  回先在你所制定的目錄查�,然后再按常規(guī)的順序去�.

  �(duì) �#include<file>,gcc/g++�(huì)�-I制定的目錄查�,查找不到,然后將到系統(tǒng)的缺

  省的頭文件目錄查�

  -I-

  就是取消前一�(gè)參數(shù)的功�,所以一般在-Idir之后使用

  -idirafter dir

  �-I的目錄里面查找失�,講到這�(gè)目錄里面查找.

  -iprefix prefix

  -iwithprefix dir

  一般一起使�,�(dāng)-I的目錄查找失�,�(huì)到prefix+dir下查�

  -nostdinc

  � 編譯器不再系�(tǒng)缺省的頭文件目錄里面找頭文件,一般和-I�(lián)合使�,明確限定�

  文件的位�

  -nostdin C++

  �(guī)定不在g++指定的標(biāo)�(zhǔn)路經(jīng)中搜�,但仍在其他路徑中搜索,.此選�(xiàng)在創(chuàng)libg++�(kù)

  使用

  -C

  � �(yù)處理的時(shí)�,不刪除注釋信�,一般和-E使用,有時(shí)候分析程�,用這�(gè)很方便的

  -M

  生成文件�(guān)�(lián)的信 息。包含目�(biāo)文件所依賴的所有源代碼你可以用gcc -M hello.c

  �(lái)�(cè)試一�,很�(jiǎn)��

  -MM

  和上面的那�(gè)一樣,但是它將忽略�#include<file>造成的依賴關(guān)��

  -MD

  �-M相同� 但是輸出將導(dǎo)入到.d的文件里�

  -MMD

  �-MM相同,但是輸出將�(dǎo)入到.d的文件里�

  -Wa,option

  此選�(xiàng)傳遞option給匯編程�;如果option中間有逗號(hào),就將option分成多�(gè)選項(xiàng),�

  后傳遞給�(huì)匯編程序

  -Wl.option

  此選�(xiàng)傳遞option給連接程序;如果option中間有逗號(hào),就將option分成多�(gè)選項(xiàng),�

  � 傳遞給會(huì)連接程序.

  -llibrary

  制定編譯的時(shí)候使用的�(kù)

  例子用法

  gcc -lcurses hello.c

  使用ncurses�(kù)編譯程序

  -Ldir

  制定編譯的時(shí)�,搜索庫(kù) 的路徑。比如你自己的庫(kù),可以用它制定目錄,不然

  編譯器將只在�(biāo)�(zhǔn)�(kù)的目錄找。這�(gè)dir就是目錄的名��

  -O0

  -O1

  -O2

  -O3

  編譯器的�(yōu)化選�(xiàng)�4�(gè)�(jí)��-O0表示沒有�(yōu)�,-O1為缺省��-O3�(yōu)化級(jí)�

  -g

  只是編譯�,在編譯的時(shí)候,�(chǎn)生調(diào)試信��

  -gstabs

  此選 �(xiàng)以stabs格式聲稱�(diào)試信�,但是不包括gdb�(diào)試信�.

  -gstabs+

  此選�(xiàng)以stabs格式聲稱�(diào)試信 �,并且包含僅供gdb使用的額外調(diào)試信�.

  -ggdb

  此選�(xiàng)將盡可能的生成gdb的可以使用的�(diào)試信�.

  -static

  此選�(xiàng)將禁止使用動(dòng)�(tài)�(kù),所�,編譯出�(lái)的東�,一般都很大,也不需要什�

  �(dòng)�(tài)連接�(kù),就可以�(yùn)�.

  -share

  此選�(xiàng)將盡量使用動(dòng)�(tài)�(kù),所以生成文件比較小,但是需要系�(tǒng)由動(dòng)�(tài)�(kù).

  -traditional

  試圖讓編譯器支持傳統(tǒng)的C�(yǔ)言 特�

  [參考資料]

  -Linux/UNIX編程

  中科紅旗軟件技�(shù)有限公司編著.清華大學(xué)出版社出�

  -Gcc man page

  [ChangeLog]

  -2002-08-10

  ver 0.1 �(fā)布最初的文檔

  -2002-08-11

  ver 0.11 修改文檔格式

  -2002-08-12

  ver 0.12 加入了對(duì)靜態(tài)�(kù),動(dòng)�(tài)�(kù)的參�(shù)

  -2002-08-16

  ver 0.16 增加了gcc編譯�4�(gè)階段的命�

  �(yùn)� gcc/egcs

  **********�(yùn)� gcc/egcs***********************

  GCC � GNU � C � C++ 編譯�。實(shí)際上,GCC 能夠編譯三種�(yǔ)言:C、C++ � O

  bject C(C �(yǔ)言的一種面�?qū)ο髷U(kuò)展)。利� gcc 命令可同�(shí)編譯并連接 C � C++

  � 程序�

  如果你有兩�(gè)或少�(shù)幾�(gè) C 源文�,也可以方便地利� GCC 編譯、連接并生成可

  �(zhí)行文�。例如,假設(shè)你有兩�(gè)源文� main.c � factorial.c 兩�(gè)源文�,現(xiàn)在要�

  譯生成一�(gè)�(jì)算階乘的程序�

  代碼:

  -----------------------

  清單 factorial.c

  -----------------------

  int factorial (int n)

  {

  if (n <= 1)

  return 1;

  else

  return factorial (n - 1) * n;

  }

  -----------------------

  清單 main.c

  -----------------------

  #include <stdio.h>

  #include <unistd.h>

  int factorial (int n);

  int main (int argc, char **argv)

  {

  int n;

  if (argc < 2)

  {

  printf ("Usage: %s n\n", argv [0]);

  return -1;

  }

  else

  {

  n = atoi (argv[1]);

  printf ("Factorial of %d is %d.\n", n, factorial (n));

  }

  return 0;

  }

  -----------------------

  利用如下的命令可 編譯生成可執(zhí)行文�,并�(zhí)行程序:

  $ gcc -o factorial main.c factorial.c

  $ ./factorial 5

  Factorial of 5 is 120.

  GCC 可同�(shí)用來(lái)編譯 C 程序� C++ 程序。一般來(lái)�(shuō),C 編譯器通過源文件的后綴

  名來(lái)判斷� C 程序還是 C++ 程序。在 Linux �,C 源文件的后綴名為 .c,� C++ �

  文件的后綴名� .C � .cpp。但是,gcc 命令只能編譯 C++ 源文�,而不能自�(dòng)� C

  ++ 程序使用的庫(kù)連接。因�,通常使用 g++ 命令�(lái)完成 C++ 程序的編譯和連接,該�

  序會(huì)自動(dòng)�(diào)� gcc �(shí)�(xiàn)編譯。假�(shè)我們有一�(gè)如下� C++ 源文件(hello.C):

  #include <iostream>

  void main (void)

  {

  cout << "Hello, world!" << endl;

  }

  則可以如下調(diào)� g++ 命令編譯、連接并生成可�(zhí)行文件:

  $ g++ -o hello hello.C

  $ ./hello

  Hello, world!

  **********************gcc/egcs 的主要選�(xiàng)*********

  gcc 命令的常用選�(xiàng)

  選項(xiàng) 解釋

  -ansi 只支� ANSI �(biāo)�(zhǔn)� C �(yǔ)�。這一選項(xiàng)將禁� GNU C 的某些特色,

  例如 asm � typeof �(guān)鍵詞�

  -c 只編譯并生成目標(biāo)文件�

  -DMACRO 以字符串�1”定� MACRO ��

  -DMACRO=DEFN 以字符串“DEFN”定� MACRO 宏�

  -E 只運(yùn)� C �(yù)編譯��

  -g 生成�(diào)試信�。GNU �(diào)試器可利用該信息�

  -IDIRECTORY 指定額外的頭文件搜索路徑DIRECTORY�

  -LDIRECTORY 指定額外的函�(shù)�(kù)搜索路徑DIRECTORY�

  -lLIBRARY 連接�(shí)搜索指定的函�(shù)�(kù)LIBRARY�

  -m486 針對(duì) 486 �(jìn)行代碼優(yōu)��

  -o FILE 生成指定的輸出文件。用在生成可�(zhí)行文件時(shí)�

  -O0 不�(jìn)行優(yōu)化處��

  -O � -O1 �(yōu)化生成代��

  -O2 �(jìn)一步優(yōu)��

  -O3 � -O2 更�(jìn)一步優(yōu)化,包括 inline 函數(shù)�

  -shared 生成共享目標(biāo)文件。通常用在建立共享�(kù)�(shí)�

  -static 禁止使用共享連接�

  -UMACRO 取消�(duì) MACRO 宏的定義�

  -w 不生成任何警告信��

  -Wall 生成所有警告信��

基本特�

 ?、貵CC是一�(gè)可移植的編譯�,可以運(yùn)行在�(dāng)前的很多平臺(tái)上,也可以為大部分的平臺(tái)編譯程序�

 ?、贕CC不是一�(gè)本地編譯�??梢栽谝粋€(gè)平臺(tái)上編譯另一�(gè)平臺(tái)�(yùn)行的軟件。例如可以在windows平臺(tái)上編譯Linux的可�(zhí)行文��

  ③GCC支持多種�(yǔ)言,甚至可以交叉編譯不同語(yǔ)言�

 ?、蹽CC是模塊化�,當(dāng)出現(xiàn)新的�(yǔ)言,只需要為GCC開發(fā)一�(gè)支持該語(yǔ)言的前�,GCC即可支持該語(yǔ)言�

  ⑤GCC是一�(gè)免費(fèi)自由軟件,你可以免費(fèi)使用GCC,也可以自己修改GCC的內(nèi)��

和G++的區(qū)�

  我�?cè)诰幾gc/c++代碼的時(shí)�,有人用gcc,有人用g++,于是各種說(shuō)法都�(lái)了,譬如c代碼用gcc,而c++代碼用g++,或者說(shuō)編譯用gcc,鏈接用g++,一�(shí)也不知哪�(gè)�(shuō)法正�,如果再遇上�(gè)extern "C",分歧就更多�,這里我想作�(gè)了結(jié),畢竟知�(shí)的目的是令人更清醒,而不是更糊涂�

  誤區(qū)一:gcc只能編譯c代碼,g++只能編譯c++代碼

  兩者都可以,但是請(qǐng)注意�

  1.后綴�.c�,gcc把它�(dāng)作是C程序,而g++�(dāng)作是c++程序;后綴為.cpp�,兩者都�(huì)�(rèn)為是c++程序,注�,雖然c++是c的超�,但是兩者對(duì)�(yǔ)法的要求是有區(qū)別的,例如:

  #include <stdio.h>

  int main(int argc, char* argv[]) {

  if(argv == 0) return;

  printString(argv);

  return;

  }

  int printString(char* string) {

  sprintf(string, "This is a test.\n");

  }

  如果按照C的語(yǔ)法規(guī)則,OK,沒問題,但�,一旦把后綴改為cpp,立刻報(bào)三�(gè)�(cuò):“printString未定義��

  “cannot convert `char**' to `char*��

  ”return-statement with no value��

  分別�(duì)�(yīng)前面紅色�(biāo)注的部分??梢奀++的語(yǔ)法規(guī)則更加嚴(yán)�(jǐn)一��

  2.編譯階段,g++�(huì)�(diào)用gcc,對(duì)于c++代碼,兩者是等價(jià)�,但是因?yàn)間cc命令不能自動(dòng)和C++程序使用的庫(kù)�(lián)接,所以通常用g++�(lái)完成鏈接,為了統(tǒng)一起見,干脆編�/鏈接�(tǒng)�(tǒng)用g++�,這就給人一種錯(cuò)覺,好像cpp程序只能用g++似的�

  誤區(qū)�:gcc不會(huì)定義__cplusplus�,而g++�(huì)

  �(shí)際上,這�(gè)宏只是標(biāo)志著編譯器將�(huì)把代碼按C還是C++�(yǔ)法來(lái)解釋,如上所�,如果后綴為.c,并且采用gcc編譯器,則該宏就是未定義�,否�,就是已定義�

  誤區(qū)�:編譯只能用gcc,鏈接只能用g++

  �(yán)格來(lái)�(shuō),這句話不算錯(cuò)�,但是它混淆了概�,應(yīng)該這樣�(shuō):編譯可以用gcc/g++,而鏈接可以用g++或者gcc -lstdc++。因?yàn)間cc命令不能自動(dòng)和C++程序使用的庫(kù)�(lián)接,所以通常使用g++�(lái)完成�(lián)�。但在編譯階�,g++�(huì)自動(dòng)�(diào)用gcc,二者等�(jià)�

  誤區(qū)�:extern "C"與gcc/g++有關(guān)�

  �(shí)際上并無(wú)�(guān)系,�(wú)論是gcc還是g++,用extern "c"�(shí),都是以C的命名方式來(lái)為symbol命名,否�,都以c++方式命名。試�(yàn)如下�

  me.h�

  extern "C" void CppPrintf(void);

  me.cpp:

  #include <iostream>

  #include "me.h"

  using namespace std;

  void CppPrintf(void)

  {

  cout << "Hello\n";

  }

  test.cpp:

  #include <stdlib.h>

  #include <stdio.h>

  #include "me.h"

  int main(void)

  {

  CppPrintf();

  return 0;

  }

  1. 先給me.h加上extern "C",看用gcc和g++命名有什么不�

  [root@root G++]# g++ -S me.cpp

  [root@root G++]# less me.s

  .globl _Z9CppPrintfv        //注意此函�(shù)的命�

  .type   CppPrintf, @function

  [root@root GCC]# gcc -S me.cpp

  [root@root GCC]# less me.s

  .globl _Z9CppPrintfv        //注意此函�(shù)的命�

  .type   CppPrintf, @function

  完全相同�

  2. 去掉me.h中extern "C",看用gcc和g++命名有什么不�

  [root@root GCC]# gcc -S me.cpp

  [root@root GCC]# less me.s

  .globl _Z9CppPrintfv        //注意此函�(shù)的命�

  .type   _Z9CppPrintfv, @function

  [root@root G++]# g++ -S me.cpp

  [root@root G++]# less me.s

  .globl _Z9CppPrintfv        //注意此函�(shù)的命�

  .type   _Z9CppPrintfv, @function

  完全相同�

  【結(jié)論】完全相同,可見extern "C"與采用gcc/g++并無(wú)�(guān)�,以上的試驗(yàn)還間接的印證了前面的�(shuō)法:在編譯階�,g++是調(diào)用gcc��

安裝

  目前,GCC可以用來(lái)編譯C/C++、FORTRAN、JAVA、OBJC、ADA等語(yǔ)言的程序,可根�(jù)需要選擇安裝支持的�(yǔ)言。本文以在Redhat Linux上安裝GCC4.1.2為例(因在�(xiàng)目開�(fā)過程中要求使�,沒有用的GCC版本),介紹GCC的安裝過��

  安裝之前,系�(tǒng)中必須要有cc或者gcc等編譯器,并且是可用�,或者用�(huán)境變量CC指定系統(tǒng)上的編譯�。如果系�(tǒng)上沒有編譯器,不能安裝源代碼形式的GCC 4.1.2。如果是這種情況,可以在�(wǎng)上找一�(gè)與你系統(tǒng)相適�(yīng)的如RPM等二�(jìn)制形式的GCC軟件包來(lái)安裝使用。本文介紹的是以源代碼形式提供的GCC軟件包的安裝過程,軟件包本身和其安裝過程同樣適用于其它Linux和Unix系統(tǒng)�

  系統(tǒng)上原�(lái)的GCC編譯器可能是把gcc等命令文�、庫(kù)文件、頭文件等分別存放到系統(tǒng)中的不同目錄下的。與此不�,現(xiàn)在GCC建議我們將一�(gè)版本的GCC安裝在一�(gè)單獨(dú)的目錄下。這樣做的好處是將�(lái)不需要它的時(shí)候可以方便地刪除整�(gè)目錄即可(因?yàn)镚CC沒有uninstall功能�;缺�(diǎn)是在安裝完成后要做一些設(shè)置工作才能使編譯器工作正�。在本文中采用這�(gè)方案安裝GCC 4.1.2,并且在安裝完成后,仍然能夠使用原來(lái)低版本的GCC編譯�,即一�(gè)系統(tǒng)上可以同�(shí)存在并使用多�(gè)版本的GCC編譯器�

  按照本文提供的步驟和�(shè)置選�(xiàng),即使以前沒有安裝過GCC,也可以在系�(tǒng)上安裝上一�(gè)可工作的新版本的GCC編譯��

  1. 下載

  在GCC�(wǎng)站上或者通過�(wǎng)上搜索可以查找到下載資源。目前GCC的版本為 4.2.1??晒┫螺d的文件一般有兩種形式:gcc-4.1.2.tar.gz和gcc-4.1.2.tar.bz2,只是壓縮格式不一樣,�(nèi)容完全一�,下載其中一種即可�

  2. 解壓�

  拷貝gcc-4.1.2.tar.bz2(我下載的壓縮文件)�/usr/local/src(根據(jù)自己喜好選擇)�,根據(jù)壓縮格式,選擇下面相�(yīng)的一種方式解包(以下的�%”表示命令行提示符)�

  % tar zxvf gcc-4.1.2.tar.gz

  或�

  % bzcat gcc-4.1.2.tar.bz2 | tar xvf -

  新生成的gcc-4.1.2這�(gè)目錄被稱為源目錄,用${srcdir}表示�。以后在出現(xiàn)${srcdir}的地�,應(yīng)該用真實(shí)的路徑來(lái)替換�。用pwd命令可以查看�(dāng)前路徑�

  �${srcdir}/INSTALL目錄下有詳細(xì)的GCC安裝�(shuō)�,可用瀏覽器打開index.html閱讀�

  3. 建立目標(biāo)目錄

  目標(biāo)目錄(用${objdir}表示)是用來(lái)存放編譯�(jié)果的地方。GCC建議編譯后的文件不要放在源目�${srcdir]中(雖然這樣做也可以�,單�(dú)存放在另外一�(gè)目錄�,而且不能�${srcdir}的子目錄�

  例如,可以這樣建立一�(gè)� /usr/local/gcc-4.1.2的目�(biāo)目錄�

  % mkdir /usr/local/gcc-4.1.2

  % cd gcc-4.1.2

  以下的操作主要是在目�(biāo)目錄 ${objdir} 下�(jìn)��

  4. 配置

  配置的目的是決定將GCC編譯器安裝到什么地方(${destdir}�,支持什么語(yǔ)言以及指定其它一些選�(xiàng)�。其��${destdir}不能�${objdir}�${srcdir}目錄相同�

  配置是通過�(zhí)�${srcdir}下的configure�(lái)完成的。其命令格式為(記得用你的真�(shí)路徑替換${destdir}):

  % ${srcdir}/configure --prefix=${destdir} [其它選項(xiàng)]

  例如,如果想將GCC 4.1.2安裝�/usr/local/gcc-4.1.2目錄下,�${destdir}就表示這�(gè)路徑�

  在我的機(jī)器上,我是這樣配置的:

  % ../gcc-4.1.2/configure --prefix=/usr/local/gcc-4.1.2 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java

  將GCC安裝�/usr/local/gcc-4.1.2目錄下,支持C/C++和JAVA�(yǔ)言,其它選�(xiàng)參見GCC提供的幫助說(shuō)��

  5. 編譯

  % make

  6. 安裝

  �(zhí)行下面的命令將編譯好的庫(kù)文件等拷貝到${destdir}目錄中(根據(jù)你設(shè)定的路徑,可能需要管理員的權(quán)限)�

  % make install

  至此,GCC 4.1.2安裝過程就完成了�

  6. 其它�(shè)�

  GCC 4.1.2的所有文�,包括命令文件(如gcc、g++�、庫(kù)文件等都�${destdir}目錄下分別存�,如命令文件放在bin目錄�、庫(kù)文件� lib下、頭文件在include下等。由于命令文件和�(kù)文件所在的目錄還沒有包含在相應(yīng)的搜索路徑內(nèi),所以必須要作適�(dāng)?shù)脑O(shè)置之后編譯器才能順利地找到并使用它��

  6.1 gcc、g++、gcj的設(shè)�

  要想使用GCC 4.1.2的gcc等命令,�(jiǎn)單的方法就是把它的路�${destdir}/bin放在�(huán)境變量PATH�。我不用這種方式,而是用符�(hào)連接的方式實(shí)�(xiàn),這樣做的好處是我仍然可以使用系統(tǒng)上原�(lái)的舊版本的GCC編譯��

  首先,查看原�(lái)的gcc所在的路徑�

  % which gcc

  在我的系�(tǒng)�,上述命令顯示:/usr/bin/gcc。因�,原�(lái)的gcc命令�/usr/bin目錄�。我們可以把GCC 4.1.2中的gcc、g++、gcj等命令在/usr/bin目錄下分別做一�(gè)符號(hào)連接�

  % cd /usr/bin

  % ln -s ${destdir}/bin/gcc gcc412

  % ln -s ${destdir}/bin/g++ g++412

  % ln -s ${destdir}/bin/gcj gcj412

  這樣,就可以分別使用gcc412、g++412、gcj412�(lái)�(diào)用GCC 4.1.2的gcc、g++、gcj完成�(duì)C、C++、JAVA程序的編譯了。同�(shí),仍然能夠使用舊版本的GCC編譯器中的gcc、g++等命��

  6.2 �(kù)路徑的設(shè)�

  �${destdir}/lib路徑添加到環(huán)境變量LD_LIBRARY_PATH中,例如,如果GCC 4.1.2安裝�/usr/local/gcc-4.1.2目錄�,在RH Linux下可以直接在命令行上�(zhí)�

  % export LD_LIBRARY_PATH=/usr/local/gcc-4.1.2/lib

  添加到系�(tǒng)的配置文件中,這樣就不必要每次都設(shè)置這�(gè)�(huán)境變量了,在文�$HOME/.bash_profile中添加下面兩句:

  LD_LIBRARY_PATH=/usr/local/gcc-4.1.2/lib:$LD_LIBRARY_PATH

  export LD_LIBRARY_PATH

  重啟系統(tǒng)�(shè)置生效,或者執(zhí)行命�

  % source $HOME/.bash_profile

  7. �(cè)�

  用新的編譯命令(gcc412、g++412等)編譯你以前的C、C++程序,檢�(yàn)新安裝的GCC編譯器是否能正常工作�

維庫(kù)電子通,電子知識(shí),一查百��

已收錄詞�154130�(gè)

泰安�| 扬州�| 沧州�| 尼木�| 龙泉�| 高密�| 万安�| 株洲�| 尼玛�| 庆城�| 淮阳�| 宿迁�| 惠东�| 辰溪�| 潜山�| 射洪�| 金平| 都安| 怀化市| 郑州�| 西昌�| 竹溪�| 五峰| 泗洪�| 穆棱�| 鄢陵�| 青岛�| 常德�| 连州�| 辽阳�| 米脂�| 屯留�| 米泉�| 上饶�| 西峡�| 建德�| 邵武�| 拉萨�| 兴隆�| 吴旗�| 加查�|