锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
gcc and g++鍒嗗埆鏄痝nu鐨刢 & c++緙栬瘧鍣?gcc/g++鍦ㄦ墽琛岀紪璇戝伐浣滅殑鏃跺欙紝鎬誨叡闇瑕?姝?
1.棰勫鐞?鐢熸垚.i鐨勬枃浠禰棰勫鐞嗗櫒cpp]
2.灝嗛澶勭悊鍚庣殑鏂囦歡涓嶈漿鎹㈡垚姹囩紪璇█,鐢熸垚鏂囦歡.s[緙栬瘧鍣╡gcs]
3.鏈夋眹緙栧彉涓虹洰鏍囦唬鐮?鏈哄櫒浠g爜)鐢熸垚.o鐨勬枃浠禰姹囩紪鍣╝s]
4.榪炴帴鐩爣浠g爜,鐢熸垚鍙墽琛岀▼搴廩閾炬帴鍣╨d]
[鍙傛暟璇﹁В]
-x language filename
銆 璁懼畾鏂囦歡鎵浣跨敤鐨勮璦,浣垮悗緙鍚嶆棤鏁?瀵逛互鍚庣殑澶氫釜鏈夋晥.涔熷氨鏄牴鎹害瀹欳璇█鐨勫悗
緙鍚嶇О鏄?c鐨勶紝鑰孋++鐨勫悗緙鍚嶆槸.C鎴栬?cpp,濡傛灉浣犲緢涓э紝鍐沖畾浣犵殑C浠g爜鏂囦歡鐨勫悗緙
鍚嶆槸.pig 鍝堝搱錛岄偅浣犲氨瑕佺敤榪欎釜鍙傛暟,榪欎釜鍙傛暟瀵逛粬鍚庨潰鐨勬枃浠跺悕閮借搗浣滅敤錛岄櫎闈炲埌浜?
涓嬩竴涓弬鏁扮殑浣跨敤銆?
銆銆鍙互浣跨敤鐨勫弬鏁板悧鏈変笅闈㈢殑榪欎簺
銆銆`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a
ssembler-with-cpp'.
銆銆鐪嬪埌鑻辨枃錛屽簲璇ュ彲浠ョ悊瑙g殑銆?
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -x c hello.pig
銆銆
-x none filename
銆銆鍏蟲帀涓婁竴涓夐」錛屼篃灝辨槸璁ゞcc鏍規(guī)嵁鏂囦歡鍚嶅悗緙錛岃嚜鍔ㄨ瘑鍒枃浠剁被鍨?
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -x c hello.pig -x none hello2.c
銆銆
-c
銆銆鍙縺媧婚澶勭悊,緙栬瘧,鍜屾眹緙?涔熷氨鏄粬鍙妸紼嬪簭鍋氭垚obj鏂囦歡
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -c hello.c
銆銆浠栧皢鐢熸垚.o鐨刼bj鏂囦歡
-S
銆銆鍙縺媧婚澶勭悊鍜岀紪璇戯紝灝辨槸鎸囨妸鏂囦歡緙栬瘧鎴愪負(fù)姹囩紪浠g爜銆?
銆銆渚嬪瓙鐢ㄦ硶
銆銆gcc -S hello.c
銆銆浠栧皢鐢熸垚.s鐨勬眹緙栦唬鐮侊紝浣犲彲浠ョ敤鏂囨湰緙栬緫鍣ㄥ療鐪?
-E
銆銆鍙縺媧婚澶勭悊,榪欎釜涓嶇敓鎴愭枃浠?浣犻渶瑕佹妸瀹冮噸瀹氬悜鍒頒竴涓緭鍑烘枃浠墮噷闈?
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc -E hello.c > pianoapan.txt
銆銆gcc -E hello.c | more
銆銆鎱㈡參鐪嬪惂,涓涓猦ello word 涔熻涓庡鐞嗘垚800琛岀殑浠g爜
-o
銆銆鍒跺畾鐩爣鍚嶇О,緙虹渷鐨勬椂鍊?gcc 緙栬瘧鍑烘潵鐨勬枃浠舵槸a.out,寰堥毦鍚?濡傛灉浣犲拰鎴戞湁鍚屾劅
錛屾敼鎺夊畠,鍝堝搱
銆銆渚嬪瓙鐢ㄦ硶
銆銆gcc -o hello.exe hello.c (鍝?windows鐢ㄤ範(fàn)鎯簡)
銆銆gcc -o hello.asm -S hello.c
-pipe
銆銆浣跨敤綆¢亾浠f浛緙栬瘧涓復(fù)鏃舵枃浠?鍦ㄤ嬌鐢ㄩ潪gnu姹囩紪宸ュ叿鐨勬椂鍊?鍙兘鏈変簺闂
銆銆gcc -pipe -o hello.exe hello.c
-ansi
銆銆鍏抽棴gnu c涓笌ansi c涓嶅吋瀹圭殑鐗規(guī)?嬋媧籥nsi c鐨勪笓鏈夌壒鎬?鍖呮嫭紱佹涓浜沘sm inl
ine typeof鍏抽敭瀛?浠ュ強(qiáng)UNIX,vax絳夐澶勭悊瀹?
-fno-asm
銆銆姝ら夐」瀹炵幇ansi閫夐」鐨勫姛鑳界殑涓閮ㄥ垎錛屽畠紱佹灝哸sm,inline鍜宼ypeof鐢ㄤ綔鍏抽敭瀛椼?
銆銆銆銆
-fno-strict-prototype
銆銆鍙g++璧蜂綔鐢?浣跨敤榪欎釜閫夐」,g++灝嗗涓嶅甫鍙傛暟鐨勫嚱鏁?閮借涓烘槸娌℃湁鏄懼紡鐨勫鍙傛暟
鐨勪釜鏁板拰綾誨瀷璇存槑,鑰屼笉鏄病鏈夊弬鏁?
銆銆鑰実cc鏃犺鏄惁浣跨敤榪欎釜鍙傛暟,閮藉皢瀵規(guī)病鏈夊甫鍙傛暟鐨勫嚱鏁?璁や負(fù)鍩庢病鏈夋樉寮忚鏄庣殑綾誨瀷
銆銆
-fthis-is-varialble
銆銆灝辨槸鍚戜紶緇焎++鐪嬮綈,鍙互浣跨敤this褰撲竴鑸彉閲忎嬌鐢?
銆銆
-fcond-mismatch
銆銆鍏佽鏉′歡琛ㄨ揪寮忕殑絎簩鍜岀涓夊弬鏁扮被鍨嬩笉鍖歸厤,琛ㄨ揪寮忕殑鍊煎皢涓簐oid綾誨瀷
銆銆
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
銆銆榪欏洓涓弬鏁版槸瀵筩har綾誨瀷榪涜璁劇疆,鍐沖畾灝哻har綾誨瀷璁劇疆鎴恥nsigned char(鍓嶄袱涓弬
鏁?鎴栬?signed char(鍚庝袱涓弬鏁?
銆銆
-include file
銆銆鍖呭惈鏌愪釜浠g爜,綆鍗曟潵璇?灝辨槸渚夸互鏌愪釜鏂囦歡,闇瑕佸彟涓涓枃浠剁殑鏃跺?灝卞彲浠ョ敤瀹冭
瀹?鍔熻兘灝辯浉褰撲簬鍦ㄤ唬鐮佷腑浣跨敤#include<filename>
銆銆渚嬪瓙鐢ㄦ硶:
銆銆gcc hello.c -include /root/pianopan.h
銆銆
-imacros file
銆銆灝唂ile鏂囦歡鐨勫畯,鎵╁睍鍒癵cc/g++鐨勮緭鍏ユ枃浠?瀹忓畾涔夋湰韜茍涓嶅嚭鐜板湪杈撳叆鏂囦歡涓?
銆銆
-Dmacro
銆銆鐩稿綋浜嶤璇█涓殑#define macro
銆銆
-Dmacro=defn
銆銆鐩稿綋浜嶤璇█涓殑#define macro=defn
銆銆
-Umacro
銆銆鐩稿綋浜嶤璇█涓殑#undef macro
-undef
銆銆鍙栨秷瀵逛換浣曢潪鏍囧噯瀹忕殑瀹氫箟
銆銆
-Idir
銆銆鍦ㄤ綘鏄敤#include"file"鐨勬椂鍊?gcc/g++浼?xì)鍏堝湪褰撳墠鐩綍鏌ユ壘浣犳墍鍒跺畾鐨勫ご鏂囦歡,濡?
鏋滄病鏈夋壘鍒?浠栧洖鍒扮己鐪佺殑澶存枃浠剁洰褰曟壘,濡傛灉浣跨敤-I鍒跺畾浜嗙洰褰?浠?
銆銆鍥炲厛鍦ㄤ綘鎵鍒跺畾鐨勭洰褰曟煡鎵?鐒跺悗鍐嶆寜甯歌鐨勯『搴忓幓鎵?
銆銆瀵逛簬#include<file>,gcc/g++浼?xì)鍒?I鍒跺畾鐨勭洰褰曟煡鎵?鏌ユ壘涓嶅埌,鐒跺悗灝嗗埌緋葷粺鐨勭己
鐪佺殑澶存枃浠剁洰褰曟煡鎵?
銆銆
-I-
銆銆灝辨槸鍙栨秷鍓嶄竴涓弬鏁扮殑鍔熻兘,鎵浠ヤ竴鑸湪-Idir涔嬪悗浣跨敤
銆銆
-idirafter dir
銆銆鍦?I鐨勭洰褰曢噷闈㈡煡鎵懼け璐?璁插埌榪欎釜鐩綍閲岄潰鏌ユ壘.
銆銆
-iprefix prefix
-iwithprefix dir
銆銆涓鑸竴璧蜂嬌鐢?褰?I鐨勭洰褰曟煡鎵懼け璐?浼?xì)鍒皃refix+dir涓嬫煡鎵?
銆銆
-nostdinc
銆銆浣跨紪璇戝櫒涓嶅啀緋葷粺緙虹渷鐨勫ご鏂囦歡鐩綍閲岄潰鎵懼ご鏂囦歡,涓鑸拰-I鑱斿悎浣跨敤,鏄庣‘闄愬畾澶?
鏂囦歡鐨勪綅緗?
銆銆
-nostdin C++
銆銆瑙勫畾涓嶅湪g++鎸囧畾鐨勬爣鍑嗚礬緇忎腑鎼滅儲,浣嗕粛鍦ㄥ叾浠栬礬寰勪腑鎼滅儲,.姝ら夐」鍦ㄥ垱libg++搴?
浣跨敤
銆銆
-C
銆銆鍦ㄩ澶勭悊鐨勬椂鍊?涓嶅垹闄ゆ敞閲婁俊鎭?涓鑸拰-E浣跨敤,鏈夋椂鍊欏垎鏋愮▼搴忥紝鐢ㄨ繖涓緢鏂逛究鐨?
銆銆
-M
銆銆鐢熸垚鏂囦歡鍏寵仈鐨勪俊鎭傚寘鍚洰鏍囨枃浠舵墍渚濊禆鐨勬墍鏈夋簮浠g爜浣犲彲浠ョ敤gcc -M hello.c
鏉ユ祴璇曚竴涓嬶紝寰堢畝鍗曘?
銆銆
-MM
銆銆鍜屼笂闈㈢殑閭d釜涓鏍鳳紝浣嗘槸瀹冨皢蹇界暐鐢?include<file>閫犳垚鐨勪緷璧栧叧緋匯?
銆銆
-MD
銆銆鍜?M鐩稿悓錛屼絾鏄緭鍑哄皢瀵煎叆鍒?d鐨勬枃浠墮噷闈?
銆銆
-MMD
銆銆鍜?MM鐩稿悓錛屼絾鏄緭鍑哄皢瀵煎叆鍒?d鐨勬枃浠墮噷闈?
銆銆
-Wa,option
銆銆姝ら夐」浼犻抩ption緇欐眹緙栫▼搴?濡傛灉option涓棿鏈夐楀彿,灝卞皢option鍒嗘垚澶氫釜閫夐」,鐒?
鍚庝紶閫掔粰浼?xì)姹嚲~栫▼搴?
銆銆
-Wl.option
銆銆姝ら夐」浼犻抩ption緇欒繛鎺ョ▼搴?濡傛灉option涓棿鏈夐楀彿,灝卞皢option鍒嗘垚澶氫釜閫夐」,鐒?
鍚庝紶閫掔粰浼?xì)杩炴帴绋嬪?
銆銆
-llibrary
銆銆鍒跺畾緙栬瘧鐨勬椂鍊欎嬌鐢ㄧ殑搴?
銆銆渚嬪瓙鐢ㄦ硶
銆銆gcc -lcurses hello.c
銆銆浣跨敤ncurses搴撶紪璇戠▼搴?
銆銆
-Ldir
銆銆鍒跺畾緙栬瘧鐨勬椂鍊欙紝鎼滅儲搴撶殑璺緞銆傛瘮濡備綘鑷繁鐨勫簱錛屽彲浠ョ敤瀹冨埗瀹氱洰褰曪紝涓嶇劧
銆銆緙栬瘧鍣ㄥ皢鍙湪鏍囧噯搴撶殑鐩綍鎵俱傝繖涓猟ir灝辨槸鐩綍鐨勫悕縐般?
銆銆
-O0
-O1
-O2
-O3
銆銆緙栬瘧鍣ㄧ殑浼樺寲閫夐」鐨?涓駭鍒紝-O0琛ㄧず娌℃湁浼樺寲,-O1涓虹己鐪佸鹼紝-O3浼樺寲綰у埆鏈楂樸
銆 銆銆
-g
銆銆鍙槸緙栬瘧鍣紝鍦ㄧ紪璇戠殑鏃跺欙紝浜х敓璋冭瘯淇℃伅銆?
銆銆
-gstabs
銆銆姝ら夐」浠tabs鏍煎紡澹扮О璋冭瘯淇℃伅,浣嗘槸涓嶅寘鎷琯db璋冭瘯淇℃伅.
銆銆
-gstabs+
銆銆姝ら夐」浠tabs鏍煎紡澹扮О璋冭瘯淇℃伅,騫朵笖鍖呭惈浠呬緵gdb浣跨敤鐨勯澶栬皟璇曚俊鎭?
銆銆
-ggdb
銆銆姝ら夐」灝嗗敖鍙兘鐨勭敓鎴恎db鐨勫彲浠ヤ嬌鐢ㄧ殑璋冭瘯淇℃伅.
-static
銆銆姝ら夐」灝嗙姝嬌鐢ㄥ姩鎬佸簱錛屾墍浠ワ紝緙栬瘧鍑烘潵鐨勪笢瑗匡紝涓鑸兘寰堝ぇ錛屼篃涓嶉渶瑕佷粈涔?
鍔ㄦ佽繛鎺ュ簱錛屽氨鍙互榪愯.
-share
銆銆姝ら夐」灝嗗敖閲忎嬌鐢ㄥ姩鎬佸簱錛屾墍浠ョ敓鎴愭枃浠舵瘮杈冨皬錛屼絾鏄渶瑕佺郴緇熺敱鍔ㄦ佸簱.
-traditional
銆銆璇曞浘璁╃紪璇戝櫒鏀寔浼犵粺鐨凜璇█鐗規(guī)?
[鍙傝冭祫鏂橾
-Linux/UNIX楂樼駭緙栫▼
銆銆涓綰㈡棗杞歡鎶鏈湁闄愬叕鍙哥紪钁?娓呭崕澶у鍑虹増紺懼嚭鐗?
-Gcc man page
銆銆
[ChangeLog]
-2002-08-10
銆銆ver 0.1 鍙戝竷鏈鍒濈殑鏂囨。
-2002-08-11
銆銆ver 0.11 淇敼鏂囨。鏍煎紡
-2002-08-12
銆銆ver 0.12 鍔犲叆浜嗗闈欐佸簱錛屽姩鎬佸簱鐨勫弬鏁?
-2002-08-16
銆銆ver 0.16 澧炲姞浜唃cc緙栬瘧鐨?涓樁孌電殑鍛戒護(hù)
榪愯 gcc/egcs
**********榪愯 gcc/egcs***********************
銆銆GCC 鏄?GNU 鐨?C 鍜?C++ 緙栬瘧鍣ㄣ傚疄闄呬笂錛孏CC 鑳藉緙栬瘧涓夌璇█錛欳銆丆++ 鍜?O
bject C錛圕 璇█鐨勪竴縐嶉潰鍚戝璞℃墿灞曪級銆傚埄鐢?gcc 鍛戒護(hù)鍙悓鏃剁紪璇戝茍榪炴帴 C 鍜?C++
婧愮▼搴忋?
銆銆濡傛灉浣犳湁涓や釜鎴栧皯鏁板嚑涓?C 婧愭枃浠訛紝涔熷彲浠ユ柟渚垮湴鍒╃敤 GCC 緙栬瘧銆佽繛鎺ュ茍鐢熸垚鍙?
鎵ц鏂囦歡銆備緥濡傦紝鍋囪浣犳湁涓や釜婧愭枃浠?main.c 鍜?factorial.c 涓や釜婧愭枃浠訛紝鐜板湪瑕佺紪
璇戠敓鎴愪竴涓綆楅樁涔樼殑紼嬪簭銆?
浠g爜:
-----------------------
娓呭崟 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;
}
-----------------------
鍒╃敤濡備笅鐨勫懡浠ゅ彲緙栬瘧鐢熸垚鍙墽琛屾枃浠訛紝騫舵墽琛岀▼搴忥細(xì)
$ gcc -o factorial main.c factorial.c
$ ./factorial 5
Factorial of 5 is 120.
銆銆GCC 鍙悓鏃剁敤鏉ョ紪璇?C 紼嬪簭鍜?C++ 紼嬪簭銆備竴鑸潵璇達(dá)紝C 緙栬瘧鍣ㄩ氳繃婧愭枃浠剁殑鍚庣紑
鍚嶆潵鍒ゆ柇鏄?C 紼嬪簭榪樻槸 C++ 紼嬪簭銆傚湪 Linux 涓紝C 婧愭枃浠剁殑鍚庣紑鍚嶄負(fù) .c錛岃?C++ 婧?
鏂囦歡鐨勫悗緙鍚嶄負(fù) .C 鎴?.cpp銆備絾鏄紝gcc 鍛戒護(hù)鍙兘緙栬瘧 C++ 婧愭枃浠訛紝鑰屼笉鑳借嚜鍔ㄥ拰 C
++ 紼嬪簭浣跨敤鐨勫簱榪炴帴銆傚洜姝わ紝閫氬父浣跨敤 g++ 鍛戒護(hù)鏉ュ畬鎴?C++ 紼嬪簭鐨勭紪璇戝拰榪炴帴錛岃紼?
搴忎細(xì)鑷姩璋冪敤 gcc 瀹炵幇緙栬瘧銆傚亣璁炬垜浠湁涓涓涓嬬殑 C++ 婧愭枃浠訛紙hello.C錛夛細(xì)
#include <iostream>
void main (void)
{
銆銆cout << "Hello, world!" << endl;
}
鍒欏彲浠ュ涓嬭皟鐢?g++ 鍛戒護(hù)緙栬瘧銆佽繛鎺ュ茍鐢熸垚鍙墽琛屾枃浠訛細(xì)
$ g++ -o hello hello.C
$ ./hello
Hello, world!
**********************gcc/egcs 鐨勪富瑕侀夐」*********
gcc 鍛戒護(hù)鐨勫父鐢ㄩ夐」
閫夐」 瑙i噴
-ansi 鍙敮鎸?ANSI 鏍囧噯鐨?C 璇硶銆傝繖涓閫夐」灝嗙姝?GNU C 鐨勬煇浜涚壒鑹詫紝
渚嬪 asm 鎴?typeof 鍏抽敭璇嶃?
-c 鍙紪璇戝茍鐢熸垚鐩爣鏂囦歡銆?
-DMACRO 浠ュ瓧絎︿覆鈥?鈥濆畾涔?MACRO 瀹忋?
-DMACRO=DEFN 浠ュ瓧絎︿覆鈥淒EFN鈥濆畾涔?MACRO 瀹忋?
-E 鍙繍琛?C 棰勭紪璇戝櫒銆?
-g 鐢熸垚璋冭瘯淇℃伅銆侴NU 璋冭瘯鍣ㄥ彲鍒╃敤璇ヤ俊鎭?
-IDIRECTORY 鎸囧畾棰濆鐨勫ご鏂囦歡鎼滅儲璺緞DIRECTORY銆?
-LDIRECTORY 鎸囧畾棰濆鐨勫嚱鏁板簱鎼滅儲璺緞DIRECTORY銆?
-lLIBRARY 榪炴帴鏃舵悳绱㈡寚瀹氱殑鍑芥暟搴揕IBRARY銆?
-m486 閽堝 486 榪涜浠g爜浼樺寲銆?
-o FILE 鐢熸垚鎸囧畾鐨勮緭鍑烘枃浠躲傜敤鍦ㄧ敓鎴愬彲鎵ц鏂囦歡鏃躲?
-O0 涓嶈繘琛屼紭鍖栧鐞嗐?
-O 鎴?-O1 浼樺寲鐢熸垚浠g爜銆?
-O2 榪涗竴姝ヤ紭鍖栥?
-O3 姣?-O2 鏇磋繘涓姝ヤ紭鍖栵紝鍖呮嫭 inline 鍑芥暟銆?
-shared 鐢熸垚鍏變韓鐩爣鏂囦歡銆傞氬父鐢ㄥ湪寤虹珛鍏變韓搴撴椂銆?
-static 紱佹浣跨敤鍏變韓榪炴帴銆?
-UMACRO 鍙栨秷瀵?MACRO 瀹忕殑瀹氫箟銆?
-w 涓嶇敓鎴愪換浣曡鍛婁俊鎭?
-Wall 鐢熸垚鎵鏈夎鍛婁俊鎭?/font>
]]>
寮鏀俱佽嚜鐢卞拰鐏墊椿鏄疞inux鐨勯瓍鍔涙墍鍦紝鑰岃繖涓鐐瑰湪GCC涓婄殑浣撶幇灝辨槸紼嬪簭鍛橀氳繃瀹冭兘澶熸洿濂藉湴鎺у埗鏁翠釜緙栬瘧榪囩▼銆傚湪浣跨敤GCC緙栬瘧紼嬪簭鏃訛紝緙栬瘧榪囩▼鍙互琚粏鍒嗕負(fù)鍥涗釜闃舵錛?
鈼?棰勫鐞嗭紙Pre-Processing錛?
鈼?緙栬瘧錛圕ompiling錛?
鈼?姹囩紪錛圓ssembling錛?
鈼?閾炬帴錛圠inking錛?
Linux 紼嬪簭鍛樺彲浠ユ牴鎹嚜宸辯殑闇瑕佽GCC鍦ㄧ紪璇戠殑浠諱綍闃舵緇撴潫錛屼互渚挎鏌ユ垨浣跨敤緙栬瘧鍣ㄥ湪璇ラ樁孌電殑杈撳嚭淇℃伅錛屾垨鑰呭鏈鍚庣敓鎴愮殑浜岃繘鍒舵枃浠惰繘琛屾帶鍒訛紝浠ヤ究閫氳繃鍔犲叆涓嶅悓鏁伴噺鍜岀綾葷殑璋冭瘯浠g爜鏉ヤ負(fù)浠婂悗鐨勮皟璇曞仛濂藉噯澶囥傚拰鍏跺畠甯哥敤鐨勭紪璇戝櫒涓鏍鳳紝GCC涔熸彁渚涗簡鐏墊椿鑰屽己澶х殑浠g爜浼樺寲鍔熻兘錛屽埄鐢ㄥ畠鍙互鐢熸垚鎵ц鏁堢巼鏇撮珮鐨勪唬鐮併?
GCC鎻愪緵浜?0澶氭潯璀﹀憡淇℃伅鍜屼笁涓鍛婄駭鍒紝浣跨敤瀹冧滑鏈夊姪浜庡寮虹▼搴忕殑紼沖畾鎬у拰鍙Щ妞嶆с傛澶栵紝GCC榪樺鏍囧噯鐨凜鍜孋++璇█榪涜浜嗗ぇ閲忕殑鎵╁睍錛屾彁楂樼▼搴忕殑鎵ц鏁堢巼錛屾湁鍔╀簬緙栬瘧鍣ㄨ繘琛屼唬鐮佷紭鍖栵紝鑳藉鍑忚交緙栫▼鐨勫伐浣滈噺銆?
GCC璧鋒
鍦ㄥ涔?fàn)鋴社敤GCC涔嬪墠錛屼笅闈㈢殑榪欎釜渚嬪瓙鑳藉甯姪鐢ㄦ埛榪呴熺悊瑙CC鐨勫伐浣滃師鐞嗭紝騫跺皢鍏剁珛鍗寵繍鐢ㄥ埌瀹為檯鐨勯」鐩紑鍙戜腑鍘匯傞鍏堢敤鐔熸?zhèn)夌殑缂栬緫鍣ㄨ緭鍏ユ竻鍗?鎵紺虹殑浠g爜錛?
娓呭崟1錛歨ello.c
#include <stdio.h>
int main(void)
{
printf ("Hello world, Linux programming!n");
return 0;
}
鐒跺悗鎵ц涓嬮潰鐨勫懡浠ょ紪璇戝拰榪愯榪欐紼嬪簭錛?
# gcc hello.c -o hello
# ./hello
Hello world, Linux programming!
浠庣▼搴忓憳鐨勮搴︾湅錛屽彧闇綆鍗曞湴鎵ц涓鏉CC鍛戒護(hù)灝卞彲浠ヤ簡錛屼絾浠庣紪璇戝櫒鐨勮搴︽潵鐪嬶紝鍗撮渶瑕佸畬鎴愪竴緋誨垪闈炲父綣佹潅鐨勫伐浣溿傞鍏堬紝GCC闇瑕佽皟鐢ㄩ澶勭悊紼嬪簭 cpp錛岀敱瀹冭礋璐e睍寮鍦ㄦ簮鏂囦歡涓畾涔夌殑瀹忥紝騫跺悜鍏朵腑鎻掑叆鈥?include鈥濊鍙ユ墍鍖呭惈鐨勫唴瀹癸紱鎺ョ潃錛孏CC浼?xì)璋冪敤ccl鍜宎s灝嗗鐞嗗悗鐨勬簮浠g爜緙栬瘧鎴愮洰鏍囦唬鐮侊紱鏈鍚庯紝GCC浼?xì)璋冪敤閾炬帴绋嬪簭ld錛屾妸鐢熸垚鐨勭洰鏍囦唬鐮侀摼鎺ユ垚涓涓彲鎵ц紼嬪簭銆?
涓轟簡鏇村ソ鍦扮悊瑙CC鐨勫伐浣滆繃紼嬶紝鍙互鎶婁笂榪扮紪璇戣繃紼嬪垎鎴愬嚑涓楠ゅ崟鐙繘琛岋紝騫惰瀵熸瘡姝ョ殑榪愯緇撴灉銆傜涓姝ユ槸榪涜棰勭紪璇戯紝浣跨敤-E鍙傛暟鍙互璁〨CC鍦ㄩ澶勭悊緇撴潫鍚庡仠姝㈢紪璇戣繃紼嬶細(xì)
# gcc -E hello.c -o hello.i
姝ゆ椂鑻ユ煡鐪媓ello.cpp鏂囦歡涓殑鍐呭錛屼細(xì)鍙戠幇stdio.h鐨勫唴瀹圭‘瀹為兘鎻掑埌鏂囦歡閲屽幓浜嗭紝鑰屽叾瀹冨簲褰撹棰勫鐞嗙殑瀹忓畾涔変篃閮藉仛浜嗙浉搴旂殑澶勭悊銆備笅涓姝ユ槸灝唄ello.i緙栬瘧涓虹洰鏍囦唬鐮侊紝榪欏彲浠ラ氳繃浣跨敤-c鍙傛暟鏉ュ畬鎴愶細(xì)
# gcc -c hello.i -o hello.o
GCC榛樿灝?i鏂囦歡鐪嬫垚鏄澶勭悊鍚庣殑C璇█婧愪唬鐮侊紝鍥犳涓婅堪鍛戒護(hù)灝嗚嚜鍔ㄨ煩榪囬澶勭悊姝ラ鑰屽紑濮嬫墽琛岀紪璇戣繃紼嬶紝涔熷彲浠ヤ嬌鐢?x鍙傛暟璁〨CC浠庢寚瀹氱殑姝ラ寮濮嬬紪璇戙傛渶鍚庝竴姝ユ槸灝嗙敓鎴愮殑鐩爣鏂囦歡閾炬帴鎴愬彲鎵ц鏂囦歡錛?
# gcc hello.o -o hello
鍦ㄩ噰鐢ㄦā鍧楀寲鐨勮璁℃濇兂榪涜杞歡寮鍙戞椂錛岄氬父鏁翠釜紼嬪簭鏄敱澶氫釜婧愭枃浠剁粍鎴愮殑錛岀浉搴斿湴涔熷氨褰㈡垚浜嗗涓紪璇戝崟鍏冿紝浣跨敤GCC鑳藉寰堝ソ鍦扮鐞嗚繖浜涚紪璇戝崟鍏冦傚亣璁炬湁涓涓敱foo1.c鍜宖oo2.c涓や釜婧愭枃浠剁粍鎴愮殑紼嬪簭錛屼負(fù)浜嗗瀹冧滑榪涜緙栬瘧錛屽茍鏈緇堢敓鎴愬彲鎵ц紼嬪簭foo錛屽彲浠ヤ嬌鐢ㄤ笅闈㈣繖鏉″懡浠わ細(xì)
# gcc foo1.c foo2.c -o foo
濡傛灉鍚屾椂澶勭悊鐨勬枃浠朵笉姝竴涓紝GCC浠嶇劧浼?xì)鎸夌収棰勫鐞嗐佺紪璇戝拰閾炬帴鐨勮繃紼嬩緷嬈¤繘琛屻傚鏋滄繁絀惰搗鏉ワ紝涓婇潰榪欐潯鍛戒護(hù)澶ц嚧鐩稿綋浜庝緷嬈℃墽琛屽涓嬩笁鏉″懡浠わ細(xì)
# gcc -c foo1.c -o foo1.o
# gcc -c foo2.c -o foo2.o
# gcc foo1.o foo2.o -o foo
鍦ㄧ紪璇戜竴涓寘鍚澶氭簮鏂囦歡鐨勫伐紼嬫椂錛岃嫢鍙敤涓鏉CC鍛戒護(hù)鏉ュ畬鎴愮紪璇戞槸闈炲父嫻垂鏃墮棿鐨勩傚亣璁鵑」鐩腑鏈?00涓簮鏂囦歡闇瑕佺紪璇戯紝騫朵笖姣忎釜婧愭枃浠朵腑閮藉寘鍚?10000琛屼唬鐮侊紝濡傛灉鍍忎笂闈㈤偅鏍蜂粎鐢ㄤ竴鏉CC鍛戒護(hù)鏉ュ畬鎴愮紪璇戝伐浣滐紝閭d箞GCC闇瑕佸皢姣忎釜婧愭枃浠墮兘閲嶆柊緙栬瘧涓閬嶏紝鐒跺悗鍐嶅叏閮ㄨ繛鎺ヨ搗鏉ャ傚緢鏄劇劧錛岃繖鏍鋒氮璐圭殑鏃墮棿鐩稿綋澶氾紝灝ゅ叾鏄綋鐢ㄦ埛鍙槸淇敼浜嗗叾涓煇涓涓枃浠剁殑鏃跺欙紝瀹屽叏娌℃湁蹇呰灝嗘瘡涓枃浠墮兘閲嶆柊緙栬瘧涓閬嶏紝鍥犱負(fù)寰堝宸茬粡鐢熸垚鐨勭洰鏍囨枃浠舵槸涓嶄細(xì)鏀瑰彉鐨勩傝瑙e喅榪欎釜闂錛屽叧閿槸瑕佺伒媧昏繍鐢℅CC錛屽悓鏃惰繕瑕佸熷姪鍍廙ake榪欐牱鐨勫伐鍏楓?
璀﹀憡鎻愮ず鍔熻兘
GCC鍖呭惈瀹屾暣鐨勫嚭閿欐鏌ュ拰璀﹀憡鎻愮ず鍔熻兘錛屽畠浠彲浠ュ府鍔㎜inux紼嬪簭鍛樺啓鍑烘洿鍔犱笓涓氬拰浼樼編鐨勪唬鐮併傚厛鏉ヨ璇繪竻鍗?鎵紺虹殑紼嬪簭錛岃繖孌典唬鐮佸啓寰楀緢緋熺硶錛屼粩緇嗘鏌ヤ竴涓嬩笉闅炬寫鍑哄緢澶氭瘺鐥咃細(xì)
鈼唌ain鍑芥暟鐨勮繑鍥炲艱澹版槑涓簐oid錛屼絾瀹為檯涓婂簲璇ユ槸int錛?
鈼嗕嬌鐢ㄤ簡GNU璇硶鎵╁睍錛屽嵆浣跨敤long long鏉ュ0鏄?4浣嶆暣鏁幫紝涓嶇鍚圓NSI/ISO C璇█鏍囧噯錛?
鈼唌ain鍑芥暟鍦ㄧ粓姝㈠墠娌℃湁璋冪敤return璇彞銆?
娓呭崟2錛歩llcode.c
#include <stdio.h>
void main(void)
{
long long int var = 1;
printf("It is not standard C code!n");
}
涓嬮潰鏉ョ湅鐪婫CC鏄浣曞府鍔╃▼搴忓憳鏉ュ彂鐜拌繖浜涢敊璇殑銆傚綋GCC鍦ㄧ紪璇戜笉絎﹀悎ANSI/ISO C璇█鏍囧噯鐨勬簮浠g爜鏃訛紝濡傛灉鍔犱笂浜?pedantic閫夐」錛岄偅涔堜嬌鐢ㄤ簡鎵╁睍璇硶鐨勫湴鏂瑰皢浜х敓鐩稿簲鐨勮鍛婁俊鎭細(xì)
# gcc -pedantic illcode.c -o illcode
illcode.c: In function `main':
illcode.c:9: ISO C89 does not support `long long'
illcode.c:8: return type of `main' is not `int'
闇瑕佹敞鎰忕殑鏄紝-pedantic緙栬瘧閫夐」騫朵笉鑳戒繚璇佽緙栬瘧紼嬪簭涓嶢NSI/ISO C鏍囧噯鐨勫畬鍏ㄥ吋瀹癸紝瀹冧粎浠呭彧鑳界敤鏉ュ府鍔㎜inux紼嬪簭鍛樼榪欎釜鐩爣瓚婃潵瓚婅繎銆傛垨鑰呮崲鍙ヨ瘽璇達(dá)紝-pedantic閫夐」鑳藉甯姪紼嬪簭鍛樺彂鐜頒竴浜涗笉絎﹀悎 ANSI/ISO C鏍囧噯鐨勪唬鐮侊紝浣嗕笉鏄叏閮紝浜嬪疄涓婂彧鏈堿NSI/ISO C璇█鏍囧噯涓姹傝繘琛岀紪璇戝櫒璇婃柇鐨勯偅浜涙儏鍐碉紝鎵嶆湁鍙兘琚獹CC鍙戠幇騫舵彁鍑鴻鍛娿?
闄や簡-pedantic涔嬪錛孏CC榪樻湁涓浜涘叾瀹冪紪璇戦夐」涔熻兘澶熶駭鐢熸湁鐢ㄧ殑璀﹀憡淇℃伅銆傝繖浜涢夐」澶у浠?W寮澶達(dá)紝鍏朵腑鏈鏈変環(huán)鍊肩殑褰撴暟-Wall浜嗭紝浣跨敤瀹冭兘澶熶嬌GCC浜х敓灝藉彲鑳藉鐨勮鍛婁俊鎭細(xì)
# gcc -Wall illcode.c -o illcode
illcode.c:8: warning: return type of `main' is not `int'
illcode.c: In function `main':
illcode.c:9: warning: unused variable `var'
GCC緇欏嚭鐨勮鍛婁俊鎭櫧鐒朵粠涓ユ牸鎰忎箟涓婅涓嶈兘綆椾綔鏄敊璇紝浣嗗嵈寰堝彲鑳芥垚涓洪敊璇殑鏍栬韓涔嬫墍銆備竴涓紭縐鐨凩inux紼嬪簭鍛樺簲璇ュ敖閲忛伩鍏嶄駭鐢熻鍛婁俊鎭紝浣胯嚜宸辯殑浠g爜濮嬬粓淇濇寔綆媧併佷紭緹庡拰鍋ュ.鐨勭壒鎬с?
鍦ㄥ鐞嗚鍛婃柟闈紝鍙︿竴涓父鐢ㄧ殑緙栬瘧閫夐」鏄?Werror錛屽畠瑕佹眰GCC灝嗘墍鏈夌殑璀﹀憡褰撴垚閿欒榪涜澶勭悊錛岃繖鍦ㄤ嬌鐢ㄨ嚜鍔ㄧ紪璇戝伐鍏鳳紙濡侻ake絳夛級鏃墮潪甯告湁鐢ㄣ傚鏋滅紪璇戞椂甯︿笂-Werror閫夐」錛岄偅涔圙CC浼?xì)鍦ㄦ墍鏈変駭鐢熻鍛婄殑鍦版柟鍋滄緙栬瘧錛岃揩浣跨▼搴忓憳瀵硅嚜宸辯殑浠g爜榪涜淇敼銆傚彧鏈夊綋鐩稿簲鐨勮鍛婁俊鎭秷闄ゆ椂錛屾墠鍙兘灝嗙紪璇戣繃紼嬬戶緇湞鍓嶆帹榪涖傛墽琛屾儏鍐靛涓嬶細(xì)
# gcc -Wall -Werror illcode.c -o illcode
cc1: warnings being treated as errors
illcode.c:8: warning: return type of `main' is not `int'
illcode.c: In function `main':
illcode.c:9: warning: unused variable `var'
瀵筁inux紼嬪簭鍛樻潵璁詫紝GCC緇欏嚭鐨勮鍛婁俊鎭槸寰堟湁浠峰肩殑錛屽畠浠笉浠呭彲浠ュ府鍔╃▼搴忓憳鍐欏嚭鏇村姞鍋ュ.鐨勭▼搴忥紝鑰屼笖榪樻槸璺熻釜鍜岃皟璇曠▼搴忕殑鏈夊姏宸ュ叿銆傚緩璁湪鐢℅CC緙栬瘧婧愪唬鐮佹椂濮嬬粓甯︿笂-Wall閫夐」錛屽茍鎶婂畠閫愭笎鍩瑰吇鎴愪負(fù)涓縐嶄範(fàn)鎯紝榪欏鎵懼嚭甯歌鐨勯殣寮忕紪紼嬮敊璇緢鏈夊府鍔┿?
鍦↙inux 涓嬪紑鍙戣蔣浠舵椂錛屽畬鍏ㄤ笉浣跨敤絎笁鏂瑰嚱鏁板簱鐨勬儏鍐墊槸姣旇緝?yōu)畱瑙佺殑锛岄氬父鏉ヨ閮介渶瑕佸熷姪涓涓垨澶氫釜鍑芥暟搴撶殑鏀寔鎵嶈兘澶熷畬鎴愮浉搴旂殑鍔熻兘銆備粠紼嬪簭鍛樼殑瑙掑害鐪嬶紝鍑芥暟搴撳疄闄呬笂灝辨槸涓浜涘ご鏂囦歡錛?h錛夊拰搴撴枃浠訛紙.so鎴栬?a錛夌殑闆嗗悎銆傝櫧鐒禠inux涓嬬殑澶у鏁板嚱鏁伴兘榛樿灝嗗ご鏂囦歡鏀懼埌/usr/include/鐩綍涓嬶紝鑰屽簱鏂囦歡鍒欐斁鍒?usr/lib/鐩綍涓嬶紝浣嗗茍涓嶆槸鎵鏈夌殑鎯呭喌閮芥槸榪欐牱銆傛鍥犲姝わ紝GCC鍦ㄧ紪璇戞椂蹇呴』鏈夎嚜宸辯殑鍔炴硶鏉ユ煡鎵炬墍闇瑕佺殑澶存枃浠跺拰搴撴枃浠躲?
GCC閲囩敤鎼滅儲鐩綍鐨勫姙娉曟潵鏌ユ壘鎵闇瑕佺殑鏂囦歡錛?I閫夐」鍙互鍚慓CC鐨勫ご鏂囦歡鎼滅儲璺緞涓坊鍔犳柊鐨勭洰褰曘備緥濡傦紝濡傛灉鍦?home/xiaowp/include/鐩綍涓嬫湁緙栬瘧鏃舵墍闇瑕佺殑澶存枃浠訛紝涓轟簡璁〨CC鑳藉欏哄埄鍦版壘鍒板畠浠紝灝卞彲浠ヤ嬌鐢?I閫夐」錛?
# gcc foo.c -I /home/xiaowp/include -o foo
鍚屾牱錛屽鏋滀嬌鐢ㄤ簡涓嶅湪鏍囧噯浣嶇疆鐨勫簱鏂囦歡錛岄偅涔堝彲浠ラ氳繃-L閫夐」鍚慓CC鐨勫簱鏂囦歡鎼滅儲璺緞涓坊鍔犳柊鐨勭洰褰曘備緥濡傦紝濡傛灉鍦?home/xiaowp/lib/鐩綍涓嬫湁閾炬帴鏃舵墍闇瑕佺殑搴撴枃浠秎ibfoo.so錛屼負(fù)浜嗚GCC鑳藉欏哄埄鍦版壘鍒板畠錛屽彲浠ヤ嬌鐢ㄤ笅闈㈢殑鍛戒護(hù)錛?
# gcc foo.c -L /home/xiaowp/lib -lfoo -o foo
鍊煎緱濂藉ソ瑙i噴涓涓嬬殑鏄?l閫夐」錛屽畠鎸囩ずGCC鍘昏繛鎺ュ簱鏂囦歡libfoo.so銆侺inux涓嬬殑搴撴枃浠跺湪鍛藉悕鏃舵湁涓涓害瀹氾紝閭e氨鏄簲璇ヤ互lib涓変釜瀛楁瘝寮澶達(dá)紝鐢變簬鎵鏈夌殑搴撴枃浠墮兘閬靛驚浜嗗悓鏍風(fēng)殑瑙勮寖錛屽洜姝ゅ湪鐢?l閫夐」鎸囧畾閾炬帴鐨勫簱鏂囦歡鍚嶆椂鍙互鐪佸幓lib涓変釜瀛楁瘝錛屼篃灝辨槸璇碐CC鍦ㄥ-lfoo榪涜澶勭悊鏃訛紝浼?xì)鑷姩鍘婚摼鎺ュ悕湄?fù)libfoo.so鐨勬枃浠躲?
Linux涓嬬殑搴撴枃浠跺垎涓轟袱澶х被鍒嗗埆鏄姩鎬侀摼鎺ュ簱錛堥氬父浠?so緇撳熬錛夊拰闈欐侀摼鎺ュ簱錛堥氬父浠?a 緇撳熬錛夛紝涓よ呯殑宸埆浠呭湪紼嬪簭鎵ц鏃舵墍闇鐨勪唬鐮佹槸鍦ㄨ繍琛屾椂鍔ㄦ佸姞杞界殑錛岃繕鏄湪緙栬瘧鏃墮潤鎬佸姞杞界殑銆傞粯璁ゆ儏鍐典笅錛孏CC鍦ㄩ摼鎺ユ椂浼樺厛浣跨敤鍔ㄦ侀摼鎺ュ簱錛屽彧鏈夊綋鍔ㄦ侀摼鎺ュ簱涓嶅瓨鍦ㄦ椂鎵嶈冭檻浣跨敤闈欐侀摼鎺ュ簱錛屽鏋滈渶瑕佺殑璇濆彲浠ュ湪緙栬瘧鏃跺姞涓?static閫夐」錛屽己鍒朵嬌鐢ㄩ潤鎬侀摼鎺ュ簱銆備緥濡傦紝濡傛灉鍦?/home/xiaowp/lib/鐩綍涓嬫湁閾炬帴鏃舵墍闇瑕佺殑搴撴枃浠秎ibfoo.so鍜宭ibfoo.a錛屼負(fù)浜嗚GCC鍦ㄩ摼鎺ユ椂鍙敤鍒伴潤鎬侀摼鎺ュ簱錛屽彲浠ヤ嬌鐢ㄤ笅闈㈢殑鍛戒護(hù)錛?
# gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo
浠g爜浼樺寲
浠g爜浼樺寲鎸囩殑鏄紪璇戝櫒閫氳繃鍒嗘瀽婧愪唬鐮侊紝鎵懼嚭鍏朵腑灝氭湭杈懼埌鏈浼樼殑閮ㄥ垎錛岀劧鍚庡鍏墮噸鏂拌繘琛岀粍鍚堬紝鐩殑鏄敼鍠勭▼搴忕殑鎵ц鎬ц兘銆侴CC鎻愪緵鐨勪唬鐮佷紭鍖栧姛鑳介潪甯稿己澶э紝瀹冮氳繃緙栬瘧閫夐」-On鏉ユ帶鍒朵紭鍖栦唬鐮佺殑鐢熸垚錛屽叾涓璶鏄竴涓唬琛ㄤ紭鍖栫駭鍒殑鏁存暟銆傚浜庝笉鍚岀増鏈殑GCC鏉ヨ錛宯鐨勫彇鍊艱寖鍥村強(qiáng)鍏跺搴旂殑浼樺寲鏁堟灉鍙兘騫朵笉瀹屽叏鐩稿悓錛屾瘮杈冨吀鍨嬬殑鑼冨洿鏄粠0鍙樺寲鍒?鎴?銆?
緙栬瘧鏃朵嬌鐢ㄩ夐」-O鍙互鍛婅瘔GCC鍚屾椂鍑忓皬浠g爜鐨勯暱搴﹀拰鎵ц鏃墮棿錛屽叾鏁堟灉絳変環(huán)浜?O1銆傚湪榪欎竴綰у埆涓婅兘澶熻繘琛岀殑浼樺寲綾誨瀷铏界劧鍙栧喅浜庣洰鏍囧鐞嗗櫒錛屼絾涓鑸兘浼?xì)鍖呮嫭绾拷E嬭煩杞紙Thread Jump錛夊拰寤惰繜閫鏍堬紙Deferred Stack Pops錛変袱縐嶄紭鍖栥傞夐」-O2鍛婅瘔GCC闄や簡瀹屾垚鎵鏈?O1綰у埆鐨勪紭鍖栦箣澶栵紝鍚屾椂榪樿榪涜涓浜涢澶栫殑璋冩暣宸ヤ綔錛屽澶勭悊鍣ㄦ寚浠よ皟搴︾瓑銆傞夐」-O3鍒欓櫎浜嗗畬鎴愭墍鏈?O2綰у埆鐨勪紭鍖栦箣澶栵紝榪樺寘鎷驚鐜睍寮鍜屽叾瀹冧竴浜涗笌澶勭悊鍣ㄧ壒鎬х浉鍏崇殑浼樺寲宸ヤ綔銆傞氬父鏉ヨ錛屾暟瀛楄秺澶т紭鍖栫殑絳夌駭瓚婇珮錛屽悓鏃朵篃灝辨剰鍛崇潃紼嬪簭鐨勮繍琛岄熷害瓚婂揩銆傝澶歀inux紼嬪簭鍛橀兘鍠滄浣跨敤-O2閫夐」錛屽洜涓哄畠鍦ㄤ紭鍖栭暱搴︺佺紪璇戞椂闂村拰浠g爜澶у皬涔嬮棿錛屽彇寰椾簡涓涓瘮杈冪悊鎯崇殑騫寵 鐐廣?
涓嬮潰閫氳繃鍏蜂綋瀹炰緥鏉ユ劅鍙椾竴涓婫CC鐨勪唬鐮佷紭鍖栧姛鑳斤紝鎵鐢ㄧ▼搴忓娓呭崟3鎵紺恒?
娓呭崟3錛歰ptimize.c
#include <stdio.h>
int main(void)
{
double counter;
double result;
double temp;
for (counter = 0; counter < 2000.0 * 2000.0 * 2000.0 / 20.0 + 2020; counter += (5 - 1) / 4)
{ temp = counter / 1979; result = counter; }
printf("Result is %lfn", result);
return 0;
}
棣栧厛涓嶅姞浠諱綍浼樺寲閫夐」榪涜緙栬瘧錛?
# gcc -Wall optimize.c -o optimize
鍊熷姪Linux鎻愪緵鐨則ime鍛戒護(hù)錛屽彲浠ュぇ鑷寸粺璁″嚭璇ョ▼搴忓湪榪愯鏃舵墍闇瑕佺殑鏃墮棿錛?
# time ./optimizeResult is 400002019.000000real 0m14.942suser 0m14.940ssys 0m0.000s
鎺ヤ笅鍘諱嬌鐢ㄤ紭鍖栭夐」鏉ュ浠g爜榪涜浼樺寲澶勭悊錛?
# gcc -Wall -O optimize.c -o optimize
鍦ㄥ悓鏍風(fēng)殑鏉′歡涓嬪啀嬈℃祴璇曚竴涓嬭繍琛屾椂闂達(dá)細(xì)
# time ./optimizeResult is 400002019.000000real 0m3.256suser 0m3.240ssys 0m0.000s
瀵規(guī)瘮涓ゆ鎵ц鐨勮緭鍑虹粨鏋滀笉闅劇湅鍑猴紝紼嬪簭鐨勬ц兘鐨勭‘寰楀埌浜嗗緢澶у箙搴︾殑鏀瑰杽錛岀敱鍘熸潵鐨?4縐掔緝鐭埌浜?縐掋傝繖涓緥瀛愭槸涓撻棬閽堝GCC鐨勪紭鍖栧姛鑳借岃璁$殑錛屽洜姝や紭鍖栧墠鍚庣▼搴忕殑鎵ц閫熷害鍙戠敓浜嗗緢澶х殑鏀瑰彉銆傚敖綆CC鐨勪唬鐮佷紭鍖栧姛鑳介潪甯稿己澶э紝浣嗕綔涓轟竴鍚嶄紭縐鐨凩inux紼嬪簭鍛橈紝棣栧厛榪樻槸瑕佸姏姹傝兘澶熸墜宸ョ紪鍐欏嚭楂樿川閲忕殑浠g爜銆傚鏋滅紪鍐欑殑浠g爜綆鐭紝騫朵笖閫昏緫鎬у己錛岀紪璇戝櫒灝變笉浼?xì)鍋氭洿澶氱殑宸ヤ綔锛岀敋鑷虫犚?guī)湰鐢ㄤ笉鐫浼樺寲銆?
浼樺寲铏界劧鑳藉緇欑▼搴忓甫鏉ユ洿濂界殑鎵ц鎬ц兘錛屼絾鍦ㄥ涓嬩竴浜涘満鍚堜腑搴旇閬垮厤浼樺寲浠g爜錛?
鈼?紼嬪簭寮鍙戠殑鏃跺?浼樺寲絳夌駭瓚婇珮錛屾秷鑰楀湪緙栬瘧涓婄殑鏃墮棿灝辮秺闀匡紝鍥犳鍦ㄥ紑鍙戠殑鏃跺欐渶濂戒笉瑕佷嬌鐢ㄤ紭鍖栭夐」錛屽彧鏈夊埌杞歡鍙戣鎴栧紑鍙戠粨鏉熺殑鏃跺欙紝鎵嶈冭檻瀵規(guī)渶緇堢敓鎴愮殑浠g爜榪涜浼樺寲銆?
鈼?璧勬簮鍙楅檺鐨勬椂鍊?涓浜涗紭鍖栭夐」浼?xì)澧炲姞鍙墽琛屼唬鐮佺殑浣摽U紝濡傛灉紼嬪簭鍦ㄨ繍琛屾椂鑳藉鐢寵鍒扮殑鍐呭瓨璧勬簮闈炲父绱у紶錛堝涓浜涘疄鏃跺祵鍏ュ紡璁懼錛夛紝閭e氨涓嶈瀵逛唬鐮佽繘琛屼紭鍖栵紝鍥犱負(fù)鐢辮繖甯︽潵鐨勮礋闈㈠獎鍝嶅彲鑳戒細(xì)浜х敓闈炲父涓ラ噸鐨勫悗鏋溿?
鈼?璺熻釜璋冭瘯鐨勬椂鍊?鍦ㄥ浠g爜榪涜浼樺寲鐨勬椂鍊欙紝鏌愪簺浠g爜鍙兘浼?xì)琚垹闄ゆ垨鏀瑰啓锛屾垨鑰呬負(fù)浜嗗彇寰楁洿浣崇殑鎬ц兘鑰岃繘琛岄噸緇勶紝浠庤屼嬌璺熻釜鍜岃皟璇曞彉寰楀紓甯稿洶闅俱?
璋冭瘯
涓涓姛鑳藉己澶х殑璋冭瘯鍣ㄤ笉浠呬負(fù)紼嬪簭鍛樻彁渚涗簡璺熻釜紼嬪簭鎵ц鐨勬墜孌碉紝鑰屼笖榪樺彲浠ュ府鍔╃▼搴忓憳鎵懼埌瑙e喅闂鐨勬柟娉曘傚浜嶭inux紼嬪簭鍛樻潵璁詫紝GDB錛圙NU Debugger錛夐氳繃涓嶨CC鐨勯厤鍚堜嬌鐢紝涓哄熀浜嶭inux鐨勮蔣浠跺紑鍙戞彁渚涗簡涓涓畬鍠勭殑璋冭瘯鐜銆?
榛樿鎯呭喌涓嬶紝GCC鍦ㄧ紪璇戞椂涓嶄細(xì)灝嗚皟璇曠鍙鋒彃鍏ュ埌鐢熸垚鐨勪簩榪涘埗浠g爜涓紝鍥犱負(fù)榪欐牱浼?xì)澧炲姞鍙墽琛屾枃錃g鐨勫ぇ灝忋傚鏋滈渶瑕佸湪緙栬瘧鏃剁敓鎴愯皟璇曠鍙蜂俊鎭紝鍙互浣跨敤GCC 鐨?g鎴栬?ggdb閫夐」銆侴CC鍦ㄤ駭鐢熻皟璇曠鍙鋒椂錛屽悓鏍烽噰鐢ㄤ簡鍒嗙駭鐨勬濊礬錛屽紑鍙戜漢鍛樺彲浠ラ氳繃鍦?g閫夐」鍚庨檮鍔犳暟瀛?銆?鎴?鏉ユ寚瀹氬湪浠g爜涓姞鍏ヨ皟璇曚俊鎭殑澶氬皯銆傞粯璁ょ殑綰у埆鏄?錛?g2錛夛紝姝ゆ椂浜х敓鐨勮皟璇曚俊鎭寘鎷墿灞曠殑絎﹀彿琛ㄣ佽鍙楓佸眬閮ㄦ垨澶栭儴鍙橀噺淇℃伅銆傜駭鍒?錛?g3錛夊寘鍚駭鍒?涓殑鎵鏈夎皟璇曚俊鎭紝浠ュ強(qiáng)婧愪唬鐮佷腑瀹氫箟鐨勫畯銆傜駭鍒?錛?g1錛変笉鍖呭惈灞閮ㄥ彉閲忓拰涓庤鍙鋒湁鍏崇殑璋冭瘯淇℃伅錛屽洜姝ゅ彧鑳藉鐢ㄤ簬鍥炴函璺熻釜鍜屽爢鏍堣漿鍌ㄤ箣鐢ㄣ傚洖婧窡韙寚鐨勬槸鐩戣紼嬪簭鍦ㄨ繍琛岃繃紼嬩腑鐨勫嚱鏁拌皟鐢ㄥ巻鍙詫紝鍫嗘爤杞偍鍒欐槸涓縐嶄互鍘熷鐨勫崄鍏繘鍒舵牸寮忎繚瀛樼▼搴忔墽琛岀幆澧冪殑鏂規(guī)硶錛屼袱鑰呴兘鏄粡甯哥敤鍒扮殑璋冭瘯鎵嬫銆?
GCC浜х敓鐨勮皟璇曠鍙峰叿鏈夋櫘閬嶇殑閫傚簲鎬э紝鍙互琚澶氳皟璇曞櫒鍔犱互鍒╃敤錛屼絾濡傛灉浣跨敤鐨勬槸GDB錛岄偅涔堣繕鍙互閫氳繃-ggdb閫夐」鍦ㄧ敓鎴愮殑浜岃繘鍒朵唬鐮佷腑鍖呭惈GDB涓撶敤鐨勮皟璇曚俊鎭傝繖縐嶅仛娉曠殑浼樼偣鏄彲浠ユ柟渚縂DB鐨勮皟璇曞伐浣滐紝浣嗙己鐐規(guī)槸鍙兘瀵艱嚧鍏跺畠璋冭瘯鍣紙濡侱BX錛夋棤娉曡繘琛屾甯哥殑璋冭瘯銆傞夐」-ggdb鑳藉鎺ュ彈鐨勮皟璇曠駭鍒拰-g鏄畬鍏ㄤ竴鏍風(fēng)殑錛屽畠浠杈撳嚭鐨勮皟璇曠鍙鋒湁鐫鐩稿悓鐨勫獎鍝嶃?
闇瑕佹敞鎰忕殑鏄紝浣跨敤浠諱綍涓涓皟璇曢夐」閮戒細(xì)浣挎渶緇堢敓鎴愮殑浜岃繘鍒舵枃浠剁殑澶у皬鎬ュ墽澧炲姞錛屽悓鏃跺鍔犵▼搴忓湪鎵ц鏃剁殑寮閿錛屽洜姝よ皟璇曢夐」閫氬父浠呭湪杞歡鐨勫紑鍙戝拰璋冭瘯闃舵浣跨敤銆傝皟璇曢夐」瀵圭敓鎴愪唬鐮佸ぇ灝忕殑褰卞搷浠庝笅闈㈢殑瀵規(guī)瘮榪囩▼涓彲浠ョ湅鍑烘潵錛?
# gcc optimize.c -o optimize
# ls optimize -l-rwxrwxr-x 1 xiaowp xiaowp 11649 Nov 20 08:53 optimize (鏈姞璋冭瘯閫夐」)
# gcc -g optimize.c -o optimize
# ls optimize -l-rwxrwxr-x 1 xiaowp xiaowp 15889 Nov 20 08:54 optimize (鍔犲叆璋冭瘯閫夐」)
铏界劧璋冭瘯閫夐」浼?xì)澧炲姞鏂囦欢鐨勫ぇ灏忓Q屼絾浜嬪疄涓奓inux涓殑璁稿杞歡鍦ㄦ祴璇曠増鏈敋鑷蟲渶緇堝彂琛岀増鏈腑浠嶇劧浣跨敤浜嗚皟璇曢夐」鏉ヨ繘琛岀紪璇戯紝榪欐牱鍋氱殑鐩殑鏄紦鍔辯敤鎴峰湪鍙戠幇闂鏃惰嚜宸卞姩鎵嬭В鍐籌紝鏄疞inux鐨勪竴涓樉钁楃壒鑹層?
涓嬮潰榪樻槸閫氳繃涓涓叿浣撶殑瀹炰緥璇存槑濡備綍鍒╃敤璋冭瘯絎﹀彿鏉ュ垎鏋愰敊璇紝鎵鐢ㄧ▼搴忚娓呭崟4鎵紺恒?
娓呭崟4錛歝rash.c
#include <stdio.h>
int main(void)
{
int input =0;
printf("Input an integer:");
scanf("%d", input);
printf("The integer you input is %dn", input);
return 0;
}
緙栬瘧騫惰繍琛屼笂榪頒唬鐮侊紝浼?xì)漶旂敓涓涓弗閲嶇殑孌甸敊璇紙Segmentation fault錛夊涓嬶細(xì)
# gcc -g crash.c -o crash
# ./crashInput
an integer:10Segmentation fault
涓轟簡鏇村揩閫熷湴鍙戠幇閿欒鎵鍦紝鍙互浣跨敤GDB榪涜璺熻釜璋冭瘯錛屾柟娉曞涓嬶細(xì)
# gdb crashGNU gdb Red Hat Linux (5.3post-0.20021129.18rh)鈥︹?gdb)
褰揋DB鎻愮ず絎﹀嚭鐜扮殑鏃跺欙紝琛ㄦ槑GDB宸茬粡鍋氬ソ鍑嗗榪涜璋冭瘯浜嗭紝鐜板湪鍙互閫氳繃run鍛戒護(hù)璁╃▼搴忓紑濮嬪湪GDB鐨勭洃鎺т笅榪愯錛?
(gdb) runStarting program: /home/xiaowp/thesis/gcc/code/crashInput an integer:10Program received signal SIGSEGV, Segmentation fault.0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6
浠旂粏鍒嗘瀽涓涓婫DB緇欏嚭鐨勮緭鍑虹粨鏋滀笉闅劇湅鍑猴紝紼嬪簭鏄敱浜庢閿欒鑰屽鑷村紓甯鎬腑姝㈢殑錛岃鏄庡唴瀛樻搷浣滃嚭浜嗛棶棰橈紝鍏蜂綋鍙戠敓闂鐨勫湴鏂規(guī)槸鍦ㄨ皟鐢?_IO_vfscanf_internal ( )鐨勬椂鍊欍備負(fù)浜嗗緱鍒版洿鍔犳湁浠峰肩殑淇℃伅錛屽彲浠ヤ嬌鐢℅DB鎻愪緵鐨勫洖婧窡韙懡浠acktrace錛屾墽琛岀粨鏋滃涓嬶細(xì)
(gdb) backtrace
#0 0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6
#1 0xbffff0c0 in ?? ()
#2 0x4008e0ba in scanf () from /lib/libc.so.6
#3 0x08048393 in main () at crash.c:11
#4 0x40042917 in __libc_start_main () from /lib/libc.so.6
璺寵繃杈撳嚭緇撴灉涓殑鍓嶉潰涓夎錛屼粠杈撳嚭緇撴灉鐨勭鍥涜涓笉闅劇湅鍑猴紝GDB宸茬粡灝嗛敊璇畾浣嶅埌crash.c涓殑絎?1琛屼簡銆傜幇鍦ㄤ粩緇嗘鏌ヤ竴涓嬶細(xì)
(gdb) frame 3
#3 0x08048393 in main () at crash.c:1111 scanf("%d", input);
浣跨敤GDB鎻愪緵鐨刦rame鍛戒護(hù)鍙互瀹氫綅鍒板彂鐢熼敊璇殑浠g爜孌碉紝璇ュ懡浠ゅ悗闈㈣窡鐫鐨勬暟鍊煎彲浠ュ湪backtrace鍛戒護(hù)杈撳嚭緇撴灉涓殑琛岄鎵懼埌銆傜幇鍦ㄥ凡緇忓彂鐜伴敊璇墍鍦ㄤ簡錛屽簲璇ュ皢
scanf("%d", input);鏀逛負(fù)scanf("%d", &input);
瀹屾垚鍚庡氨鍙互閫鍑篏DB浜嗭紝鍛戒護(hù)濡備笅錛?
(gdb) quit
GDB鐨勫姛鑳借繙榪滀笉姝㈠姝わ紝瀹冭繕鍙互鍗曟璺熻釜紼嬪簭銆佹鏌ュ唴瀛樺彉閲忓拰璁劇疆鏂偣絳夈?
璋冭瘯鏃跺彲鑳戒細(xì)闇瑕佺敤鍒扮紪璇戝櫒浜х敓鐨勪腑闂寸粨鏋滐紝榪欐椂鍙互浣跨敤-save-temps閫夐」錛岃GCC灝嗛澶勭悊浠g爜銆佹眹緙栦唬鐮佸拰鐩爣浠g爜閮戒綔涓烘枃浠朵繚瀛樿搗鏉ャ傚鏋滄兂媯鏌ョ敓鎴愮殑浠g爜鏄惁鑳藉閫氳繃鎵嬪伐璋冩暣鐨勫姙娉曟潵鎻愰珮鎵ц鎬ц兘錛屽湪緙栬瘧榪囩▼涓敓鎴愮殑涓棿鏂囦歡灝嗕細(xì)寰堟湁甯姪錛屽叿浣撴儏鍐靛涓嬶細(xì)
# gcc -save-temps foo.c -o foo
# ls foo*foo foo.c foo.i foo.s
GCC 鏀寔鐨勫叾瀹冭皟璇曢夐」榪樺寘鎷?p鍜?pg錛屽畠浠細(xì)灝嗗墫鏋愶紙Profiling錛変俊鎭姞鍏ュ埌鏈緇堢敓鎴愮殑浜岃繘鍒朵唬鐮佷腑銆傚墫鏋愪俊鎭浜庢壘鍑虹▼搴忕殑鎬ц兘鐡墮寰堟湁甯姪錛屾槸鍗忓姪Linux紼嬪簭鍛樺紑鍙戝嚭楂樻ц兘紼嬪簭鐨勬湁鍔涘伐鍏楓傚湪緙栬瘧鏃跺姞鍏?p閫夐」浼?xì)鍦ㄧ敓鎴愮殑浠g爜涓姞鍏ラ氱敤鍓栨瀽宸ュ叿錛圥rof錛夎兘澶熻瘑鍒殑緇熻淇℃伅錛岃? pg閫夐」鍒欑敓鎴愬彧鏈塆NU鍓栨瀽宸ュ叿錛圙prof錛夋墠鑳借瘑鍒殑緇熻淇℃伅銆?
鏈鍚庢彁閱掍竴鐐癸紝铏界劧GCC鍏佽鍦ㄤ紭鍖栫殑鍚屾椂鍔犲叆璋冭瘯絎﹀彿淇℃伅錛屼絾浼樺寲鍚庣殑浠g爜瀵逛簬璋冭瘯鏈韓鑰岃█灝嗘槸涓涓緢澶х殑鎸戞垬銆備唬鐮佸湪緇忚繃浼樺寲涔嬪悗錛屽湪婧愮▼搴忎腑澹版槑鍜屼嬌鐢ㄧ殑鍙橀噺寰堝彲鑳戒笉鍐嶄嬌鐢紝鎺у埗嫻佷篃鍙兘浼?xì)绐佺劧锜╄浆鍒版剰澶栫殑鍦版柟锛屽惊鐜鍙ユ湁鍙兘鍥犱负弩@鐜睍寮鑰屽彉寰楀埌澶勯兘鏈夛紝鎵鏈夎繖浜涘璋冭瘯鏉ヨ閮藉皢鏄竴鍦哄櫓姊︺傚緩璁湪璋冭瘯鐨勬椂鍊欐渶濂戒笉浣跨敤浠諱綍浼樺寲閫夐」錛屽彧鏈夊綋紼嬪簭鍦ㄦ渶緇堝彂琛岀殑鏃跺欐墠鑰冭檻瀵瑰叾榪涜浼樺寲銆?
涓婃鐨勫煿璁洯鍦頒腑浠嬬粛浜咷CC鐨勭紪璇戣繃紼嬨佽鍛婃彁紺哄姛鑳姐佸簱渚濊禆銆佷唬鐮佷紭鍖栧拰紼嬪簭璋冭瘯鍏釜鏂歸潰鐨勫唴瀹廣傝繖鏈熸槸鏈鍚庣殑涓閮ㄥ垎鍐呭銆?
鍦ㄥ皢婧愪唬鐮佸彉鎴愬彲鎵ц鏂囦歡鐨勮繃紼嬩腑錛岄渶瑕佺粡榪囪澶氫腑闂存楠わ紝鍖呭惈棰勫鐞嗐佺紪璇戙佹眹緙栧拰榪炴帴銆傝繖浜涜繃紼嬪疄闄呬笂鏄敱涓嶅悓鐨勭▼搴忚礋璐e畬鎴愮殑銆傚ぇ澶氭暟鎯呭喌涓婫CC鍙互涓篖inux紼嬪簭鍛樺畬鎴愭墍鏈夌殑鍚庡彴宸ヤ綔錛岃嚜鍔ㄨ皟鐢ㄧ浉搴旂▼搴忚繘琛屽鐞嗐?
榪欐牱鍋氭湁涓涓緢鏄庢樉鐨勭己鐐癸紝灝辨槸GCC鍦ㄥ鐞嗘瘡涓涓簮鏂囦歡鏃訛紝鏈緇堥兘闇瑕佺敓鎴愬ソ鍑犱釜涓存椂鏂囦歡鎵嶈兘瀹屾垚鐩稿簲鐨勫伐浣滐紝浠庤屾棤褰腑瀵艱嚧澶勭悊閫熷害鍙樻參銆備緥濡傦紝GCC 鍦ㄥ鐞嗕竴涓簮鏂囦歡鏃訛紝鍙兘闇瑕佷竴涓復(fù)鏃舵枃浠舵潵淇濆瓨棰勫鐞嗙殑杈撳嚭銆佷竴涓復(fù)鏃舵枃浠舵潵淇濆瓨緙栬瘧鍣ㄧ殑杈撳嚭銆佷竴涓復(fù)鏃舵枃浠舵潵淇濆瓨姹囩紪鍣ㄧ殑杈撳嚭錛岃岃鍐欒繖浜涗復(fù)鏃舵枃浠舵樉鐒墮渶瑕佽楄垂涓瀹氱殑鏃墮棿銆傚綋杞歡欏圭洰鍙樺緱闈炲父搴炲ぇ鐨勬椂鍊欙紝鑺辮垂鍦ㄨ繖涓婇潰鐨勪唬浠峰彲鑳戒細(xì)鍙樺緱寰堟矇閲嶃?
瑙e喅鐨勫姙娉曟槸錛屼嬌鐢↙inux鎻愪緵鐨勪竴縐嶆洿鍔犻珮鏁堢殑閫氫俊鏂瑰紡鈥旂閬撱傚畠鍙互鐢ㄦ潵鍚屾椂榪炴帴涓や釜紼嬪簭錛屽叾涓竴涓▼搴忕殑杈撳嚭灝嗚鐩存帴浣滀負(fù)鍙︿竴涓▼搴忕殑杈撳叆錛岃繖鏍峰氨鍙互閬垮厤浣跨敤涓存椂鏂囦歡錛屼絾緙栬瘧鏃跺嵈闇瑕佹秷鑰楁洿澶氱殑鍐呭瓨銆?
鍦ㄧ紪璇戣繃紼嬩腑浣跨敤綆¢亾鏄敱GCC鐨?pipe閫夐」鍐沖畾鐨勩備笅闈㈢殑榪欐潯鍛戒護(hù)灝辨槸鍊熷姪GCC鐨勭閬撳姛鑳芥潵鎻愰珮緙栬瘧閫熷害鐨勶細(xì)
# gcc -pipe foo.c -o foo
鍦ㄧ紪璇戝皬鍨嬪伐紼嬫椂浣跨敤綆¢亾錛岀紪璇戞椂闂翠笂鐨勫樊寮傚彲鑳借繕涓嶆槸寰堟槑鏄撅紝浣嗗湪婧愪唬鐮侀潪甯稿鐨勫ぇ鍨嬪伐紼嬩腑錛屽樊寮傚皢鍙樺緱闈炲父鏄庢樉銆?
鏂囦歡鎵╁睍鍚?
鍦ㄤ嬌鐢℅CC鐨勮繃紼嬩腑錛岀敤鎴峰涓浜涘父鐢ㄧ殑鎵╁睍鍚嶄竴瀹氳鐔熸?zhèn)夊Q屽茍鐭ラ亾鍏跺惈涔夈備負(fù)浜嗘柟渚垮ぇ瀹跺涔?fàn)鋴社敤GCC錛屽湪姝ゅ皢榪欎簺鎵╁睍鍚嶇綏鍒楀涓嬶細(xì)
.c C鍘熷紼嬪簭錛?
.C C++鍘熷紼嬪簭錛?
.cc C++鍘熷紼嬪簭錛?
.cxx C++鍘熷紼嬪簭錛?
.m Objective-C鍘熷紼嬪簭錛?
.i 宸茬粡榪囬澶勭悊鐨凜鍘熷紼嬪簭錛?
.ii 宸茬粡榪囬澶勭悊涔婥++鍘熷紼嬪簭錛?
.s 緇勫悎璇█鍘熷紼嬪簭錛?
.S 緇勫悎璇█鍘熷紼嬪簭錛?
.h 棰勫鐞嗘枃浠?鏍囧ご鏂囦歡)錛?
.o 鐩爣鏂囦歡錛?
.a 瀛樻。鏂囦歡銆?
GCC甯哥敤閫夐」
GCC浣滀負(fù)Linux涓婥/C++閲嶈鐨勭紪璇戠幆澧冿紝鍔熻兘寮哄ぇ錛岀紪璇戦夐」綣佸銆備負(fù)浜嗘柟渚垮ぇ瀹舵棩鍚庣紪璇戞柟渚匡紝鍦ㄦ灝嗗父鐢ㄧ殑閫夐」鍙?qiáng)璇存槑缃楀垪鍑烘潵濡備笅锛?xì)
-c 閫氱煡GCC鍙栨秷閾炬帴姝ラ錛屽嵆緙栬瘧婧愮爜騫跺湪鏈鍚庣敓鎴愮洰鏍囨枃浠訛紱
-Dmacro 瀹氫箟鎸囧畾鐨勫畯錛屼嬌瀹冭兘澶熼氳繃婧愮爜涓殑#ifdef榪涜媯楠岋紱
-E 涓嶇粡榪囩紪璇戦澶勭悊紼嬪簭鐨勮緭鍑鴻岃緭閫佽嚦鏍囧噯杈撳嚭錛?
-g3 鑾峰緱鏈夊叧璋冭瘯紼嬪簭鐨勮緇嗕俊鎭紝瀹冧笉鑳戒笌-o閫夐」鑱斿悎浣跨敤錛?
-Idirectory 鍦ㄥ寘鍚枃浠舵悳绱㈣礬寰勭殑璧風(fēng)偣澶勬坊鍔犳寚瀹氱洰褰曪紱
-llibrary 鎻愮ず閾炬帴紼嬪簭鍦ㄥ垱寤烘渶緇堝彲鎵ц鏂囦歡鏃跺寘鍚寚瀹氱殑搴擄紱
-O銆?O2銆?O3 灝嗕紭鍖栫姸鎬佹墦寮錛岃閫夐」涓嶈兘涓?g閫夐」鑱斿悎浣跨敤錛?
-S 瑕佹眰緙栬瘧紼嬪簭鐢熸垚鏉ヨ嚜婧愪唬鐮佺殑姹囩紪紼嬪簭杈撳嚭錛?
-v 鍚姩鎵鏈夎鎶ワ紱
-Wall 鍦ㄥ彂鐢熻鎶ユ椂鍙栨秷緙栬瘧鎿嶄綔錛屽嵆灝嗚鎶ョ湅浣滄槸閿欒錛?
-Werror 鍦ㄥ彂鐢熻鎶ユ椂鍙栨秷緙栬瘧鎿嶄綔錛屽嵆鎶婃姤璀﹀綋浣滄槸閿欒錛?
-w 紱佹鎵鏈夌殑鎶ヨ銆?
灝忕粨
GCC 鏄湪Linux涓嬪紑鍙戠▼搴忔椂蹇呴』鎺屾彙鐨勫伐鍏蜂箣涓銆傛湰鏂囧GCC鍋氫簡涓涓畝瑕佺殑浠嬬粛錛屼富瑕佽榪頒簡濡備綍浣跨敤GCC緙栬瘧紼嬪簭銆佷駭鐢熻鍛婁俊鎭佽皟璇曠▼搴忓拰鍔犲揩 GCC鐨勭紪璇戦熷害銆傚鎵鏈夊笇鏈涙棭鏃ヨ法鍏inux寮鍙戣呰鍒楃殑浜烘潵璇達(dá)紝GCC灝辨槸鎴愪負(fù)涓鍚嶄紭縐鐨凩inux紼嬪簭鍛樼殑璧瘋窇綰褲?
浜屻?nbsp;瑁呰澆鍏夋爣
SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
銆銆鍏朵腑::SetCursor()鏄叏灞鍑芥暟錛岀敤鏉ヨ緗暣涓緥紼嬬殑鍏夋爣鍙傛暟鏄畯瀹氫箟鍏夋爣鍙ユ焺銆侫fxGetApp ()鏄竴涓郴緇熷嚱鏁幫紝瀹冭繑鍥炲綋鍓嶇殑涓涓狢WinApp瀵硅薄銆傚叾鎴愬憳鍑芥暟LoadStandardCursor()鐢ㄦ潵璇誨彇涓涓郴緇熸寚閽堬紝姣忎竴縐嶇郴緇熸寚閽堢殑鍏蜂綋瀹忓畾涔夊涓嬶細(xì)
IDC_APPSTARTING 甯﹀皬娌欐紡鐨勬爣鍑嗙澶?BR>IDC_ARROW 鏍囧噯綆ご
IDC_CROSS 鍗佸瓧鍏夋爣錛堢敤浜庡畾浣嶏級
IDC_HAND Windows 2000錛氭墜鍨?BR>IDC_HELP 甯﹂棶鍙風(fēng)殑綆ご
IDC_IBEAM I鍨嬫爣
IDC_ICON Obsolete for applications marked version 4.0 or later.
IDC_NO 紱佹絎﹀彿
IDC_SIZE Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL.
IDC_SIZEALL 鍗佸瓧綆ご
IDC_SIZENESW 鎸囧悜涓滃寳鍜岃タ鍗楃殑鍙屽悜綆ご
IDC_SIZENS 鎸囧悜鍗楀拰鍖楃殑鍙屽悜綆ご
IDC_SIZENWSE 鎸囧悜瑗垮寳鍜屼笢鍗楃殑鍙屽悜綆ご
IDC_SIZEWE 鎸囧悜涓滆タ鐨勫弻鍚戠澶?BR>IDC_UPARROW 涓婄澶?BR>IDC_WAIT 娌欐紡
涓夈佽幏寰椾富妗嗘灦錛?/STRONG>
CMainFrame * pMainframe = (CMainFrame *) AfxGetApp()->m_pMainWnd;
.鑾峰彇搴旂敤紼嬪簭鐨勫疄渚嬪彞鏌勶細(xì)
Example: HANDLE hInstance=AfxGetInstanceHandle();
鑾峰緱搴旂敤紼嬪簭涓葷獥鍙g殑鎸囬拡錛?BR> Example: AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //浣跨▼搴忔渶澶у寲
鍥涖侀噸鏂板緩绔嬪瓧浣撶殑浠g爜
if(m_fontLogo.m_hObject)
m_fontLogo.Detach();
m_fontLogo.CreateFont(nHeight, 0, 0, 0, nWeight, bItalic, bUnderline,0,0,0,0,0,0, Name);
浜斻佺敤鎸囧畾棰滆壊濉厖鍖哄煙
dc.FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));
鍏佺粯鍒剁珛浣撳瓧浣撴晥鏋滅殑瀛椾綋錛屽緢鍊煎緱涓鐪?BR>void CTestView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetWindowRect(rect);
CFont m_fontLogo;
m_fontLogo.CreateFont(24, 0, 0, 0, FW_BOLD, true,
FALSE,0,0,0,0,0,0, "Arial");
CString m_LogoText;
m_LogoText=_T("Benlux Pro3D System");
dc.SetBkMode(TRANSPARENT);
CFont * OldFont = dc.SelectObject(&m_fontLogo);
// draw text in DC
COLORREF OldColor = dc.SetTextColor( ::GetSysColor( COLOR_3DHILIGHT));
rect.right = rect.Width();
rect.bottom = rect.Height();
rect.left = rect.top = 0;
dc.FillSolidRect(rect, ::GetSysColor(COLOR_3DFACE));
dc.DrawText( m_LogoText, rect + CPoint(1,1), DT_SINGLELINE | DT_LEFT | DT_VCENTER);
dc.SetTextColor( ::GetSysColor( COLOR_3DSHADOW));
dc.DrawText( m_LogoText, rect, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
// restore old text color
dc.SetTextColor( OldColor);
// restore old font
dc.SelectObject(OldFont);
// Do not call CView::OnPaint() for painting messages
}
涓冦佺畝鍗曠殑娑堟伅媯绱㈠拰鎶藉彇鍑芥暟錛岃兘澶熻緋葷粺鍝嶅簲鍏跺畠鎿嶄綔
BOOL PeekAndPump()
{
static MSG msg;
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) {
if (!AfxGetApp()->PumpMessage()) {
::PostQuitMessage(0);
return FALSE;
}
}
return TRUE;
}
鍏佸湪浣犵殑紼嬪簭涓敤鍔ㄧ敾鍏夋爣鏇挎崲榛樿鐨勭瓑寰呭厜鏍?(ANI鍏夋爣鐨勪嬌鐢?
HCURSOR m_hAniCursor=NULL;
BeginWaitCursor(); //begin wait cursor for api function
//load ani cursor from file in current path
TCHAR cursorPath[MAX_PATH]; GetModuleFileName(NULL,cursorPath,MAX_PATH);
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath(cursorPath, drive, dir, fname, ext );
sprintf(cursorPath,"%s%swait.ani",drive,dir); //ani cursor file name is wait.ani
m_hAniCursor= LoadCursorFromFile(cursorPath);
HCURSOR oldCursor;
if(m_hAniCursor != NULL)
oldCursor=SetCursor(m_hAniCursor);
for(long i=0;i<1000;i++)
Sleep(5);
oldCursor=NULL;
m_hAniCursor=NULL;
EndWaitCursor(); //end wait cursor for api function
涔?jié)銆佸浣曢檺鍒剁紪杈戞涓殑鍑嗚瀛楃
濡傛灉鐢ㄦ埛鍦ㄧ紪杈戞帶浠朵腑鍙厑璁告帴鏀舵暟瀛楋紝鍙互浣跨敤涓涓爣鍑嗙殑緙栬緫鎺т歡騫舵寚
瀹氭柊鐨勫垱寤烘爣蹇桬S_NUMBERS,瀹冩槸Windows 95鏂板鍔犵殑鏍囧織錛岃鏍囧織闄愬埗 緙栬緫鎺?BR>浠跺彧鎸夋敹鏁板瓧瀛楃銆?BR>濡傛灉鐢ㄦ埛闇瑕佸鏉傜殑緙栬緫鎺т歡錛屽彲浠ヤ嬌鐢∕icrosoft 鐨勫睆钄界紪杈戞帶浠訛紝瀹冩槸涓涓緢鏈夌敤鐨凮LE瀹氬埗鎺т歡銆?BR> 濡傛灉甯屾湜涓嶄嬌鐢∣LE 瀹氬埗鎺т歡鑷繁澶勭悊瀛楃錛屽彲浠ユ淳鐢熶竴涓狢Edit 綾誨茍澶勭悊WM_CHAR娑堟伅錛岀劧鍚庝粠緙栬緫鎺т歡涓繃婊ゅ嚭鐗瑰畾鐨勫瓧絎︺傞鍏堬紝浣跨敤ClassWizard 寤虹珛涓涓?CEdit鐨勬淳鐢熺被錛屽叾嬈★紝鍦ㄥ璇濈被涓寚瀹氫竴涓垚鍛樺彉閲忓皢緙栬緫鎺т歡鍒嗙被鍦∣nInitdialog 涓皟鐢–Wnd: : SubclassDlgItem .
//In your dialog class declaration (.H file )
private :
CMyEdit m_wndEdit ; // Instance of your new edit control .
//In you dialog class implementation (.CPP file )
BOOL CSampleDialog : : OnInitDialog ( )
{
//Subclass the edit lontrod .
m_wndEdit .SubclassDlgItem (IDC_EDIT,this );
鈥?BR>}
浣跨敤ClassWizard澶勭悊WM_CHAR娑堟伅錛岃綆梟Char鍙傞噺騫跺喅瀹氭墍鎵ц鐨勬搷浣滐紝鐢ㄦ埛鍙互紜畾鏄惁淇敼銆佷紶閫佸瓧絎︺備笅渚嬭鏄庝簡濡備綍鏄劇ず瀛楁瘝瀛楃錛屽鏋滃瓧絎︽槸瀛楁瘝瀛楃錛屽垯璋冪敤CWnd ; OnChar錛屽惁鍒欎笉璋冪敤OnChar.
//Only display alphabetic dharacters .
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UITN nFlags )
{
//Determine if nChar is an alphabetic character .
if (: : IsCharAlpha ( ( TCHAR) nChar ) )
CEdit : : OnChar (nChar, nRepCnt , nFlags );
}
濡傛灉瑕佷慨鏀瑰瓧絎︼紝鍒欎笉鑳戒粎浠呯畝鍗曞湴鐢ㄤ慨鏀硅繃鐨刵Char璋冪敤CEdit : : OnChar銆傝淇敼涓涓瓧絎︼紝闇瑕侀鍏堜慨鏀筺Char錛岀劧鍚庣敤淇敼榪囩殑nChar璋冪敤CWnd: : DefWindowProc銆備笅渚嬭鏄庝簡濡備綍灝嗗瓧絎﹁漿鍙樹負(fù)澶у啓錛?BR>//Make all characters uppercase
void CMyEdit : : OnChar (UINT nChar , UINT nRepCnt , UINT nFlags )
{
//Make sure character is uppercase .
if (: : IsCharAlpha ( .( TCHAR) nChar)
nChar=: : CharUpper (nChar ) ;
//Bypass default OnChar processing and directly call default window proc.
DefWindProc (WM_CHAR, nChar , MAKELPARAM (nRepCnt , nFlags )) ;
}
鍗併佷覆澶暱鏃跺浣曞湪鍏舵湯灝炬樉紺轟竴涓渷鐣ュ彿
璋冪敤CDC:: DrawText騫舵寚瀹欴T_END_ELLIPSIS鏍囧織錛岃繖鏍峰氨鍙互鐢ㄥ皬鐣ュ彿鍙栦唬涓叉湯灝劇殑瀛楃浣垮叾閫傚悎浜庢寚瀹氱殑杈圭晫鐭╁艦銆傚鏋滆鏄劇ず璺緞淇℃伅錛屾寚瀹欴T_END_ELLIPSIS鏍囧織騫剁渷鐣ュ彿鍙栦唬涓蹭腑闂寸殑瀛楃銆?BR>void CSampleView:: OnDraw (CDC* pDC)
{
CTestDoc* pDoc=GetDocument ();
ASSERT_VALID (pDoc);
//Add ellpsis to end of string if it does not fit
pDC->Drawtext (CString ("This is a long string"),
CRect (10, 10, 80, 30), DT_LEFT | DT_END_ELLIPSIS);
//Add ellpsis to middle of string if it does not fit
pDC->DrawText (AfxgetApp () ->m_pszhelpfilePath,
CRect (10, 40, 200, 60), DT_LEFT | DT_PATH_ELLIPSIS);
}
鍗佷竴銆佸浣曞疄鐜頒竴涓鐨尯鐭╁艦(鍏鋒湁韙抗鐭╁艦騫跺彲縐誨姩銆佺緝鏀劇殑鐭╁艦)
CRectTracker鏄竴涓緢鏈夌敤鐨勭被錛屽彲浠ラ氳繃璋冪敤CRectTracker:: TrackRubberBand鍝嶅簲WM_LBUTTONDOWN娑堟伅鏉ュ垱寤轟竴涓鐨尯鐭╁艦銆備笅渚嬭〃鏄庝嬌鐢–RectTracker縐誨姩鍜岄噸緗紿椾腑鐨勮摑鑹叉き鍦嗙殑澶у皬鏄緢瀹規(guī)槗鐨勪簨鎯呫?BR> 棣栧厛錛屽湪鏂囨。綾諱腑澹版槑涓涓狢RectTracker鏁版嵁鎴愬憳錛?BR>class CTestDoc: Public CDocument
{鈥?BR>public:
CRectTracker m_tracker;
鈥?BR>};
鍏舵錛屽湪鏂囨。綾葷殑鏋勯犲嚱鏁頒腑鍒濆鍖朇RectTracker 瀵硅薄錛?BR>CTestDoc::CTestDoc()
{
m_tracker.m_rect.SetRect (10, 10, 300, 300);
m_tracker.m_nStyle=CRectTracker:: resizeInside |
CRectTracker:: dottedLine;
}
鐒跺悗錛屽湪瑙嗗浘綾葷殑OnDraw鍑芥暟涓敾妞渾鍜岃釜榪圭煩褰細(xì)
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//Select blue brush into device context.
CBrush brush (RGB (0, 0, 255));
CBrush* pOldBrush=pDC->SelectObject (&brush);
//draw ellipse in tracking rectangle.
CRect rcEllipse;
pDoc->m_tracker.GetTrueRect (rcEllipse);
pDC->Ellipse (rcEllipse);
//Draw tracking rectangle.
pDoc->m_tracker.Draw (pDC);
//Select blue brush out of device context.
pDC->SelectObject(pOldBrush);
}
鏈鍚庯紝瑙嗗浘綾諱腑澶勭悊WM_LBUTTONDOWN娑堟伅錛屽茍澧炲姞涓嬭堪浠g爜銆傝孌典唬鐮佹牴鎹紶鏍囧嚮閿儏鍐靛彲浠ユ嫋鏀俱佺Щ鍔ㄦ垨鑰呴噸緗き鍦嗙殑澶у皬銆?/P>
void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
//Get pointer to document.
CTestDoc* pDoc=GetDocument();
ASSERT_VALID (pDoc);
//If clicked on ellipse, drag or resize it. Otherwise create a
//rubber-band rectangle nd create a new ellipse.
BOOL bResult=pDoc->m_tracker.HitTest (point)!=
CRectTracker::hitNothing;
//Tracker rectangle changed so update views.
if (bResult)
{
pDoc->m_tracker.Track (this,point,TRUE);
pDoc->SetModifiedFlag ();
pDoc->UpdateAllViews (NULL);
}
else
pDoc->m_tracker.TrackRubberBand (this,point,TRUE);
CView::OnLButtonDown(nFlags, point);
}
鍗佷簩銆佸浣曞湪涓存椂鐩綍鍒涘緩涓涓復(fù)鏃舵枃浠?/STRONG>
濡傛灉浣犺鍦ㄤ復(fù)鏃剁洰褰曚笅鍒涘緩涓存椂鏂囦歡錛屼笅闈㈢殑浠g爜鑳藉府鍒頒綘鐨勫繖銆?BR>bool GetuniqueTempName (CString& strTempName)
{
strTempName="";
//Get the temporary files directory.
TCHAR szTempPath [MAX_PATH];
DWORD dwResult=:: GetTempPath (MAX_PATH, szTempPath);
if (dwResult==0)
return false;
//Create a unique temporary file.
TCHAR szTempFile[MAX_PATH];
UINT nResult=GetTempFileName (szTempPath, _T ("~ex"),0,szTempFile);
if (dwResult==0)
return false;
strTempName=szTempFile;
return true;
}
鍗佷笁銆佸浣曢檺鍒剁獥鍙g殑鏈灝忚寖鍥?/STRONG>
瑕侀檺鍒剁獥浣撶殑澶у皬錛屼笅闈㈢殑浠g爜鑳藉府鍒頒綘鐨勫繖銆?BR>鍦–MainFrame涓鍔燱M_GETMAXMININFO娑堟伅鐨勫鐞嗗嚱鏁幫紝鐒跺悗鍦ㄨ繖涓嚱鏁頒腑鍐欎唬鐮佸涓?
//闄愬埗涓葷獥浣撶殑鏈灝忛珮搴﹀拰瀹藉害
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
lpMMI->ptMinTrackSize.x=600;
lpMMI->ptMinTrackSize.y=400;
CNewFrameWnd::OnGetMinMaxInfo(lpMMI);
}
鍗佸洓銆佹庢牱鍒犻櫎鏂囦歡鍒板洖鏀剁珯涓?/STRONG>
瑕佸垹闄ゆ枃浠跺埌鍥炴敹绔欙紝寰堢畝鍗曘傚彧瑕佺敤SHFileOperation鍑芥暟灝辮浜嗭紝涓嬮潰鐨勪唬鐮佹垜灝嗕負(fù)浣犳紨紺轟簡榪欎竴涓嚱鏁扮殑鐢ㄦ硶銆傚綋鐒朵綘鍙互鐩存帴鎷瘋礉鍒頒綘鐨勯」鐩腑銆?BR>//鍒犻櫎鏂囦歡鍒板洖鏀剁珯涓?BR>//pszPath : 寰呭垹闄ょ殑鍏ㄨ礬寰勬枃浠跺悕
//bDelete : TRUE 鍒犻櫎錛屼笉縐誨埌鍥炴敹绔欙紝FALSE:縐誨埌鍥炴敹绔?BR>涓銆?nbsp;//榪斿洖 : TRUE 鍒犻櫎鎴愬姛 FALSE 鍒犻櫎澶辮觸
BOOL CDelFileToRecycleDlg::Recycle(LPCTSTR pszPath, BOOL bDelete/*=FALSE*/)
{
SHFILEOPSTRUCT shDelFile;
memset(&shDelFile,0,sizeof(SHFILEOPSTRUCT));
shDelFile.fFlags |= FOF_SILENT; // don"t report progress
shDelFile.fFlags |= FOF_NOERRORUI; // don"t report errors
shDelFile.fFlags |= FOF_NOCONFIRMATION; // don"t confirm delete
// Copy pathname to double-NULL-terminated string.
//
TCHAR buf[_MAX_PATH + 1]; // allow one more character
_tcscpy(buf, pszPath); // copy caller"s pathname
buf[_tcslen(buf)+1]=0; // need two NULLs at end
// Set SHFILEOPSTRUCT params for delete operation
shDelFile.wFunc = FO_DELETE; // REQUIRED: delete operation
shDelFile.pFrom = buf; // REQUIRED: which file(s)
shDelFile.pTo = NULL; // MUST be NULL
if (bDelete)
{ // if delete requested..
shDelFile.fFlags &= ~FOF_ALLOWUNDO; // ..don"t use Recycle Bin
}
else
{ // otherwise..
shDelFile.fFlags |= FOF_ALLOWUNDO; // ..send to Recycle Bin
}
return SHFileOperation(&shDelFile); // do it!
}
鍗佷簲銆佸唴瀛樻硠婕忔鏌?/STRONG>
涔熻浣犲凡緇忕煡閬擄紝鍦–++鍜孋璇█涓寚閽堥棶棰樹篃灝辨槸鍐呭瓨鐢寵涓庨噴鏀炬槸涓涓護(hù)浜哄ご鐤肩殑浜嬫儏錛屽亣濡備綘鐢寵浜嗗唴瀛橈紝浣嗘病鏈夐噴鏀撅紝騫朵笖浣犵殑紼嬪簭闇瑕侀暱鏃墮棿鍦拌繍琛岋紝閭d箞錛岀郴緇熺殑璧勬簮灝嗛愭笎鍑忓皯錛屽綋緋葷粺鐨勮祫婧愬叏閮ㄨ鐢ㄥ畬鏃訛紝緋葷粺灝嗕細(xì)宕╂簝銆傛墍浠ュ湪寮鍙戠▼搴忕殑榪囩▼涓竴瀹氳淇濊瘉璧勬簮鐨勫畬鍏ㄩ噴鏀俱備笅闈㈡垜浠潵浠嬬粛鍐呭瓨婕忔礊鐨勬鏌ャ?BR>紺轟緥濡備笅錛?BR>// do your memory allocations and deallocations...
CString s = "This is a frame variable";
#ifdef _DEBUG
CMemoryState oldMemState, newMemState, diffMemState;
oldMemState.Checkpoint();
#endif
// the next object is a heap object
CString* p = new CString( "Smith Alan 581_0215" );
delete p;
p=NULL;
#ifdef _DEBUG
newMemState.Checkpoint();
BOOL b=diffMemState.Difference(oldMemState, newMemState);
if (b)
{
AfxMessageBox( "Memory leaked! " );
}
#endif
鏍規(guī)嵁璇曢獙錛岀敱浜庢垜浠棤娉曢噴鏀炬帀璞nt CString char 鐢寵鐨勫彉閲忋傚彧鑳介噴鏀炬寚閽堝瀷鐨勫彉閲忋傝屾嫻嬪唴瀛樻椂錛岀収鏍蜂細(xì)鍑虹幇鍐呭瓨娉勬紡鐜拌薄銆傛墍浠ワ紝榪欑鍐呭瓨?gòu)個嫻嬫柟寮忓眬闄愭ц繕鏄緢澶с傚洜涓烘垜浠棤娉曢噴鏀鵑潪鎸囬拡鍨嬪彉閲忋?/P>
]]>