ºìÁªLinuxÃÅ»§
Linux°ïÖú

linuxÖÐgccµÄÓ¦ÓÃ

·¢²¼Ê±¼ä:2007-01-10 00:50:24À´Ô´:ºìÁª×÷Õß:announcement
ÔÚΪLinux¿ª·¢Ó¦ÓóÌÐòʱ£¬¾ø´ó¶àÊýÇé¿öÏÂʹÓõĶ¼ÊÇCÓïÑÔ£¬Òò´Ë¼¸ºõÿһλLinux³ÌÐòÔ±ÃæÁÙµÄÊ×ÒªÎÊÌⶼÊÇÈçºÎÁé»îÔËÓÃC±àÒëÆ÷¡£Ä¿Ç°Linux ÏÂ×î³£ÓõÄCÓïÑÔ±àÒëÆ÷ÊÇGCC£¨GNU Compiler Collection£©£¬ËüÊÇGNUÏîÄ¿ÖзûºÏANSI C±ê×¼µÄ±àÒëϵͳ£¬Äܹ»±àÒëÓÃC¡¢C++ºÍObject CµÈÓïÑÔ±àдµÄ³ÌÐò¡£GCC²»½ö¹¦Äܷdz£Ç¿´ó£¬½á¹¹Ò²Òì³£Áé»î¡£×îÖµµÃ³ÆµÀµÄÒ»µã¾ÍÊÇËü¿ÉÒÔͨ¹ý²»Í¬µÄÇ°¶ËÄ£¿éÀ´Ö§³Ö¸÷ÖÖÓïÑÔ£¬ÈçJava¡¢ Fortran¡¢Pascal¡¢Modula-3ºÍAdaµÈ¡£

¿ª·Å¡¢×ÔÓɺÍÁé»îÊÇLinuxµÄ÷ÈÁ¦ËùÔÚ£¬¶øÕâÒ»µãÔÚGCCÉϵÄÌåÏÖ¾ÍÊdzÌÐòԱͨ¹ýËüÄܹ»¸üºÃµØ¿ØÖÆÕû¸ö±àÒë¹ý³Ì¡£ÔÚʹÓÃGCC±àÒë³ÌÐòʱ£¬±àÒë¹ý³Ì¿ÉÒÔ±»Ï¸·ÖΪËĸö½×¶Î£º

¡ô Ô¤´¦Àí£¨Pre-Processing£©

¡ô ±àÒ루Compiling£©

¡ô »ã±à£¨Assembling£©

¡ô Á´½Ó£¨Linking£©

Linux³ÌÐòÔ±¿ÉÒÔ¸ù¾Ý×Ô¼ºµÄÐèÒªÈà GCCÔÚ±àÒëµÄÈκν׶νáÊø£¬ÒÔ±ã¼ì²é»òʹÓñàÒëÆ÷Ôڸý׶εÄÊä³öÐÅÏ¢£¬»òÕ߶Ô×îºóÉú³ÉµÄ¶þ½øÖÆÎļþ½øÐпØÖÆ£¬ÒÔ±ãͨ¹ý¼ÓÈ벻ͬÊýÁ¿ºÍÖÖÀàµÄµ÷ÊÔ´úÂëÀ´Îª½ñºóµÄµ÷ÊÔ×öºÃ×¼±¸¡£ºÍÆäËü³£ÓõıàÒëÆ÷Ò»Ñù£¬GCCÒ²ÌṩÁËÁé»î¶øÇ¿´óµÄ´úÂëÓÅ»¯¹¦ÄÜ£¬ÀûÓÃËü¿ÉÒÔÉú³ÉÖ´ÐÐЧÂʸü¸ßµÄ´úÂë¡£

GCCÌṩÁË30¶àÌõ¾¯¸æÐÅÏ¢ºÍÈý¸ö¾¯¸æ¼¶±ð£¬Ê¹ÓÃËüÃÇÓÐÖúÓÚÔöÇ¿³ÌÐòµÄÎȶ¨ÐԺͿÉÒÆÖ²ÐÔ¡£´ËÍ⣬GCC»¹¶Ô±ê×¼µÄCºÍC++ÓïÑÔ½øÐÐÁË´óÁ¿µÄÀ©Õ¹£¬Ìá¸ß³ÌÐòµÄÖ´ÐÐЧÂÊ£¬ÓÐÖúÓÚ±àÒëÆ÷½øÐдúÂëÓÅ»¯£¬Äܹ»¼õÇá±à³ÌµÄ¹¤×÷Á¿¡£

GCCÆð²½

ÔÚѧϰʹÓÃGCC֮ǰ£¬ÏÂÃæµÄÕâ¸öÀý×ÓÄܹ»°ïÖúÓû§Ñ¸ËÙÀí½âGCCµÄ¹¤×÷Ô­Àí£¬²¢½«ÆäÁ¢¼´ÔËÓõ½Êµ¼ÊµÄÏîÄ¿¿ª·¢ÖÐÈ¥¡£Ê×ÏÈÓÃÊìϤµÄ±à¼­Æ÷ÊäÈëÇåµ¥1ËùʾµÄ´úÂ룺

Çåµ¥1£ºhello.c

#include
int main(void)
{
printf ("Hello world, Linux programming!\\n");
return 0;
}

È»ºóÖ´ÐÐÏÂÃæµÄÃüÁî±àÒëºÍÔËÐÐÕâ¶Î³ÌÐò£º

# gcc hello.c -o hello
# ./hello
Hello world, Linux programming!

