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语言描述一个算法中所产生的错误,是比较容易排除的。我们写一个程序,到编译、连接通过为止,应该说刚刚开始,程序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。一个程序,稍为复杂的程序,往往要经过多次的编译、连接和测试、修改。下面我们学习的程序维护、调试工具和版本维护就是在程序调试、测试过程中使用的,用来解决调测阶段所出现的问题。窗体顶端
窗体底端