linux的gcc編譯器
方法如下: 一:掛載yum源,在終端輸入指令:mount -o loop xxxx.iso /media/CentOS/ 說明:xxxx.iso 是你的鏡像文件名(注意路徑正確) /media/Centos/ 這個是掛載後文件地址,Centos是自己建的,也可以自己選著路徑; 二:修改/etc/yum.repos.d/CentOS-Media.repo 1.首先進入文件: vi /etc/yum.repos.d/CentOS-Media.repo 2.修改文件如下: [c6-media] name=CentOS-$releasever - Media #名字而已 baseurl=file:///media/Centos #剛剛掛載鏡像的地址 gpgcheck=1 enabled=1 gpgkey=file:///etc/media/Centos/RPM-GPG-KEY-CentOS-6 3. 退出保存。 4.輸入指令:gcc -v 看看有沒有反應。
B. Linux gcc-c++是什麼東西
Linux上的gcc是Gnu的c語言編譯器,至於C++編譯器,它的名字叫做g++。
實際上不要被這些程序名字所迷惑,以Gcc為例,它始終秉承了Linux程序設計的一個基本原則——小即是美,多個小程序共同合作的原則。實際上gcc這個程序,下麵包含了cpp(c preprocess 是c語言的預處理器)、as、ld、cc(c語言編譯器)這四個程序,實際上gcc只是一個介面程序。
C. linux瀹夎呯紪璇戝櫒linux瀹夎呯紪璇戝櫒
c++闇瑕佷笅杞界紪璇戝櫒鍚楋紵
闇瑕併俢++鏄涓闂ㄧ紪璇戝瀷鐨勭▼搴忚捐¤璦錛屽湪榪愯屼箣鍓嶅繀欏誨畬鎴愮紪璇戜換鍔★紝鎵浠ヨ佸紑鍙戝拰榪愯宑++紼嬪簭錛屽繀欏誨厛涓嬭澆瀹夎呯紪璇戝櫒銆
褰撶劧錛屽傛灉鎮ㄤ嬌鐢ㄧ殑鏄痩inux緋葷粺錛岄偅涔堟伃鍠滀綘錛岀郴緇熻嚜宸卞氨甯︾潃緙栬瘧鍣錛屽彲浠ョ洿鎺ヤ嬌鐢錛屼竴鑸鏄痝cc緙栬瘧鍣ㄣ傚笇鏈涗互涓婂彲浠ュ府鍔╁埌鎮
濡備綍瀹夎匞CC緙栬瘧鍣錛
瀹夎単cc緙栬瘧鍣ㄧ殑鏂規硶濡備笅錛
1.緇濆ぇ閮ㄥ垎鐨凩inux鍙戣岀増閮芥彁渚涗簡gcc浜岃繘鍒跺寘錛屽洜姝ゅ緢瀹規槗榪涜屽畨瑁呫
2.瀵逛簬debian緋伙紝鎵ц屼笅闈㈠懡浠ゅ畨瑁呫
sudoaptinstallgcc
3.瀵逛簬redhat緋伙紝鎵ц屼笅闈㈠懡浠ゅ畨瑁呫
sudodnfinstallgcc
4.瀵逛簬arch緋伙紝鎵ц屼笅闈㈠懡浠ゅ畨瑁咃細
sudopacman-Sgcc
瀹夎呭畬姣曞悗錛実cc緙栬瘧鍣ㄥ氨瀹夎呭畬姣曚簡銆
Linux涓嬬殑QT鏄浠涔堬紵Linux涓婥++鐢ㄤ粈涔堢紪璇戝櫒濂斤紵
Qt鏄涓涓狢++絎涓夋柟搴擄紝浣犲彲浠ヤ嬌鐢ㄥス鍐欏嚭浣犳墍鑳芥兂鍒扮殑鎵鏈夎蔣浠躲俵inux涓嬫渶娉ㄦ槑鐨勭紪璇戝櫒鏄疓CC鐩鍓嶆渶楂樼増鏈鏄4.5.2鐗堬紱linux鍙戣岀増寰堝氾紝緗戜笂鍒板勯兘鏄錛屼綘鍙浠ュ厛涓嬭澆鍐嶅埢鐩樺畨瑁咃紝寤鴻瀹夎呭墠鍏堢敤鉶氭嫙鏈虹啛鎮変竴涓嬪畨瑁呮祦紼嬫垨鑰呯洿鎺ヤ嬌鐢ㄨ櫄鎷熸満錛堝傛灉鏄瀛︿範鐨勮瘽錛夛紝涓鑸鎯呭喌涓嬶紝鎵鏈夌殑linux鍙戣岀増閮介粯璁ゅ畨瑁呭ソGCC鐨勩
LINUX涓媍pp鏂囦歡鍙浠ョ紪璇戞槸鍚﹀彲浠ヨ存槑宸茬粡瀹夎呬簡gcc緙栬瘧鍣錛
鍙浠ヨ存槑銆備綘鐩存帴浣跨敤鍛戒護whichgcc鐪嬬湅灝辯煡閬撴槸鍚﹀畨瑁呬簡gcc.涔熷彲浠ヤ嬌鐢╣cc--version鐪嬬湅鏄鍚﹀畨瑁呫
linux緙栬瘧鍣ㄥご鏂囦歡閰嶇疆錛
-I/usr/src/linux-headers-2.6.32-24/include鍏朵腑,-I鍜屽悗闈㈢殑璺寰勬病鏈夌┖鏍-I/usr/src/linux-headers-2.6.32-24/include涓鑸涔熷緢灝戠洿鎺ョ敤gcc鍛戒護,澶ч儴鍒嗘槸鐢╩akefile,make-Ckernel_pathmoles
D. linux 怎麼編譯c的源程序的gcc,編譯命令是什麼
在Linux下面,如果要編譯一個C語言源程序,我們要使用gcc編譯器。
先將源文件編譯成目標文件:gcc - c hello.c
生成hello.o文件,再將目標文件編譯成可執行文件:gcc -o hello hello.o
如:
int main(int argc,char **argv)
{
printf("Hello Linux ");
}
(4)linux的gcc編譯器擴展閱讀:
在使用GCC編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,這里只介紹其中最基本、最常用的參數。具體可參考GCC Manual。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
網路_gcc
E. 請問怎麼在虛擬機linux操作系統中安裝gcc編譯器
1. 下載
在GCC網站上( http://gcc.gnu.org/)或者通過網上搜索可以查找到下載資源。目前GCC的最新版本為 3.4.0。可供下載的文件一般有兩種形式:gcc-3.4.0.tar.gz和gcc-3.4.0.tar.bz2,只是壓縮格式不一樣,內容完全一致,下載其中一種即可。
2. 解壓縮
根據壓縮格式,選擇下面相應的一種方式解包(以下的「%」表示命令行提示符):
% tar xzvf gcc-3.4.0.tar.gz
或者
% bzcat gcc-3.4.0.tar.bz2 | tar xvf -
新生成的gcc-3.4.0這個目錄被稱為源目錄,用${srcdir}表示它。以後在出現${srcdir}的地方,應該用真實的路徑來替換它。用pwd命令可以查看當前路徑。
在${srcdir}/INSTALL目錄下有詳細的GCC安裝說明,可用瀏覽器打開index.html閱讀。
3. 建立目標目錄
目標目錄(用${objdir}表示)是用來存放編譯結果的地方。GCC建議編譯後的文件不要放在源目錄${srcdir]中(雖然這樣做也可以),最好單獨存放在另外一個目錄中,而且不能是${srcdir}的子目錄。
例如,可以這樣建立一個叫 gcc-build 的目標目錄(與源目錄${srcdir}是同級目錄):
% mkdir gcc-build
% cd gcc-build
以下的操作主要是在目標目錄 ${objdir} 下進行。
4. 配置
配置的目的是決定將GCC編譯器安裝到什麼地方(${destdir}),支持什麼語言以及指定其它一些選項等。其中,${destdir}不能與${objdir}或${srcdir}目錄相同。
配置是通過執行${srcdir}下的configure來完成的。其命令格式為(記得用你的真實路徑替換${destdir}):
% ${srcdir}/configure --prefix=${destdir} [其它選項]
例如,如果想將GCC 3.4.0安裝到/usr/local/gcc-3.4.0目錄下,則${destdir}就表示這個路徑。
在我的機器上,我是這樣配置的:
% ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java
將GCC安裝在/usr/local/gcc-3.4.0目錄下,支持C/C++和JAVA語言,其它選項參見GCC提供的幫助說明。
5. 編譯
% make
這是一個漫長的過程。在我的機器上(P4-1.6),這個過程用了50多分鍾。
6. 安裝
執行下面的命令將編譯好的庫文件等拷貝到${destdir}目錄中(根據你設定的路徑,可能需要管理員的許可權):
% make install
至此,GCC 3.4.0安裝過程就完成了。
6. 其它設置
GCC 3.4.0的所有文件,包括命令文件(如gcc、g++)、庫文件等都在${destdir}目錄下分別存放,如命令文件放在bin目錄下、庫文件在lib下、頭文件在include下等。由於命令文件和庫文件所在的目錄還沒有包含在相應的搜索路徑內,所以必須要作適當的設置之後編譯器才能順利地找到並使用它們。
6.1 gcc、g++、gcj的設置
要想使用GCC 3.4.0的gcc等命令,簡單的方法就是把它的路徑${destdir}/bin放在環境變數PATH中。我不用這種方式,而是用符號連接的方式實現,這樣做的好處是我仍然可以使用系統上原來的舊版本的GCC編譯器。
首先,查看原來的gcc所在的路徑:
% which gcc
在我的系統上,上述命令顯示:/usr/bin/gcc。因此,原來的gcc命令在/usr/bin目錄下。我們可以把GCC 3.4.0中的gcc、g++、gcj等命令在/usr/bin目錄下分別做一個符號連接:
% cd /usr/bin
% ln -s ${destdir}/bin/gcc gcc34
% ln -s ${destdir}/bin/g++ g++34
% ln -s ${destdir}/bin/gcj gcj34
這樣,就可以分別使用gcc34、g++34、gcj34來調用GCC 3.4.0的gcc、g++、gcj完成對C、C++、JAVA程序的編譯了。同時,仍然能夠使用舊版本的GCC編譯器中的gcc、g++等命令。
6.2 庫路徑的設置
將${destdir}/lib路徑添加到環境變數LD_LIBRARY_PATH中,最好添加到系統的配置文件中,這樣就不必要每次都設置這個環境變數了。
例如,如果GCC 3.4.0安裝在/usr/local/gcc-3.4.0目錄下,在RH Linux下可以直接在命令行上執行或者在文件/etc/profile中添加下面一句:
setenv LD_LIBRARY_PATH /usr/local/gcc-3.4.0/lib:$LD_LIBRARY_PATH
7. 測試
用新的編譯命令(gcc34、g++34等)編譯你以前的C、C++程序,檢驗新安裝的GCC編譯器是否能正常工作。
8. 根據需要,可以刪除或者保留${srcdir}和${objdir}目錄。
如果用的是ubuntu或者是fedora的話 可以在源里直接安裝
F. linux浣跨敤gcc緙栬瘧c璇璦紼嬪簭linux浣跨敤gcc
Linux鐨刧cc鏄鎬庝箞鐢ㄧ殑錛
鍦ㄧ粓絝涓杈撳叆gcc鏂囦歡鍚-o鐩鏍囨枃浠跺悕鐒跺悗./鐩鏍囨枃浠跺悕灝辮屼簡錛屾病鏈夌洰鏍囨枃浠跺悕錛岃嚜鍔ㄥ瓨涓篴鎵ц./a灝辮屼簡銆傚湪浣跨敤Gcc緙栬瘧鍣ㄧ殑鏃跺欙紝鎴戜滑蹇呴』緇欏嚭涓緋誨垪蹇呰佺殑璋冪敤鍙傛暟鍜屾枃浠跺悕縐般侴CC緙栬瘧鍣ㄧ殑璋冪敤鍙傛暟澶х害鏈100澶氫釜錛屽叾涓澶氭暟鍙傛暟鎴戜滑鍙鑳芥牴鏈灝辯敤鏉庣儌涓嶅埌錛岃繖閲屽彧浠嬬粛鍏朵腑鏈鍩烘湰銆佹渶甯哥敤鐨勫弬鏁般侴CC鏈鍩烘湰鐨勭敤娉曟槸鈭秅cc鍏朵腑options灝辨槸緙栬瘧鍣ㄦ墍闇瑕佺殑鍙傛暟錛宖ilenames緇欏嚭鐩稿叧鐨勬枃浠跺悕縐般-c錛屽彧緙栬瘧錛屼笉榪炴帴鎴愪負鍙鎵ц屾枃浠訛紝緙栬瘧鍣ㄥ彧鏄鐢辮緭鍏ョ殑.c絳夋簮浠g爜鏂囦歡鐢熸垚.o涓哄悗緙鐨勭洰鏍囨枃浠訛紝閫氬父鐢ㄤ簬緙栬瘧涓嶅寘鍚涓葷▼搴忕殑瀛愮▼搴忔枃浠躲-ooutput_filename錛岀『瀹氳緭鍑烘枃浠剁殑鍚嶇О涓簅utput_filename錛屽悓鏃惰繖涓鍚嶇О涓嶈兘鍜屾簮鏂囦歡鍚屽悕銆傚傛灉涓嶇粰鍑鴻繖涓閫夐」錛実cc灝辯粰鍑洪勮劇殑鍙鎵ц屾枃浠禷.out銆-g錛屼駭鐢熺﹀彿璋冭瘯宸ュ叿(GNU鐨刧db)鎵蹇呰佺殑絎﹀彿璧勮錛岃佹兂瀵規簮浠g爜榪涜岃皟璇曪紝鎴戜滑灝卞繀欏誨姞鍏ヨ繖涓閫夐」銆-O錛屽圭▼搴忚繘琛屼紭鍖栫紪璇戙佽繛鎺ワ紝閲囩敤榪欎釜閫夐」錛屾暣涓婧愪唬鐮佷細鍦ㄧ紪璇戙佽繛鎺ヨ繃紼嬩腑榪涜屼紭鍖栧勭悊錛岃繖鏍蜂駭鐢熺殑鍙鎵ц屾枃浠剁殑鎵ц屾晥鐜囧彲浠ユ彁楂橈紝浣嗘槸錛岀紪璇戙佽繛鎺ョ殑閫熷害灝辯浉搴斿湴瑕佹參涓浜涖-O2錛屾瘮-O鏇村ソ鐨勪紭鍖栫紪璇戙佽繛鎺ワ紝褰撶劧鏁翠釜緙栬瘧銆佽繛鎺ヨ繃紼嬩細鏇存參銆-Idirname錛屽皢dirname鎵鎸囧嚭鐨勭洰褰曞姞鍏ュ埌紼嬪簭澶存枃浠剁洰褰曞垪琛ㄤ腑錛屾槸鍦ㄩ勭紪璇戣繃紼嬩腑浣跨敤鐨勫弬鏁般侰紼嬪簭涓鐨勫ご鏂囦歡鍖呭惈涓ょ嶆儏鍐碘埗A)#includemyinc.h>B)#include鈥渕yinc.h鈥濆叾涓錛孉綾諱嬌鐢ㄥ皷鎷鍙(>)錛孊綾諱嬌鐢ㄥ弻寮曞彿(鈥溾)銆傚逛簬A綾伙紝棰勫勭悊紼嬪簭cpp鍦ㄧ郴緇熼勮懼寘鍚鏂囦歡鐩褰(濡/usr/include)涓鎼滃葷浉搴旂殑鏂囦歡錛岃孊綾伙紝棰勫勭悊紼嬪簭鍦ㄧ洰鏍囨枃浠剁殑鏂囦歡澶瑰唴鎼滅儲鐩稿簲鏂囦歡銆侴CC鎵ц岃繃紼嬬ず渚嬬ず渚嬩唬鐮乤.c錛#includestdio.h>intmain(){printf("hellon");}棰勭紪璇戣繃紼嬶細榪欎釜榪囩▼澶勭悊瀹忓畾涔夊拰include錛屽苟鍋氳娉曟鏌ャ傚彲浠ョ湅鍒伴勭紪璇戝悗錛屼唬鐮佷粠5琛屾墿灞曞埌浜910琛屻倈cc-Ea.c-oa.icata.c|wc-l5cata.i|wc-l910緙栬瘧榪囩▼錛氳繖涓闃舵碉紝鐢熸垚奼囩紪浠g爜銆倈cc-Sa.i-oa.scata.s|wc-l59奼囩紪榪囩▼錛氳繖涓闃舵碉紝鐢熸垚鐩鏍囦唬鐮併傛よ繃紼嬬敓鎴怑LF鏍煎紡鐨勭洰鏍囦唬鐮併倈cc-ca.s-oa.ofilea.oa.o:ELF64-bitLSBrelocatable,AMDx86-64,version1(SYSV),notstripped閾炬帴榪囩▼錛氶摼鎺ヨ繃紼嬨傜敓鎴愬彲鎵ц屼唬鐮併傞摼鎺ュ垎涓轟袱縐嶏紝涓縐嶆槸闈欐侀摼鎺ワ紝鍙﹀栦竴縐嶆槸鍔ㄦ侀摼鎺ャ備嬌鐢ㄩ潤鎬侀摼鎺ョ殑濂藉勬槸錛屼緷璧栫殑鍔ㄦ侀摼鎺ュ簱杈冨皯錛屽瑰姩鎬侀摼鎺ュ簱鐨勭増鏈涓嶄細寰堟晱鎰燂紝鍏鋒湁杈冨ソ鐨勫吋瀹規э紱緙虹偣鏄鐢熸垚鐨勭▼搴忔瘮杈冨ぇ銆備嬌鐢ㄥ姩鎬侀摼鎺ョ殑濂藉勬槸錛岀敓鎴愮殑紼嬪簭姣旇緝灝忥紝鍗犵敤杈冨皯鐨勫唴瀛樸倈cca.o-oa紼嬪簭榪愯岋細./ahello緙栬緫鏈孌礕CC緙栬瘧綆鍗曚緥瀛愮紪鍐欏備笅浠g爜錛#includestdio.h>intmain(){printf("hello,world!n");}鎵ц屾儏鍐靛備笅錛歡cc-Ehello.c-ohello.igcc-Shello.i-ohello.sgcc-chello.s-ohello.ogcchello.c-ohello./hellohello,world!
linux涓嬫庝箞瀹夎単cc錛
1銆佸湪Linux鐜澧冧笅鍙瑕佽兘閾炬帴Internet灝卞彲浠ラ氳繃鏈鍦扮殑yum婧愭潵瀹夎咃紝鍦ㄧ粓絝涓嬭緭鍏yuminstallgcc灝卞彲浠
2銆乴inux鍐呮牳鑷甯︿簡榪欎簺紜浠剁殑椹卞姩錛屾棤欏諱笅杞藉畨瑁呯殑
3銆佷綘鐢ㄧ殑鏄鉶氭嫙鏈猴紝鍙瑕佸湪瀹夎卨inux鐨勬椂鍊欒懼畾濂戒互妗ヨ繛鐨勬柟寮忓叡浜獻nternet灝卞彲浠ヤ笂緗戠殑
4銆佽繖涓榪樻病璇曡繃銆備綘鍙浠ユ悳緔涓涓嬭櫄鎷熸満涓庢湰鍦版枃浠跺叡浜鐩稿叧鐨勫叧閿瀛楄瘯涓璇
5銆佽繖涓鍙鏄涓獁arning錛屼笉鏄痚rror錛岀郴緇熷凡緇忔彁紺轟綘鍙浠ヤ互瓚呯駭鐢ㄦ埛錛堢浉褰撲簬windows涓嬬殑綆$悊鍛樻潈闄愶級鐨勬槸韜浠界櫥闄嗕簡錛岃屼笖榪樿佽懼畾瀵嗙爜
榪樻湁浠涔堢枒闂錛屽挶浠鍐嶈ㄨ
鍦╨inux涓錛屾庝箞鐢╣cc緙栬瘧鏂囦歡錛
緙栬瘧鑰佷憨鏂規硶錛氭牸寮廹cc甯哥敤鐨勯夐」鏈綆鍗曠殑鏄:gcchello.c榛樿ょ殑鎯呭喌涓嬪皢鐢熸垚a.out鐨勫彲鎵ц屾ф枃浠訛紝鍙闇瑕佸湪緇堢涓婅緭鍏./a.out灝卞彲浠ョ湅鍒版墽琛岀殑緇撴灉錛屽傛灉浣犳兂鎸囧畾鐢熸垚鐩鏍囨枃浠剁殑鍚嶅瓧閭d箞浣犲彲渚嶆壈媯浠ュ姞涓-o閫夐」,鍛戒護濡備笅:gcc-ohellohello.c鍛戒護錛歡cc-chellohello.c
鎵╁睍璧勬枡錛
gcc鍛戒護鐨勫熀鏈鐢ㄦ硶gcc鍏朵腑錛宖ilenames涓烘枃浠跺悕錛沷ptions涓虹紪璇戦夐」銆傚綋涓嶄嬌鐢ㄤ換浣曠紪璇戦夐」緙栬瘧hello.c鏃訛紝gcc灝嗕細鑷鍔ㄧ紪璇戜駭鐢熶竴涓猘.out鐨勫彲鎵ц屾枃浠訛細#lshello.c#gcchello.c#lsa.outhello.c鎵ц岋細#./a.outHello,World!浣跨敤-o緙栬瘧閫夋嫨錛屽彲浠ヤ負緙栬瘧鍚庣殑鏂囦歡鎸囧畾涓涓鍚嶅瓧錛#lsa.outhello.c#gcchello.c-ohello#lsa.outhellohello.c鎵ц岋細#./helloHello,World!娉ㄦ剰錛氫嬌鐢-o閫夐」鏃訛紝-o鍚庨潰蹇呴』璺熶竴涓鏂囦歡鍚嶏紝鍗籌細-ooutfile銆備負浜嗕究浜庢弿榪板悗闈㈢殑閫夐」錛屽垹闄hello鍜宎.out鍙鎵ц屾枃浠躲瀹夎卨inux鏃跺備綍瀹夎匞CC錛
浣犲彲鍦ㄤ綘鐨勫厜鐩樹笂鎵撅紝鏈変竴涓狦CC鍖呭拰4涓渚濊禆鏂囦歡錛歡libc-devel-2.3.4-2.13.i386.rpmcpp-3.4.4-2.i386.rpmglibc-kernheaders-2.4-9.1.98.EL.i386.rpmglibc-headers-2.3.4-2.13.i386.rpmgcc-3.4.4-2.i386.rpm濡傛病鏈夌殑璇濓紝鍙浠ョ敤緗戜笂鑷鍔ㄦ洿鏂扮殑鏂瑰紡瀹夎咃紝濡俧edora鐨勮瘽鍙鐢▂uminstallgcc榪欐潯鍛戒護鑷鍔ㄥ畨瑁呫
G. 在Linux環境下如何安裝GCC編譯器
GCC是RedHat系統自帶的軟體,只要用rpm -qf gcc就能查到GCC軟體包,找到GCC軟體包的全名,就可以用rpm -ivh 軟體包名就可以安裝了。至於音效卡,網卡,顯卡驅可以用U盤安裝,把那些驅動程序下載到U盤里,在把U盤掛載就可以安裝了。掛載的方法 mount /dev/cdrom /mnt.掛載好了之後就可以讀取裡面的內容來安裝了。實現上網的功能:把網卡驅動裝好之後,拉條網線。就可以了。
把windows里的文件傳到Linux直接用U盤就可以了,不過如果不用U盤也可以,不過那個復雜點。把WIN和LIN聯到同一區域網中。在WIN上建一個域,把LIN加到域里,再把要傳的文件掛載到LIN就可以了。WIN建好域直後把LIN加入到WIN的域中。先配置好LIN的IP地址(WIN的IP地址要和LIN的IP地址在同一網段),再把DNS指向WIN的IP地址。再到LIN裡面添加samb和wbin這2個服務。在WIN裡面打開--開始--運行--ping LINde IP地址,能PING通就沒問題。這個雖然復雜點,但是要能做通需要用到很多知識。
H. 什麼是GCC編譯器
Linux系統下的Gcc(GNU C Compiler)是GNU推出的功能強大、性能優越的多平台編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平台上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。
Gcc編譯器能將C、C++語言源程序、匯程式化序和目標程序編譯、連接成可執行文件,如果沒有給出可執行文件的名字,gcc將生成一個名為a.out的文件。在Linux系統中,可執行文件沒有統一的後綴,系統從文件的屬性來區分可執行文件和不可執行文件。而gcc則通過後綴來區別輸入文件的類別,下面我們來介紹gcc所遵循的部分約定規則。
.c為後綴的文件,C語言源代碼文件;
.a為後綴的文件,是由目標文件構成的檔案庫文件;
.C,.cc或.cxx 為後綴的文件,是C++源代碼文件;
.h為後綴的文件,是程序所包含的頭文件;
.i 為後綴的文件,是已經預處理過的C源代碼文件;
.ii為後綴的文件,是已經預處理過的C++源代碼文件;
.m為後綴的文件,是Objective-C源代碼文件;
.o為後綴的文件,是編譯後的目標文件;
.s為後綴的文件,是匯編語言源代碼文件;
.S為後綴的文件,是經過預編譯的匯編語言源代碼文件。
Gcc的執行過程
雖然我們稱Gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執行文件的過程不僅僅是編譯的過程,而是要經歷四個相互關聯的步驟∶預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。
命令gcc首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接著調用cc1進行編譯,這個階段根據輸入文件生成以.o為後綴的目標文件。匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為後綴的匯編語言源代碼文件和匯編、.s為後綴的匯編語言文件經過預編譯和匯編之後都生成以.o為後綴的目標文件。當所有的目標文件都生成之後,gcc就調用ld來完成最後的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。
Gcc的基本用法和選項
在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。Gcc編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。
Gcc最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
-c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。
-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。
-O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶
A)#include
B)#include 「myinc.h」
其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而對於B類,cpp在當前目錄中搜尋頭文件,這個選項的作用是告訴cpp,如果在當前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設計中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個使用-I選項給出搜索路徑。
-Ldirname,將dirname所指出的目錄加入到程序函數檔案庫文件的目錄列表中,是在連接過程中使用的參數。在預設狀態下,連接程序ld在系統的預設路徑中(如/usr/lib)尋找所需要的檔案庫文件,這個選項告訴連接程序,首先到-L指定的目錄中去尋找,然後到系統預設路徑中尋找,如果函數庫存放在多個目錄下,就需要依次使用這個選項,給出相應的存放目錄。
-lname,在連接時,裝載名字為「libname.a」的函數庫,該函數庫位於系統預設的目錄或者由-L選項確定的目錄下。例如,-lm表示連接名為「libm.a」的數學函數庫。
上面我們簡要介紹了gcc編譯器最常用的功能和主要參數選項,更為詳盡的資料可以參看Linux系統的聯機幫助。
假定我們有一個程序名為test.c的C語言源代碼文件,要生成一個可執行文件,最簡單的辦法就是∶
gcc test.c
這時,預編譯、編譯連接一次完成,生成一個系統預設的名為a.out的可執行文件,對於稍為復雜的情況,比如有多個源代碼文件、需要連接檔案庫或者有其他比較特別的要求,就要給定適當的調用選項參數。再看一個簡單的例子。
整個源代碼程序由兩個文件testmain.c 和testsub.c組成,程序中使用了系統提供的數學庫,同時希望給出的可執行文件為test,這時的編譯命令可以是∶
gcc testmain.c testsub.c □lm □o test
其中,-lm表示連接系統的數學庫libm.a。
Gcc的錯誤類型及對策
Gcc編譯器如果發現源程序中有錯誤,就無法繼續進行,也無法生成最終的可執行文件。為了便於修改,gcc給出錯誤資訊,我們必須對這些錯誤資訊逐個進行分析、處理,並修改相應的語言,才能保證源代碼的正確編譯連接。gcc給出的錯誤資訊一般可以分為四大類,下面我們分別討論其產生的原因和對策。
第一類∶C語法錯誤
錯誤資訊∶文件source.c中第n行有語法錯誤(syntex errror)。這種類型的錯誤,一般都是C語言的語法錯誤,應該仔細檢查源代碼文件中第n行及該行之前的程序,有時也需要對該文件所包含的頭文件進行檢查。有些情況下,一個很簡單的語法錯誤,gcc會給出一大堆錯誤,我們最主要的是要保持清醒的頭腦,不要被其嚇倒,必要的時候再參考一下C語言的基本教材。
第二類∶頭文件錯誤
錯誤資訊∶找不到頭文件head.h(Can not find include file head.h)。這類錯誤是源代碼文件中的包含頭文件有問題,可能的原因有頭文件名錯誤、指定的頭文件所在目錄名錯誤等,也可能是錯誤地使用了雙引號和尖括弧。
第三類∶檔案庫錯誤
錯誤資訊∶連接程序找不到所需的函數庫,例如∶
ld: -lm: No such file or directory
這類錯誤是與目標文件相連接的函數庫有錯誤,可能的原因是函數庫名錯誤、指定的函數庫所在目錄名稱錯誤等,檢查的方法是使用find命令在可能的目錄中尋找相應的函數庫名,確定檔案庫及目錄的名稱並修改程序中及編譯選項中的名稱。
第四類∶未定義符號
錯誤資訊∶有未定義的符號(Undefined symbol)。這類錯誤是在連接過程中出現的,可能有兩種原因∶一是使用者自己定義的函數或者全局變數所在源代碼文件,沒有被編譯、連接,或者乾脆還沒有定義,這需要使用者根據實際情況修改源程序,給出全局變數或者函數的定義體;二是未定義的符號是一個標準的庫函數,在源程序中使用了該庫函數,而連接過程中還沒有給定相應的函數庫的名稱,或者是該檔案庫的目錄名稱有問題,這時需要使用檔案庫維護命令ar檢查我們需要的庫函數到底位於哪一個函數庫中,確定之後,修改gcc連接選項中的-l和-L項。
排除編譯、連接過程中的錯誤,應該說這只是程序設計中最簡單、最基本的一個步驟,可以說只是開了個頭。這個過程中的錯誤,只是我們在使用C語言描述一個演算法中所產生的錯誤,是比較容易排除的。我們寫一個程序,到編譯、連接通過為止,應該說剛剛開始,程序在運行過程中所出現的問題,是演算法設計有問題,說得更玄點是對問題的認識和理解不夠,還需要更加深入地測試、調試和修改。一個程序,稍為復雜的程序,往往要經過多次的編譯、連接和測試、修改。下面我們學習的程序維護、調試工具和版本維護就是在程序調試、測試過程中使用的,用來解決調測階段所出現的問題。窗體頂端
窗體底端