´Ó³ÌÐòÔ±µÄ½Ç¶È¿´£¬Ö»Ðè¼òµ¥µØÖ´ÐÐÒ»ÌõGCCÃüÁî¾Í¿ÉÒÔÁË£¬µ«´Ó±àÒëÆ÷µÄ½Ç¶ÈÀ´¿´£¬È´ÐèÒªÍê³ÉһϵÁзdz£·±ÔӵŤ×÷¡£Ê×ÏÈ£¬GCCÐèÒªµ÷ÓÃÔ¤´¦Àí³ÌÐò cpp£¬ÓÉËü¸ºÔðÕ¹¿ªÔÚÔ´ÎļþÖж¨ÒåµÄºê£¬²¢ÏòÆäÖвåÈë¡°#include¡±Óï¾äËù°üº¬µÄÄÚÈÝ£»½Ó×Å£¬GCC»áµ÷ÓÃcclºÍas½«´¦ÀíºóµÄÔ´´úÂë±àÒë³ÉÄ¿±ê´úÂ룻×îºó£¬GCC»áµ÷ÓÃÁ´½Ó³ÌÐòld£¬°ÑÉú³ÉµÄÄ¿±ê´úÂëÁ´½Ó³ÉÒ»¸ö¿ÉÖ´ÐгÌÐò¡£

ΪÁ˸üºÃµØÀí½âGCCµÄ¹¤×÷¹ý³Ì£¬¿ÉÒÔ°ÑÉÏÊö±àÒë¹ý³Ì·Ö³É¼¸¸ö²½Öèµ¥¶À½øÐУ¬²¢¹Û²ìÿ²½µÄÔËÐнá¹û¡£µÚÒ»²½ÊǽøÐÐÔ¤±àÒ룬ʹÓÃ-E²ÎÊý¿ÉÒÔÈÃGCCÔÚÔ¤´¦Àí½áÊøºóÍ£Ö¹±àÒë¹ý³Ì£º

# gcc -E hello.c -o hello.i

´ËʱÈô²é¿´hello.cppÎļþÖеÄÄÚÈÝ£¬»á·¢ÏÖstdio.hµÄÄÚÈÝȷʵ¶¼²åµ½ÎļþÀïÈ¥ÁË£¬¶øÆäËüÓ¦µ±±»Ô¤´¦ÀíµÄºê¶¨ÒåÒ²¶¼×öÁËÏàÓ¦µÄ´¦Àí¡£ÏÂÒ»²½Êǽ«hello.i±àÒëΪĿ±ê´úÂ룬Õâ¿ÉÒÔͨ¹ýʹÓÃ-c²ÎÊýÀ´Íê³É£º

# gcc -c hello.i -o hello.o

GCCĬÈϽ«.iÎļþ¿´³ÉÊÇÔ¤´¦ÀíºóµÄCÓïÑÔÔ´´úÂ룬Òò´ËÉÏÊöÃüÁ×Ô¶¯Ìø¹ýÔ¤´¦Àí²½Öè¶ø¿ªÊ¼Ö´ÐбàÒë¹ý³Ì£¬Ò²¿ÉÒÔʹÓÃ-x²ÎÊýÈÃGCC´ÓÖ¸¶¨µÄ²½Ö迪ʼ±àÒë¡£×îºóÒ»²½Êǽ«Éú³ÉµÄÄ¿±êÎļþÁ´½Ó³É¿ÉÖ´ÐÐÎļþ£º

# gcc hello.o -o hello

ÔÚ²ÉÓÃÄ£¿é»¯µÄÉè¼Æ˼Ïë½øÐÐÈí¼þ¿ª·¢Ê±£¬Í¨³£Õû¸ö³ÌÐòÊÇÓɶà¸öÔ´Îļþ×é³ÉµÄ£¬ÏàÓ¦µØÒ²¾ÍÐγÉÁ˶à¸ö±àÒëµ¥Ôª£¬Ê¹ÓÃGCCÄܹ»ºÜºÃµØ¹ÜÀíÕâЩ±àÒëµ¥Ôª¡£¼ÙÉèÓÐÒ»¸öÓÉfoo1.cºÍfoo2.cÁ½¸öÔ´Îļþ×é³ÉµÄ³ÌÐò£¬ÎªÁ˶ÔËüÃǽøÐбàÒ룬²¢×îÖÕÉú³É¿ÉÖ´ÐгÌÐòfoo£¬¿ÉÒÔʹÓÃÏÂÃæÕâÌõÃüÁ

# gcc foo1.c foo2.c -o foo

Èç¹ûͬʱ´¦ÀíµÄÎļþ²»Ö¹Ò»¸ö£¬GCCÈÔÈ»»á°´ÕÕÔ¤´¦Àí¡¢±àÒëºÍÁ´½ÓµÄ¹ý³ÌÒÀ´Î½øÐС£Èç¹ûÉÆðÀ´£¬ÉÏÃæÕâÌõÃüÁî´óÖÂÏ൱ÓÚÒÀ´ÎÖ´ÐÐÈçÏÂÈýÌõÃüÁ

# gcc -c foo1.c -o foo1.o
# gcc -c foo2.c -o foo2.o
# gcc foo1.o foo2.o -o foo

ÔÚ±àÒëÒ»¸ö°üº¬Ðí¶àÔ´ÎļþµÄ¹¤³Ìʱ£¬ÈôÖ»ÓÃÒ»ÌõGCCÃüÁîÀ´Íê³É±àÒëÊǷdz£ÀË·Ñʱ¼äµÄ¡£¼ÙÉèÏîÄ¿ÖÐÓÐ100¸öÔ´ÎļþÐèÒª±àÒ룬²¢ÇÒÿ¸öÔ´ÎļþÖж¼°üº¬ 10000ÐдúÂ룬Èç¹ûÏñÉÏÃæÄÇÑù½öÓÃÒ»ÌõGCCÃüÁîÀ´Íê³É±àÒ빤×÷£¬ÄÇôGCCÐèÒª½«Ã¿¸öÔ´Îļþ¶¼ÖØбàÒëÒ»±é£¬È»ºóÔÙÈ«²¿Á¬½ÓÆðÀ´¡£ºÜÏÔÈ»£¬ÕâÑùÀ˷ѵÄʱ¼äÏ൱¶à£¬ÓÈÆäÊǵ±Óû§Ö»ÊÇÐÞ¸ÄÁËÆäÖÐijһ¸öÎļþµÄʱºò£¬ÍêȫûÓбØÒª½«Ã¿¸öÎļþ¶¼ÖØбàÒëÒ»±é£¬ÒòΪºÜ¶àÒѾ­Éú³ÉµÄÄ¿±êÎļþÊDz»»á¸Ä±äµÄ¡£Òª½â¾öÕâ¸öÎÊÌ⣬¹Ø¼üÊÇÒªÁé»îÔËÓÃGCC£¬Í¬Ê±»¹Òª½èÖúÏñMakeÕâÑùµÄ¹¤¾ß¡£

