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ǔ)言的編譯器��
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)��
我�?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è)