¾¯¸æÌáʾ¹¦ÄÜ

GCC°üº¬ÍêÕûµÄ³ö´í¼ì²éºÍ¾¯¸æÌáʾ¹¦ÄÜ£¬ËüÃÇ¿ÉÒÔ°ïÖúLinux³ÌÐòԱд³ö¸ü¼ÓרҵºÍÓÅÃÀµÄ´úÂë¡£ÏÈÀ´¶Á¶ÁÇåµ¥2ËùʾµÄ³ÌÐò£¬Õâ¶Î´úÂëдµÃºÜÔã¸â£¬×Ðϸ¼ì²éһϲ»ÄÑÌô³öºÜ¶à벡£º

¡ômainº¯ÊýµÄ·µ»ØÖµ±»ÉùÃ÷Ϊvoid£¬µ«Êµ¼ÊÉÏÓ¦¸ÃÊÇint£»

¡ôʹÓÃÁËGNUÓï·¨À©Õ¹£¬¼´Ê¹ÓÃlong longÀ´ÉùÃ÷64λÕûÊý£¬²»·ûºÏANSI/ISO CÓïÑÔ±ê×¼£»

¡ômainº¯ÊýÔÚÖÕֹǰûÓе÷ÓÃreturnÓï¾ä¡£

Çåµ¥2£ºillcode.c

#include
void main(void)
{
long long int var = 1;
printf("It is not standard C code!\\n");
}

ÏÂÃæÀ´¿´¿´GCCÊÇÈçºÎ°ïÖú³ÌÐòÔ±À´·¢ÏÖÕâЩ´íÎóµÄ¡£µ±GCCÔÚ±àÒë²»·ûºÏANSI/ISO CÓïÑÔ±ê×¼µÄÔ´´úÂëʱ£¬Èç¹û¼ÓÉÏÁË-pedanticÑ¡ÏÄÇôʹÓÃÁËÀ©Õ¹Óï·¨µÄµØ·½½«²úÉúÏàÓ¦µÄ¾¯¸æÐÅÏ¢£º

# 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±àÒëÑ¡Ïî²¢²»Äܱ£Ö¤±»±àÒë³ÌÐòÓëANSI/ISO C±ê×¼µÄÍêÈ«¼æÈÝ£¬Ëü½ö½öÖ»ÄÜÓÃÀ´°ïÖúLinux³ÌÐòÔ±ÀëÕâ¸öÄ¿±êÔ½À´Ô½½ü¡£»òÕß»»¾ä»°Ëµ£¬-pedanticÑ¡ÏîÄܹ»°ïÖú³ÌÐòÔ±·¢ÏÖһЩ²»·ûºÏANSI/ISO C±ê×¼µÄ´úÂ룬µ«²»ÊÇÈ«²¿£¬ÊÂʵÉÏÖ»ÓÐANSI/ISO CÓïÑÔ±ê×¼ÖÐÒªÇó½øÐбàÒëÆ÷Õï¶ÏµÄÄÇЩÇé¿ö£¬²ÅÓпÉÄܱ»GCC·¢ÏÖ²¢Ìá³ö¾¯¸æ¡£

³ýÁË-pedanticÖ®Í⣬GCC»¹ÓÐһЩÆäËü±àÒëÑ¡ÏîÒ²Äܹ»²úÉúÓÐÓõľ¯¸æÐÅÏ¢¡£ÕâЩѡÏî´ó¶àÒÔ-W¿ªÍ·£¬ÆäÖÐ×îÓмÛÖµµÄµ±Êý-WallÁË£¬Ê¹ÓÃËüÄܹ»Ê¹GCC²úÉú¾¡¿ÉÄܶàµÄ¾¯¸æÐÅÏ¢£º

# 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¸ø³öµÄ¾¯¸æÐÅÏ¢ËäÈ»´ÓÑϸñÒâÒåÉÏ˵²»ÄÜËã×÷ÊÇ´íÎ󣬵«È´ºÜ¿ÉÄܳÉΪ´íÎóµÄÆÜÉíÖ®Ëù¡£Ò»¸öÓÅÐãµÄLinux³ÌÐòÔ±Ó¦¸Ã¾¡Á¿±ÜÃâ²úÉú¾¯¸æÐÅÏ¢£¬Ê¹×Ô¼ºµÄ´úÂëʼÖÕ±£³Ö¼ò½à¡¢ÓÅÃÀºÍ½¡×³µÄÌØÐÔ¡£

ÔÚ´¦Àí¾¯¸æ·½Ã棬ÁíÒ»¸ö³£ÓõıàÒëÑ¡ÏîÊÇ-Werror£¬ËüÒªÇóGCC½«ËùÓеľ¯¸æµ±³É´íÎó½øÐд¦Àí£¬ÕâÔÚʹÓÃ×Ô¶¯±àÒ빤¾ß£¨ÈçMakeµÈ£©Ê±·Ç³£ÓÐÓá£Èç¹û±àÒëʱ´øÉÏ-WerrorÑ¡ÏÄÇôGCC»áÔÚËùÓвúÉú¾¯¸æµÄµØ·½Í£Ö¹±àÒ룬ÆÈʹ³ÌÐòÔ±¶Ô×Ô¼ºµÄ´úÂë½øÐÐÐ޸ġ£Ö»Óе±ÏàÓ¦µÄ¾¯¸æÐÅÏ¢Ïû³ýʱ£¬²Å¿ÉÄܽ«±àÒë¹ý³Ì¼ÌÐø³¯Ç°Íƽø¡£Ö´ÐÐÇé¿öÈçÏ£º

# 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'

¶ÔLinux³ÌÐòÔ±À´½²£¬GCC¸ø³öµÄ¾¯¸æÐÅÏ¢ÊǺÜÓмÛÖµµÄ£¬ËüÃDz»½ö¿ÉÒÔ°ïÖú³ÌÐòԱд³ö¸ü¼Ó½¡×³µÄ³ÌÐò£¬¶øÇÒ»¹ÊǸú×ٺ͵÷ÊÔ³ÌÐòµÄÓÐÁ¦¹¤¾ß¡£½¨ÒéÔÚÓÃGCC±àÒëÔ´´úÂëʱʼÖÕ´øÉÏ-WallÑ¡Ï²¢°ÑËüÖð½¥ÅàÑø³ÉΪһÖÖÏ°¹ß£¬Õâ¶ÔÕÒ³ö³£¼ûµÄÒþʽ±à³Ì´íÎóºÜÓаïÖú¡£

¿âÒÀÀµ

ÔÚLinux Ï¿ª·¢Èí¼þʱ£¬ÍêÈ«²»Ê¹ÓõÚÈý·½º¯Êý¿âµÄÇé¿öÊDZȽÏÉÙ¼ûµÄ£¬Í¨³£À´½²¶¼ÐèÒª½èÖúÒ»¸ö»ò¶à¸öº¯Êý¿âµÄÖ§³Ö²ÅÄܹ»Íê³ÉÏàÓ¦µÄ¹¦ÄÜ¡£´Ó³ÌÐòÔ±µÄ½Ç¶È¿´£¬º¯Êý¿âʵ¼ÊÉϾÍÊÇһЩͷÎļþ£¨.h£©ºÍ¿âÎļþ£¨.so»òÕß.a£©µÄ¼¯ºÏ¡£ËäÈ»LinuxϵĴó¶àÊýº¯Êý¶¼Ä¬ÈϽ«Í·Îļþ·Åµ½/usr/include/Ŀ¼Ï£¬¶ø¿âÎļþÔò·Åµ½/usr/lib/Ŀ¼Ï£¬µ«²¢²»ÊÇËùÓеÄÇé¿ö¶¼ÊÇÕâÑù¡£ÕýÒòÈç´Ë£¬GCCÔÚ±àÒëʱ±ØÐëÓÐ×Ô¼ºµÄ°ì·¨À´²éÕÒËùÐèÒªµÄÍ·ÎļþºÍ¿âÎļþ¡£

GCC²ÉÓÃËÑË÷Ŀ¼µÄ°ì·¨À´²éÕÒËùÐèÒªµÄÎļþ£¬-IÑ¡Ïî¿ÉÒÔÏòGCCµÄÍ·ÎļþËÑË÷·¾¶ÖÐÌí¼ÓеÄĿ¼¡£ÀýÈ磬Èç¹ûÔÚ/home/xiaowp/include/Ŀ¼ÏÂÓбàÒëʱËùÐèÒªµÄÍ·Îļþ£¬ÎªÁËÈÃGCCÄܹ»Ë³ÀûµØÕÒµ½ËüÃÇ£¬¾Í¿ÉÒÔʹÓÃ-IÑ¡Ï

# gcc foo.c -I /home/xiaowp/include -o foo

ͬÑù£¬Èç¹ûʹÓÃÁ˲»ÔÚ±ê׼λÖõĿâÎļþ£¬ÄÇô¿ÉÒÔͨ¹ý-LÑ¡ÏîÏòGCCµÄ¿âÎļþËÑË÷·¾¶ÖÐÌí¼ÓеÄĿ¼¡£ÀýÈ磬Èç¹ûÔÚ/home/xiaowp/lib/Ŀ¼ÏÂÓÐÁ´½ÓʱËùÐèÒªµÄ¿âÎļþlibfoo.so£¬ÎªÁËÈÃGCCÄܹ»Ë³ÀûµØÕÒµ½Ëü£¬¿ÉÒÔʹÓÃÏÂÃæµÄÃüÁ

# gcc foo.c -L /home/xiaowp/lib -lfoo -o foo

ÖµµÃºÃºÃ½âÊÍһϵÄÊÇ-lÑ¡ÏËüָʾGCCÈ¥Á¬½Ó¿âÎļþlibfoo.so¡£LinuxϵĿâÎļþÔÚÃüÃûʱÓÐÒ»¸öÔ¼¶¨£¬ÄǾÍÊÇÓ¦¸ÃÒÔlibÈý¸ö×Öĸ¿ªÍ·£¬ÓÉÓÚËùÓеĿâÎļþ¶¼×ñÑ­ÁËͬÑùµÄ¹æ·¶£¬Òò´ËÔÚÓÃ-lÑ¡ÏîÖ¸¶¨Á´½ÓµÄ¿âÎļþÃûʱ¿ÉÒÔÊ¡È¥libÈý¸ö×Öĸ£¬Ò²¾ÍÊÇ˵GCCÔÚ¶Ô-lfoo½øÐд¦Àíʱ£¬»á×Ô¶¯È¥Á´½ÓÃûΪlibfoo.soµÄÎļþ¡£

LinuxϵĿâÎļþ·ÖΪÁ½´óÀà·Ö±ðÊǶ¯Ì¬Á´½Ó¿â£¨Í¨³£ÒÔ.so½á⣩ºÍ¾²Ì¬Á´½Ó¿â£¨Í¨³£ÒÔ.a½á⣩£¬Á½ÕߵIJî±ð½öÔÚ³ÌÐòÖ´ÐÐʱËùÐèµÄ´úÂëÊÇÔÚÔËÐÐʱ¶¯Ì¬¼ÓÔصģ¬»¹ÊÇÔÚ±àÒëʱ¾²Ì¬¼ÓÔصġ£Ä¬ÈÏÇé¿öÏ£¬GCCÔÚÁ´½ÓʱÓÅÏÈʹÓö¯Ì¬Á´½Ó¿â£¬Ö»Ó屶¯Ì¬Á´½Ó¿â²»´æÔÚʱ²Å¿¼ÂÇʹÓþ²Ì¬Á´½Ó¿â£¬Èç¹ûÐèÒªµÄ»°¿ÉÒÔÔÚ±àÒëʱ¼ÓÉÏ-staticÑ¡ÏǿÖÆʹÓþ²Ì¬Á´½Ó¿â¡£ÀýÈ磬Èç¹ûÔÚ/home/xiaowp/lib/Ŀ¼ÏÂÓÐÁ´½ÓʱËùÐèÒªµÄ¿âÎļþlibfoo.soºÍlibfoo.a£¬ÎªÁËÈà GCCÔÚÁ´½ÓʱֻÓõ½¾²Ì¬Á´½Ó¿â£¬¿ÉÒÔʹÓÃÏÂÃæµÄÃüÁ

# gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo

´úÂëÓÅ»¯

´úÂëÓÅ»¯Ö¸µÄÊDZàÒëÆ÷ͨ¹ý·ÖÎöÔ´´úÂ룬ÕÒ³öÆäÖÐÉÐδ´ïµ½×îÓŵIJ¿·Ö£¬È»ºó¶ÔÆäÖØнøÐÐ×éºÏ£¬Ä¿µÄÊǸÄÉƳÌÐòµÄÖ´ÐÐÐÔÄÜ¡£GCCÌṩµÄ´úÂëÓÅ»¯¹¦Äܷdz£Ç¿´ó£¬Ëüͨ¹ý±àÒëÑ¡Ïî-OnÀ´¿ØÖÆÓÅ»¯´úÂëµÄÉú³É£¬ÆäÖÐnÊÇÒ»¸ö´ú±íÓÅ»¯¼¶±ðµÄÕûÊý¡£¶ÔÓÚ²»Í¬°æ±¾µÄGCCÀ´½²£¬nµÄÈ¡Öµ·¶Î§¼°Æä¶ÔÓ¦µÄÓÅ»¯Ð§¹û¿ÉÄܲ¢²»ÍêÈ«Ïàͬ£¬±È½ÏµäÐ͵ķ¶Î§ÊÇ´Ó0±ä»¯µ½2»ò3¡£

±àÒëʱʹÓÃÑ¡Ïî-O¿ÉÒÔ¸æËß GCCͬʱ¼õС´úÂëµÄ³¤¶ÈºÍÖ´ÐÐʱ¼ä£¬ÆäЧ¹ûµÈ¼ÛÓÚ-O1¡£ÔÚÕâÒ»¼¶±ðÉÏÄܹ»½øÐеÄÓÅ»¯ÀàÐÍËäȻȡ¾öÓÚÄ¿±ê´¦ÀíÆ÷£¬µ«Ò»°ã¶¼»á°üÀ¨Ïß³ÌÌøת£¨Thread Jump£©ºÍÑÓ³ÙÍËÕ»£¨Deferred Stack Pops£©Á½ÖÖÓÅ»¯¡£Ñ¡Ïî-O2¸æËßGCC³ýÁËÍê³ÉËùÓÐ-O1¼¶±ðµÄÓÅ»¯Ö®Í⣬ͬʱ»¹Òª½øÐÐһЩ¶îÍâµÄµ÷Õû¹¤×÷£¬Èç´¦ÀíÆ÷Ö¸Áîµ÷¶ÈµÈ¡£Ñ¡Ïî-O3Ôò³ýÁËÍê³ÉËùÓÐ-O2¼¶±ðµÄÓÅ»¯Ö®Í⣬»¹°üÀ¨Ñ­»·Õ¹¿ªºÍÆäËüһЩÓë´¦ÀíÆ÷ÌØÐÔÏà¹ØµÄÓÅ»¯¹¤×÷¡£Í¨³£À´Ëµ£¬Êý×ÖÔ½´óÓÅ»¯µÄµÈ¼¶Ô½¸ß£¬Í¬Ê±Ò²¾ÍÒâζ×ųÌÐòµÄÔËÐÐËÙ¶ÈÔ½¿ì¡£Ðí¶àLinux³ÌÐòÔ±¶¼Ï²»¶Ê¹ÓÃ-O2Ñ¡ÏÒòΪËüÔÚÓÅ»¯³¤¶È¡¢±àÒëʱ¼äºÍ´úÂë´óС֮¼ä£¬È¡µÃÁËÒ»¸ö±È½ÏÀíÏëµÄƽºâµã¡£

ÏÂÃæͨ¹ý¾ßÌåʵÀýÀ´¸ÐÊÜÒ»ÏÂGCCµÄ´úÂëÓÅ»¯¹¦ÄÜ£¬ËùÓóÌÐòÈçÇåµ¥3Ëùʾ¡£

Çåµ¥3£ºoptimize.c

#include
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 %lf\\n", result);
return 0;
}

Ê×ÏȲ»¼ÓÈκÎÓÅ»¯Ñ¡Ïî½øÐбàÒ룺

# gcc -Wall optimize.c -o optimize

½èÖúLinuxÌṩµÄtimeÃüÁ¿ÉÒÔ´óÖÂͳ¼Æ³ö¸Ã³ÌÐòÔÚÔËÐÐʱËùÐèÒªµÄʱ¼ä£º

# time ./optimize
Result is 400002019.000000
real 0m14.942s
user 0m14.940s
sys 0m0.000s

½ÓÏÂȥʹÓÃÓÅ»¯Ñ¡ÏîÀ´¶Ô´úÂë½øÐÐÓÅ»¯´¦Àí£º

# gcc -Wall -O optimize.c -o optimize

ÔÚͬÑùµÄÌõ¼þÏÂÔٴβâÊÔÒ»ÏÂÔËÐÐʱ¼ä£º

# time ./optimize
Result is 400002019.000000
real 0m3.256s
user 0m3.240s
sys 0m0.000s

¶Ô±ÈÁ½´ÎÖ´ÐеÄÊä³ö½á¹û²»ÄÑ¿´³ö£¬³ÌÐòµÄÐÔÄܵÄÈ·µÃµ½Á˺ܴó·ù¶ÈµÄ¸ÄÉÆ£¬ÓÉÔ­À´µÄ14ÃëËõ¶Ìµ½ÁË3Ãë¡£Õâ¸öÀý×ÓÊÇרÃÅÕë¶ÔGCCµÄÓÅ»¯¹¦ÄܶøÉè¼ÆµÄ£¬Òò´ËÓÅ»¯Ç°ºó³ÌÐòµÄÖ´ÐÐËٶȷ¢ÉúÁ˺ܴóµÄ¸Ä±ä¡£¾¡¹ÜGCCµÄ´úÂëÓÅ»¯¹¦Äܷdz£Ç¿´ó£¬µ«×÷ΪһÃûÓÅÐãµÄLinux³ÌÐòÔ±£¬Ê×ÏÈ»¹ÊÇÒªÁ¦ÇóÄܹ»ÊÖ¹¤±àд³ö¸ßÖÊÁ¿µÄ´úÂë¡£Èç¹û±àдµÄ´úÂë¼ò¶Ì£¬²¢ÇÒÂß¼­ÐÔÇ¿£¬±àÒëÆ÷¾Í²»»á×ö¸ü¶àµÄ¹¤×÷£¬ÉõÖÁ¸ù±¾Óò»×ÅÓÅ»¯¡£

ÓÅ»¯ËäÈ»Äܹ»¸ø³ÌÐò´øÀ´¸üºÃµÄÖ´ÐÐÐÔÄÜ£¬µ«ÔÚÈçÏÂһЩ³¡ºÏÖÐÓ¦¸Ã±ÜÃâÓÅ»¯´úÂ룺

¡ô ³ÌÐò¿ª·¢µÄʱºò ÓÅ»¯µÈ¼¶Ô½¸ß£¬ÏûºÄÔÚ±àÒëÉϵÄʱ¼ä¾ÍÔ½³¤£¬Òò´ËÔÚ¿ª·¢µÄʱºò×îºÃ²»ÒªÊ¹ÓÃÓÅ»¯Ñ¡ÏֻÓе½Èí¼þ·¢Ðлò¿ª·¢½áÊøµÄʱºò£¬²Å¿¼ÂǶÔ×îÖÕÉú³ÉµÄ´úÂë½øÐÐÓÅ»¯¡£

¡ô ×ÊÔ´ÊÜÏÞµÄʱºò һЩÓÅ»¯Ñ¡Ïî»áÔö¼Ó¿ÉÖ´ÐдúÂëµÄÌå»ý£¬Èç¹û³ÌÐòÔÚÔËÐÐʱÄܹ»ÉêÇëµ½µÄÄÚ´æ×ÊÔ´·Ç³£½ôÕÅ£¨ÈçһЩʵʱǶÈëʽÉ豸£©£¬ÄǾͲ»Òª¶Ô´úÂë½øÐÐÓÅ»¯£¬ÒòΪÓÉÕâ´øÀ´µÄ¸ºÃæÓ°Ïì¿ÉÄÜ»á²úÉú·Ç³£ÑÏÖصĺó¹û¡£

¡ô ¸ú×Ùµ÷ÊÔµÄʱºò ÔÚ¶Ô´úÂë½øÐÐÓÅ»¯µÄʱºò£¬Ä³Ð©´úÂë¿ÉÄܻᱻɾ³ý»ò¸Äд£¬»òÕßΪÁËÈ¡µÃ¸ü¼ÑµÄÐÔÄܶø½øÐÐÖØ×飬´Ó¶øʹ¸ú×ٺ͵÷ÊÔ±äµÃÒì³£À§ÄÑ¡£

µ÷ÊÔ

Ò»¸ö¹¦ÄÜÇ¿´óµÄµ÷ÊÔÆ÷²»½öΪ³ÌÐòÔ±ÌṩÁ˸ú×Ù³ÌÐòÖ´ÐеÄÊֶΣ¬¶øÇÒ»¹¿ÉÒÔ°ïÖú³ÌÐòÔ±ÕÒµ½½â¾öÎÊÌâµÄ·½·¨¡£¶ÔÓÚLinux³ÌÐòÔ±À´½²£¬GDB£¨GNU Debugger£©Í¨¹ýÓëGCCµÄÅäºÏʹÓã¬Îª»ùÓÚLinuxµÄÈí¼þ¿ª·¢ÌṩÁËÒ»¸öÍêÉƵĵ÷ÊÔ»·¾³¡£

ĬÈÏÇé¿öÏ£¬GCCÔÚ±àÒëʱ²»»á½«µ÷ÊÔ·ûºÅ²åÈëµ½Éú³ÉµÄ¶þ½øÖÆ´úÂëÖУ¬ÒòΪÕâÑù»áÔö¼Ó¿ÉÖ´ÐÐÎļþµÄ´óС¡£Èç¹ûÐèÒªÔÚ±àÒëʱÉú³Éµ÷ÊÔ·ûºÅÐÅÏ¢£¬¿ÉÒÔʹÓÃGCC µÄ-g»òÕß-ggdbÑ¡Ïî¡£GCCÔÚ²úÉúµ÷ÊÔ·ûºÅʱ£¬Í¬Ñù²ÉÓÃÁË·Ö¼¶µÄ˼·£¬¿ª·¢ÈËÔ±¿ÉÒÔͨ¹ýÔÚ-gÑ¡Ïîºó¸½¼ÓÊý×Ö1¡¢2»ò3À´Ö¸¶¨ÔÚ´úÂëÖмÓÈëµ÷ÊÔÐÅÏ¢µÄ¶àÉÙ¡£Ä¬Èϵļ¶±ðÊÇ2£¨-g2£©£¬´Ëʱ²úÉúµÄµ÷ÊÔÐÅÏ¢°üÀ¨À©Õ¹µÄ·ûºÅ±í¡¢Ðкš¢¾Ö²¿»òÍⲿ±äÁ¿ÐÅÏ¢¡£¼¶±ð3£¨-g3£©°üº¬¼¶±ð2ÖеÄËùÓе÷ÊÔÐÅÏ¢£¬ÒÔ¼°Ô´´úÂëÖж¨ÒåµÄºê¡£¼¶±ð1£¨-g1£©²»°üº¬¾Ö²¿±äÁ¿ºÍÓëÐкÅÓйصĵ÷ÊÔÐÅÏ¢£¬Òò´ËÖ»Äܹ»ÓÃÓÚ»ØËݸú×ٺͶÑջת´¢Ö®Ó᣻ØËݸú×ÙÖ¸µÄÊǼàÊÓ³ÌÐòÔÚÔËÐйý³ÌÖеĺ¯Êýµ÷ÓÃÀúÊ·£¬¶Ñջת´¢ÔòÊÇÒ»ÖÖÒÔԭʼµÄÊ®Áù½øÖƸñʽ±£´æ³ÌÐòÖ´Ðл·¾³µÄ·½·¨£¬Á½Õ߶¼ÊǾ­³£Óõ½µÄµ÷ÊÔÊֶΡ£

GCC²úÉúµÄµ÷ÊÔ·ûºÅ¾ßÓÐÆÕ±éµÄÊÊÓ¦ÐÔ£¬¿ÉÒÔ±»Ðí¶àµ÷ÊÔÆ÷¼ÓÒÔÀûÓ㬵«Èç¹ûʹÓõÄÊÇGDB£¬ÄÇô»¹¿ÉÒÔͨ¹ý-ggdbÑ¡ÏîÔÚÉú³ÉµÄ¶þ½øÖÆ´úÂëÖаüº¬GDBרÓõĵ÷ÊÔÐÅÏ¢¡£ÕâÖÖ×ö·¨µÄÓŵãÊÇ¿ÉÒÔ·½±ãGDBµÄµ÷ÊÔ¹¤×÷£¬µ«È±µãÊÇ¿ÉÄܵ¼ÖÂÆäËüµ÷ÊÔÆ÷£¨ÈçDBX£©ÎÞ·¨½øÐÐÕý³£µÄµ÷ÊÔ¡£Ñ¡Ïî-ggdbÄܹ»½ÓÊܵĵ÷ÊÔ¼¶±ðºÍ-gÊÇÍêÈ«Ò»ÑùµÄ£¬ËüÃǶÔÊä³öµÄµ÷ÊÔ·ûºÅÓÐ×ÅÏàͬµÄÓ°Ïì¡£

ÐèҪעÒâµÄÊÇ£¬Ê¹ÓÃÈκÎÒ»¸öµ÷ÊÔÑ¡Ï»áʹ×îÖÕÉú³ÉµÄ¶þ½øÖÆÎļþµÄ´óС¼±¾çÔö¼Ó£¬Í¬Ê±Ôö¼Ó³ÌÐòÔÚÖ´ÐÐʱµÄ¿ªÏú£¬Òò´Ëµ÷ÊÔÑ¡Ïîͨ³£½öÔÚÈí¼þµÄ¿ª·¢ºÍµ÷ÊԽ׶ÎʹÓᣵ÷ÊÔÑ¡Ïî¶ÔÉú³É´úÂë´óСµÄÓ°Ïì´ÓÏÂÃæµÄ¶Ô±È¹ý³ÌÖпÉÒÔ¿´³öÀ´£º

# 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 (¼ÓÈëµ÷ÊÔÑ¡Ïî)

ËäÈ»µ÷ÊÔÑ¡Ïî»áÔö¼ÓÎļþµÄ´óС£¬µ«ÊÂʵÉÏLinuxÖеÄÐí¶àÈí¼þÔÚ²âÊÔ°æ±¾ÉõÖÁ×îÖÕ·¢Ðа汾ÖÐÈÔȻʹÓÃÁ˵÷ÊÔÑ¡ÏîÀ´½øÐбàÒ룬ÕâÑù×öµÄÄ¿µÄÊǹÄÀøÓû§ÔÚ·¢ÏÖÎÊÌâʱ×Ô¼º¶¯ÊÖ½â¾ö£¬ÊÇLinuxµÄÒ»¸öÏÔÖøÌØÉ«¡£

ÏÂÃ滹ÊÇͨ¹ýÒ»¸ö¾ßÌåµÄʵÀý˵Ã÷ÈçºÎÀûÓõ÷ÊÔ·ûºÅÀ´·ÖÎö´íÎó£¬ËùÓóÌÐò¼ûÇåµ¥4Ëùʾ¡£

Çåµ¥4£ºcrash.c

#include
int main(void)
{
int input =0;
printf("Input an integer:");
scanf("%d", input);
printf("The integer you input is %d\\n", input);
return 0;
}

±àÒë²¢ÔËÐÐÉÏÊö´úÂ룬»á²úÉúÒ»¸öÑÏÖصĶδíÎó£¨Segmentation fault£©ÈçÏ£º

# gcc -g crash.c -o crash
# ./crash
Input an integer:10
Segmentation fault

ΪÁ˸ü¿ìËٵط¢ÏÖ´íÎóËùÔÚ£¬¿ÉÒÔʹÓÃGDB½øÐиú×Ùµ÷ÊÔ£¬·½·¨ÈçÏ£º

# gdb crash
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
¡­¡­
(gdb)

µ±GDBÌáʾ·û³öÏÖµÄʱºò£¬±íÃ÷GDBÒѾ­×öºÃ×¼±¸½øÐе÷ÊÔÁË£¬ÏÖÔÚ¿ÉÒÔͨ¹ýrunÃüÁîÈóÌÐò¿ªÊ¼ÔÚGDBµÄ¼à¿ØÏÂÔËÐУº

(gdb) run
Starting program: /home/xiaowp/thesis/gcc/code/crash
Input an integer:10

Program received signal SIGSEGV, Segmentation fault.
0x4008576b in _IO_vfscanf_internal () from /lib/libc.so.6

×Ðϸ·ÖÎöÒ»ÏÂGDB¸ø³öµÄÊä³ö½á¹û²»ÄÑ¿´³ö£¬³ÌÐòÊÇÓÉÓڶδíÎó¶øµ¼ÖÂÒì³£ÖÐÖ¹µÄ£¬ËµÃ÷ÄÚ´æ²Ù×÷³öÁËÎÊÌ⣬¾ßÌå·¢ÉúÎÊÌâµÄµØ·½ÊÇÔÚµ÷ÓÃ_IO_vfscanf_internal ( )µÄʱºò¡£ÎªÁ˵õ½¸ü¼ÓÓмÛÖµµÄÐÅÏ¢£¬¿ÉÒÔʹÓÃGDBÌṩµÄ»ØËݸú×ÙÃüÁîbacktrace£¬Ö´Ðнá¹ûÈçÏ£º

(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ÖеĵÚ11ÐÐÁË¡£ÏÖÔÚ×Ðϸ¼ì²éһϣº

(gdb) frame 3
#3 0x08048393 in main () at crash.c:11
11 scanf("%d", input);

ʹÓÃGDBÌṩµÄframeÃüÁî¿ÉÒÔ¶¨Î»µ½·¢Éú´íÎóµÄ´úÂë¶Î£¬¸ÃÃüÁîºóÃæ¸ú×ŵÄÊýÖµ¿ÉÒÔÔÚbacktraceÃüÁîÊä³ö½á¹ûÖеÄÐÐÊ×ÕÒµ½¡£ÏÖÔÚÒѾ­·¢ÏÖ´íÎóËùÔÚÁË£¬Ó¦¸Ã½«

scanf("%d", input);
¸ÄΪ
scanf("%d", &input);

Íê³Éºó¾Í¿ÉÒÔÍ˳öGDBÁË£¬ÃüÁîÈçÏ£º

(gdb) quit

GDBµÄ¹¦ÄÜÔ¶Ô¶²»Ö¹Èç´Ë£¬Ëü»¹¿ÉÒÔµ¥²½¸ú×Ù³ÌÐò¡¢¼ì²éÄÚ´æ±äÁ¿ºÍÉèÖöϵãµÈ¡£

µ÷ÊÔʱ¿ÉÄÜ»áÐèÒªÓõ½±àÒëÆ÷²úÉúµÄÖмä½á¹û£¬Õâʱ¿ÉÒÔʹÓÃ-save-tempsÑ¡ÏÈÃGCC½«Ô¤´¦Àí´úÂë¡¢»ã±à´úÂëºÍÄ¿±ê´úÂ붼×÷ΪÎļþ±£´æÆðÀ´¡£Èç¹ûÏë¼ì²éÉú³ÉµÄ´úÂëÊÇ·ñÄܹ»Í¨¹ýÊÖ¹¤µ÷ÕûµÄ°ì·¨À´Ìá¸ßÖ´ÐÐÐÔÄÜ£¬ÔÚ±àÒë¹ý³ÌÖÐÉú³ÉµÄÖмäÎļþ½«»áºÜÓаïÖú£¬¾ßÌåÇé¿öÈçÏ£º

# gcc -save-temps foo.c -o foo
# ls foo*
foo foo.c foo.i foo.s

GCC Ö§³ÖµÄÆäËüµ÷ÊÔÑ¡Ï°üÀ¨-pºÍ-pg£¬ËüÃǻὫÆÊÎö£¨Profiling£©ÐÅÏ¢¼ÓÈëµ½×îÖÕÉú³ÉµÄ¶þ½øÖÆ´úÂëÖС£ÆÊÎöÐÅÏ¢¶ÔÓÚÕÒ³ö³ÌÐòµÄÐÔÄÜÆ¿¾±ºÜÓаïÖú£¬ÊÇЭÖúLinux³ÌÐòÔ±¿ª·¢³ö¸ßÐÔÄܳÌÐòµÄÓÐÁ¦¹¤¾ß¡£ÔÚ±àÒëʱ¼ÓÈë-pÑ¡Ïî»áÔÚÉú³ÉµÄ´úÂëÖмÓÈëͨÓÃÆÊÎö¹¤¾ß£¨Prof£©Äܹ»Ê¶±ðµÄͳ¼ÆÐÅÏ¢£¬¶ø- pgÑ¡ÏîÔòÉú³ÉÖ»ÓÐGNUÆÊÎö¹¤¾ß£¨Gprof£©²ÅÄÜʶ±ðµÄͳ¼ÆÐÅÏ¢¡£

×îºóÌáÐÑÒ»µã£¬ËäÈ»GCCÔÊÐíÔÚÓÅ»¯µÄͬʱ¼ÓÈëµ÷ÊÔ·ûºÅÐÅÏ¢£¬µ«ÓÅ»¯ºóµÄ´úÂë¶ÔÓÚµ÷ÊÔ±¾Éí¶øÑÔ½«ÊÇÒ»¸öºÜ´óµÄÌôÕ½¡£´úÂëÔÚ¾­¹ýÓÅ»¯Ö®ºó£¬ÔÚÔ´³ÌÐòÖÐÉùÃ÷ºÍʹÓõıäÁ¿ºÜ¿ÉÄܲ»ÔÙʹÓ㬿ØÖÆÁ÷Ò²¿ÉÄÜ»áͻȻÌøתµ½ÒâÍâµÄµØ·½£¬Ñ­»·Óï¾äÓпÉÄÜÒòΪѭ»·Õ¹¿ª¶ø±äµÃµ½´¦¶¼ÓУ¬ËùÓÐÕâЩ¶Ôµ÷ÊÔÀ´½²¶¼½«ÊÇÒ»³¡Ø¬ÃΡ£½¨ÒéÔÚµ÷ÊÔµÄʱºò×îºÃ²»Ê¹ÓÃÈκÎÓÅ»¯Ñ¡ÏֻÓе±³ÌÐòÔÚ×îÖÕ·¢ÐеÄʱºò²Å¿¼ÂǶÔÆä½øÐÐÓÅ»¯¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 4 ÌõÆÀÂÛ

  1. I_Empery ÓÚ 2007-03-05 20:53:58·¢±í:

    :ha3nd :0D1 :0(1 :0)1

  2. honckly ÓÚ 2007-02-04 13:18:43·¢±í:

    ²»´í£¡£¡

  3. xplore0317 ÓÚ 2007-02-02 21:36:58·¢±í:

    :ha3nd :ha3nd :ha3nd

  4. xplore0317 ÓÚ 2007-02-02 21:36:07·¢±í:

    :0L :0L :0L :0L :0L :0L :0L :0L