ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久热99视频在线观看,香蕉97视频观看在线观看,亚洲欧美一区二区三区国产精品 http://www.aygfsteel.com/ivanwan/category/2558.html自由的力量,自由的生‹z…R€?/description>zh-cnWed, 28 Feb 2007 03:40:18 GMTWed, 28 Feb 2007 03:40:18 GMT60如何在cygwin用gcc¾~–译http://www.aygfsteel.com/ivanwan/archive/2006/02/17/31302.htmlivaneeoivaneeoFri, 17 Feb 2006 14:00:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2006/02/17/31302.htmlhttp://www.aygfsteel.com/ivanwan/comments/31302.htmlhttp://www.aygfsteel.com/ivanwan/archive/2006/02/17/31302.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/31302.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/31302.html加入˜q™ä¸ªé€‰é¡¹å…¶å®žgcc¾~–译器就会自动的选择在安装cygwin/gcc时安上的mingw,˜q™ä¸ªmingwž®±æ˜¯gcc的一个交叉编译ã€?br>
如果要程序没有控制台的话,只加上参æ•?mwindowsž®±å¯ä»¥äº†.


]]>
gcc警告和出错消选项http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9338.htmlivaneeoivaneeoThu, 04 Aug 2005 14:03:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9338.htmlhttp://www.aygfsteel.com/ivanwan/comments/9338.htmlhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9338.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/9338.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/9338.html /*
*  pedant.c - use -ansi, -pedantic or -pedantic-errors
*/
#include <stdio.h>
void main(void)
{
  long long int i = 0l;
  printf("This is a non-conforming c program\n");
}
使用gcc pedant.c -o pedant˜q™ä¸ªå‘½ä×oæ—?¾~–译器会警告main函数的返回类型无æ•?
$gcc pedant.c -o pedant
pedant.c:In function 'main':
pedant.c:7 warning:return type of 'main' is not 'int'
现在¾l™gcc加上-ansi选项:
$gcc -ansi pedant.c -o pedant
$gcc pedant.c -o pedant
pedant.c: In function 'main'
pedant.c:7 warning: return type of 'main' is not 'int'
gcc再次¾l™å‡ºäº†åŒæ ïLš„警告信息,òq¶å¿½ç•¥äº†æ— æ•ˆçš„æ•°æ®ç±»åž?

-ansi,-pedantic以及-pedantic-errors¾~–译选项òq¶ä¸èƒ½ä¿è¯è¢«¾~–译的程序的ANSI/ISO兼容æ€?它们仅被用来帮助½E‹åºå‘˜ç¦»˜q™ä¸ªç›®æ ‡æ›´è¿‘.

$gcc -Wall pedant.c -o pedant
pedant.c:7: warning: return type of 'main' is not 'int'
pedant.c: In function 'main':
pedant.c:8 warning: unused variable 'i'
-Wall¾pÕdˆ—选项的另一个极端是-w选项åQŒå®ƒèƒ½å…³é—­æ‰€æœ‰çš„警告信息ã€?W{warning}选项的作用是打开warning所指出的用æˆäh„Ÿå…´è¶£çš„特ŒDŠè­¦ 告信æ?比如隐èín函数说明(-Wimplicit-function-declaration)或者隐íw«å£°æ˜Žè¿”回类型的函数(-Wreturn- type).前者的作用在于它提½Cºå‡ºå®šä¹‰äº†ä¸€ä¸ªå‡½æ•°å´æ²¡æœ‰äº‹å…ˆå£°æ˜Žæˆ–者忘è®îCº†åŒ…含适当的头文äšg.后者的作用在于指出声明的函数可能没有指定它的返回类åž? æ­¤æ—¶é»˜è®¤çš„è¿”å›žç±»åž‹äØ“int.

提示:如果只想‹‚€æŸ¥è¯­æ³•而实际上不做如何¾~–译工作,那么可以调用带有-fsyntax-only参数的GCC.

选项                          说明
-Wcomment                   如果出现了注解嵌å¥?在第一ä¸?*之后又出çŽîCº†½W¬äºŒä¸?*)åˆ™å‘å‡ø™­¦å‘?br> -Wformat                     å¦‚果传递给printf及及其相兛_‡½æ•? 的参数和对应的格式字½W¦ä¸²ä¸­æŒ‡å®šçš„¾cÕdž‹ä¸åã^配则发出警告
-Wmain                       å¦‚æžœmain的返回类型不 是int或者调用mainæ—¶ä‹É用的参数数目不正¼‹®åˆ™ä¸å‡ºè­¦å‘Š
-Wparentheses               如果在出çŽîCº†èµ‹å€?例如,(n=10))的地方ä‹É用了括号,而那里根据前后关¾pÀLŽ¨æ–­åº”è¯¥æ˜¯æ¯”è¾ƒ(例如,(n==100))而非赋值的时å€?或者如果括可‚ƒ½å¤Ÿè§£å†Œ™¿½Ž—优先çñ”问题的时å€?发出警告
-Wswitch                     å¦‚æžœswtich语句ž®‘了它的一个或å¤? 个枚丑ր¼çš„case分支(只有索引值是enum¾cÕdž‹æ—¶æ‰é€‚用)åˆ™å‘å‡ø™­¦å‘?br> -Wunused                     å¦‚果声明的变量没有ä‹Éç”?或者函数声æ˜? 为static¾cÕdž‹ä½†å´ä»Žæœªä½¿ç”¨,åˆ™å‘å‡ø™­¦å‘?br> -Wuninitialized             å¦‚æžœä½¿ç”¨çš„è‡ªåŠ¨å˜é‡æ²¡æœ‰åˆå§‹åŒ–åˆ™å‘å‡ø™­¦å‘?br> -Wundef                     如果åœ?ifå®ä¸­ä½¿ç”¨äº†æœªå®šä¹‰çš„å˜é‡ä½œåˆ¤æ–­åˆ™å‘å‡ø™­¦å‘?br> -Winline                     å¦‚果函数不能被内联则发出警告
-Wmissing-declarations      å¦‚果定义了全局函数但却没有在ä“Q何头文äšg中声明它,åˆ™å‘å‡ø™­¦å‘?br> -Wlong-long                 如果使用了long long¾cÕdž‹åˆ™å‘凸™­¦å‘?br> -Werror                     ž®†æ‰€æœ‰çš„警告转变为错è¯?br>

常见的编½E‹é”™è¯?
/*
*  blunder.c - Mistakes caught by -W(warning)
*/
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i, j;
  printf("%c\n", "not a character");  /* -Wformat */
  if(i = 10)                          /* -Wparenthesses */
    printf("oops\n");
  if(j != 10)                         /* -Wuninitialized */
    printf("another oops\n");
  /* /* */                            /* -Wcomment */
  no_decl();                          /* -Wmissing-declaration */
  return (EXIT_SUCCESS);
}

void no_decl(void)
{
  printf("no_decl\n");
}
$gcc blunder.c -o blunder
blunder.c:27: warning: type mismatch with previous implicit declaration
blunder.c:21: warning: previous implicit declaration of 'no_decl'
blunder.c:27: warning: 'no_decl' was previously implicitly declared to return 'int'
gcc只发å‡ÞZº†å’Œéšå¼å£°æ˜Žno_decl函数有关的警å‘?它忽略了其他潜在的错è¯?˜q™äº›é”™è¯¯åŒ…括:
.传递给printf的参数类åž?一个字½W¦ä¸²)和格式化字符串定义的¾cÕdž‹(一个字½W?不匹é…?˜q™ä¼šäº§ç”Ÿä¸€ä¸?Wformat警告.
.变量iå’Œj使用前都没有初始åŒ?它们中的ä»ÖM½•一个都产生-Wuninitialized警告.
.在根据前后关¾pÀLŽ¨æ–­åº”è¯¥å¯¹å˜é‡i的值做比较的地æ–?却对变量i˜q›è¡Œèµ‹å€?˜q™åº”该会产生一ä¸?Wparentheses警告.
.在注释嵌套开始的地方应该会äñ”生一ä¸?Wcomment警告.

]]>
gcc函数库和包含文äšghttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9337.htmlivaneeoivaneeoThu, 04 Aug 2005 14:02:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9337.htmlhttp://www.aygfsteel.com/ivanwan/comments/9337.htmlhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9337.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/9337.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/9337.html $gcc myapp.c -I /home/fred/include -o myapp
-L选项对库文äšgèµïLš„作用å’?I选项告诉gcc把DIRNAMEæ·ÕdŠ åˆ°åº“æ–‡äšg搜烦路径é‡?要保证DIRNAME比标准位¾|®å…ˆè¢«æœç´?
  å‡è®¾è¯»è€…需要测试一个新的编½E‹åº“libnew.so,当前它保存在/home/fred/libä¸?.so是共享库文äšg的标准扩展名).ä¸ÞZº†é“¾æŽ¥åº“æ–‡ä»?gcc命ä×o行应与下面类ä¼?
$gcc myapp.c -L/home/fred/lib -lnew -o myapp
-L/home/fred/lib¾l“构让gcc先在/home/fred/lib下查扑ֺ“æ–‡äšg,然后再到默认的库文äšg搜烦路径下进行查æ‰?-l选项使得é“? 接程序ä‹É用指定的函数库中的目标代ç ?也就是本例中的libnew.so.把函数库命名为lib{名字}是UNIX的约å®?与许多其他编译器一æ ?gcc 也遵循此¾U¦å®š.如果忘了使用-l选项,则与库的链接ž®†å¤±è´?òq¶ä¸”gcc产生错误,说明½E‹åºä¸­å¼•用了未定义的函数å?
默认情况ä¸?gcc使用å…׃ín库进行链æŽ?所以在需要链接静态库时必™åÖM‹Éç”?static选项来保证只使用静态库.
$gcc cursesapp.c -lncurses -static -o cursesapp
在链接静态库æ—?可执行程序的大小比链接共享库要达很多.使用å…׃ín库时,½E‹åºæ‰€ä½¿ç”¨çš„代码是在运行时动态链æŽ?而不是在¾~–译旉™™æ€é“¾æŽ?å› æ­¤,如果所需要的å…׃ín库没有在用户¾pȝ»Ÿä¸­å®‰è£?˜qè¡Œž®×ƒ¼šå¤ÞpÓ|.

]]>
gcc的Hello Worldhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9335.htmlivaneeoivaneeoThu, 04 Aug 2005 14:01:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9335.htmlhttp://www.aygfsteel.com/ivanwan/comments/9335.htmlhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9335.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/9335.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/9335.html /*
*  hello.c - Canonical "Hello, World!" program
*/
#include <stdio.h>
int main(void)
{
  printf("Hello,Linux programming world!\n");
  return 0;
}
在命令行上键入以下命令编译和˜qè¡Œ˜q™æ®µ½E‹åº:
$gcc hello.c -o hello
$./hello
Hello, Linux programming world!
½W¬ä¸€è¡Œå‘½ä»¤å‘Šè¯‰gccå¯ÒŽºä»£ç hello.c˜q›è¡Œ¾~–译和链æŽ?òq¶ä‹Éç”?oå‚æ•°æŒ‡å®šåˆ›å¾åäØ“hello的可见程åº?½W¬äºŒè¡Œå‘½ä»¤æ‰§è¡Œhello˜q™ä¸ª½E‹åº,½W¬ä¸‰è¡Œæ˜¯½E‹åºçš„æ‰§è¡Œç»“æž?

其实,gcc首先˜qè¡Œé¢„处理程序cpp来展开hello.cä¸­çš„å®åÆˆåœ¨å…¶ä¸­æ’å…?includeæ–‡äšg所包含的内å®?然后把预处理后的源代码编译成为目标代ç ?最å?链接½E‹åºld创徏一个名为hello的二˜q›åˆ¶æ–‡äšg.

现在我们来通过手工操作重新创徏˜q™äº›æ­¥éª¤,以逐步执行¾~–译˜q‡ç¨‹.½W¬ä¸€å¸ƒæ˜¯˜qè¡Œé¢„处理器.使用-E选项告诉gcc在预处理后停止编译过½E?
$gcc -E hello.c -o hello.cpp
此时查看hello.cpp会发现stdio.h的内容确实都插到文äšg里去äº?而其他应当被预处理的标记也做了类似处ç?
下一步是ž®†hello.cpp¾~–译为目标代ç ?可ä‹É用gccçš?c选项来完æˆ?
$gcc -x cpp-output -c hello.cpp -o hello.o
-x选项告诉gcc从指定的步骤开始编�在本例中也就是编译器处理后的源代�cpp-output).
gcc是怎么知道如何处理某种ç‰ÒޮоcÕdž‹çš„æ–‡ä»¶å‘¢?它是依靠文äšg的扩展名来决定如何正¼‹®å¤„理该文äšgçš?
—————————————————————————————â€?br> 扩展å?nbsp;                      ¾cÕdž‹
.c                            C语言源代ç ?br> .C,.cc                       C++语言源代ç ?br> .i                            é¢„处理后的C源代ç ?br> .ii                         预处理后的C++源代ç ?br> .S,.s                       汇编语言源代ç ?br> .o                            ¾~–译后的目标代码
.a,.so                       ¾~–译后的库代ç ?br> ——————————————————————————————â€?br> 最å?链接目标文äšg,生成二进制代ç ?
$gcc hello.c -o hello

]]>
gcc的常用命令行选项http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9336.htmlivaneeoivaneeoThu, 04 Aug 2005 14:01:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9336.htmlhttp://www.aygfsteel.com/ivanwan/comments/9336.htmlhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9336.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/9336.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/9336.html -o FILE                æŒ‡å®šè¾“出文äšgå?åœ¨ç¼–è¯‘äØ“ç›®æ ‡ä»£ç æ—?˜q™ä¸€é€‰é¡¹ä¸? 是必™åȝš„.如果FILE没有指定,默认文äšg名时a.out
-c                     只编译不链接
-DFOO=BAR              åœ¨å‘½ä»¤è¡Œå®šä¹‰é¢„处理宏FOO,å…¶å€égØ“BAR
-IDIRNAME              ž®†DIRNAME加入到包含文件的搜烦目录列表ä¸?br> -LDIRNAME              ž®†DIRNAME加入到库文äšg的搜索目录列表中
-static                 é“¾æŽ¥é™æ€åº“,åÏx‰§è¡Œé™æ€é“¾æŽ¥é»˜è®¤æƒ…况下gcc只链接共享库
-IFOO                  é“¾æŽ¥åäØ“libFOO的函数库
-g                     在可执行½E‹åºä¸­åŒ…含标准调试信æ?br> -ggdb                  åœ¨å¯æ‰§è¡Œ½E‹åºä¸­åŒ…含只有GNU debugger(gdb)才能识别大量调试信息
-O                     优化¾~–译˜q‡çš„代码
-ON                     æŒ‡å®šä»£ç ä¼˜åŒ–çš„çñ”åˆ«äØ“N,0<=N<= 3,如果未指定N,则默认çñ”åˆ«äØ“1
-ansi                  æ”¯æŒANSI/ISO C的标准语æ³?取消GNU的语法扩展中与该标准有冲½Héƒ¨åˆ?但这一选项òq¶ä¸èƒ½ä¿è¯ç”ŸæˆANSI兼容的代ç ?
-pedantic              å…è®¸å‘出ANSI/ISO C标准所列出的所有警å‘?br> -pedantic-errors       允许发出ANSI/ISO C标准所列出的所有错è¯?br> -traditional           支持Kernighan & Ritchie C 语法 (如用旧式语法定义函数).
-w                     关闭所有警å‘?廸™®®ä¸è¦ä½¿ç”¨æ­¤é¡¹
-Wall                   å…è®¸å‘出gcc能提供的所有有用的警告.也可以用-W{warning}来标 记指定的警告
-werror                æŠŠæ‰€æœ‰è­¦å‘Šè{æ¢äØ“é”™è¯¯,以在警告发生时中止编译过½E?br> -MM                     è¾“出一个make兼容的相兛_ˆ—è¡?br> -v                     昄¡¤ºåœ¨ç¼–译过½E‹çš„æ¯ä¸€æ­¥ä¸­ç”¨åˆ°çš„命ä»?img src ="http://www.aygfsteel.com/ivanwan/aggbug/9336.html" width = "1" height = "1" />

]]>
gcc¾~–译˜q‡ç¨‹http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9334.htmlivaneeoivaneeoThu, 04 Aug 2005 14:00:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9334.htmlhttp://www.aygfsteel.com/ivanwan/comments/9334.htmlhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9334.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/9334.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/9334.html .预处ç?和头文äšg*.h)
.适当¾~–译(生成目标代理*.o)
.汇编
.链接(和引å¯ég»£ç ?库代ç ?

]]>
gcc的其他调试技å·?/title><link>http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9333.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9333.html</guid><wfw:comment>http://www.aygfsteel.com/ivanwan/comments/9333.html</wfw:comment><comments>http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ivanwan/comments/commentRss/9333.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ivanwan/services/trackbacks/9333.html</trackback:ping><description><![CDATA[其他的调试选项包括-på’?pg,它们ž®†å‰–æž?profiling)信息加入二进制文件中.˜q™äº›ä¿¡æ¯å¯¹äºŽæ‰‘Ö‡ºä»£ç ä¸­çš„æ€§èƒ½ç“‰™¢ˆä»¥åŠå¼€å‘高性能的程序非常有 帮助.-p选项在代码中加入prof½E‹åºèƒ½å¤Ÿè¯Õd–的剖析符合信æ?è€?pg选项加入了GNU™å¹ç›®ä¸­prof的化íw«gprof能够解释的符合信æ?-a选项 在代码中加入代码å?比如函数)累计使用的次æ•?<br> <br> -save-temps选项可以保存在编译过½E‹ä¸­ç”Ÿæˆçš„中间文ä»?其中包括目标文äšg和汇¾~–代码文ä»?<br> <br> 如果你对¾~–译器到底花费了多少旉™—´æ¥å®Œæˆå®ƒçš„工作感兴趣,可以考虑使用-Q选项,˜q™ä¸ªé€‰é¡¹è®©gcc昄¡¤º¾~–译˜q‡ç¨‹ä¸­ç¢°åˆ°çš„æ¯ä¸ªå‡½æ•°,òq¶æä¾›ç¼–译器¾~–译每个函数所花时间的剖析信息.<img src ="http://www.aygfsteel.com/ivanwan/aggbug/9333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:59 <a href="http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc调试选项的实ä¾?/title><link>http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9332.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9332.html</guid><wfw:comment>http://www.aygfsteel.com/ivanwan/comments/9332.html</wfw:comment><comments>http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ivanwan/comments/commentRss/9332.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ivanwan/services/trackbacks/9332.html</trackback:ping><description><![CDATA[$gcc -g hello.c -o hello<br> $ls -l hello<br> -rwxr-xr-x 1 kwall users 10275 May 21 23:27 hello<br> <br> $gcc -ggdb hello.c -o hello<br> $ls -l hello<br> -rwxr-xr-x 1 kwall users 8135 May 21 23:28 hello<br> <br> -g选项让二˜q›åˆ¶æ–‡äšg大小增长到将˜q‘三å€?è€?ggdb选项也让其大ž®å¢žåŠ äº†ä¸€å€?ž®½ç®¡ä¼šä‹Éæ–‡äšg大小增长,ä»ç„¶å»ø™®®åœ¨æ‰§è¡Œæ–‡ä»¶ä¸­åŒ…含标准的调试符å?使用-g选项创徏),以便某些用户在遇到问题时可以调试你的代码.<img src ="http://www.aygfsteel.com/ivanwan/aggbug/9332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:58 <a href="http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc调试选项http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9330.htmlivaneeoivaneeoThu, 04 Aug 2005 13:57:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9330.htmlhttp://www.aygfsteel.com/ivanwan/comments/9330.htmlhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9330.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/9330.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/9330.html
回溯是指一个程序调用函数的历史.堆栈转储是一个通常以原始的十六机制格式保存½E‹åºæ‰§è¡ŒçŽ¯å¢ƒå†…å®¹çš„åˆ—è¡?列表内容主要是CPU寄存器和分配¾l™ç¨‹åºçš„内存.注意,1¾U§è°ƒè¯•不产生局部变量和行号的调试信æ?

]]>
gcc的优化选项http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9331.htmlivaneeoivaneeoThu, 04 Aug 2005 13:57:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9331.htmlhttp://www.aygfsteel.com/ivanwan/comments/9331.htmlhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9331.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/9331.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/9331.html 选项                  ä½œç”¨
-ffloat-store         ¼›æ­¢åœ¨CPU的寄存器中保存æÕQ点变量的å€?˜q™èƒ½æŠŠCPU寄存器节省下来留作它ç”?而且可以防止产生˜q‡åˆ†¾_„¡¡®ä½†ä¸å¿…要的æÕQç‚ÒŽ•°.
-ffast-math           产生‹¹®ç‚¹æ•°å­¦ä¼˜åŒ–,˜q™èƒ½æé«˜é€Ÿåº¦ä½†è¿åäº†IEEE或ANSI/ISO标准.如果½E‹åºä¸éœ€è¦ä¸¥æ ¼éµå®ˆIEEE规范,可在¾~–译‹¹®ç‚¹å¯†é›†åž‹çš„½E‹åºæ—¶è€ƒè™‘采用˜q™ä¸€æ ‡å¿—
-finline-functions    æŠŠæ‰€æœ‰çš„"½Ž€å?函数在调用它们的函数中就地展开.¾~–译器决定了什么是"½Ž€å?函数.减少处理器与函数相关的开销是一¿UåŸºæœ¬çš„优化技æœ?br> -funroll-loops        å±•开所有能在编译时¼‹®å®šé‡å¤‹Æ¡æ•°çš„åó@环体.展开循环体后每步循环都能省出几条CPU指ä×o,˜q™æ ·å¤§å¤§å‡å°‘了执行时é—?br> -fomit-frame-pointer  å¦‚果函数不需要则丢掉指针,该指针保存在CPU的一个寄存器ä¸?因䨓åŽÀLŽ‰äº†è®¾¾|?保存和恢复å“áæŒ‡é’ˆæ‰€å¿…需的指ä»?所以加快了处理速度.
-fschedule-insns      è®°å½•可能暂停的指ä»?å› äØ“å®ƒä»¬æ­£åœ¨½{‰å€™çš„æ•°æ®ä¸åœ¨CPUä¸?br> -fschedule-insns2     执行½W¬äºŒ‹Æ¡æŒ‡ä»¤é‡æŽ’序(¾cÖM¼¼äº?fschedule-insns)
-fmove-all-movables   把所有出现在循环体内部但½E›_®šä¸å˜çš„计½Ž—移出åó@环体.˜q™ä»Žå¾ªçŽ¯ä½“ä¸­åŽ»é™¤äº†ä¸å¿…è¦çš„æ“ä½?加快了åó@环的整体˜qç®—速度.

内联和åó@环展开技术都能够大大提高½E‹åºçš„æ‰§è¡Œé€Ÿåº¦,å› äØ“å®ƒä»¬éƒ½é¿å…äº†å‡½æ•°è°ƒç”¨å’Œå˜é‡æŸ¥æ‰„¡š„开销,但付出的代ä­h往往是大大增加了目标或二˜q›åˆ¶ä»£ç çš„大ž®?

一般而言,Linux½E‹åºå‘˜ä¼¼ä¹Žçˆ±ç”¨ä¼˜åŒ–选项-O2.

]]>
pgcc:奔腾处理器的¾~–译å™?/title><link>http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9328.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Thu, 04 Aug 2005 13:56:00 GMT</pubDate><guid>http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9328.html</guid><wfw:comment>http://www.aygfsteel.com/ivanwan/comments/9328.html</wfw:comment><comments>http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ivanwan/comments/commentRss/9328.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ivanwan/services/trackbacks/9328.html</trackback:ping><description><![CDATA[pgcc的主要好处是它对Pentium处理器的优化较好.<img src ="http://www.aygfsteel.com/ivanwan/aggbug/9328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ivanwan/" target="_blank">ivaneeo</a> 2005-08-04 21:56 <a href="http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc优化实例http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9329.htmlivaneeoivaneeoThu, 04 Aug 2005 13:56:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9329.htmlhttp://www.aygfsteel.com/ivanwan/comments/9329.htmlhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9329.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/9329.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/9329.html /*
*  pisqrt.c - Calculate the square of PI 100,000,000
*/
#include <stdio.h>
#include <math.h>

int main(void)
{
  double pi = M_PI; /* Defined in <math.h> */
  double pisqrt;
  long i;

  for(i = 0; i < 10000000; ++i) {
    pisqrt = sqrt(pi);
  }
  return 0;
}

                             pisqrt的执行时é—?br> 标志/优化                       òq›_‡æ‰§è¡Œæ—‰™—´
<none>                         5.43s
-O1                            2.74s
-O2                            2.83s
-O3                            2.76s
-ffloat-store                  5.41s
-ffast-math                    5.46s
-funroll-loops                 5.44s
-fschedule-insns               5.45s
-fschedule-insns2              5.44s

˜q™ä¸ªä¾‹å­è¯´æ˜Ž,除非对处理器的体¾pȝ»“æž„éžå¸æ€º†è§£æˆ–者知道某¿Uç‰¹ŒDŠçš„优化专门针对你的½E‹åºæœ‰åª„å“?否则ž®±åº”该ä‹É用优化选项-O.

]]>
GNU C扩展http://www.aygfsteel.com/ivanwan/archive/2005/08/04/9327.htmlivaneeoivaneeoThu, 04 Aug 2005 13:55:00 GMThttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9327.htmlhttp://www.aygfsteel.com/ivanwan/comments/9327.htmlhttp://www.aygfsteel.com/ivanwan/archive/2005/08/04/9327.html#Feedback0http://www.aygfsteel.com/ivanwan/comments/commentRss/9327.htmlhttp://www.aygfsteel.com/ivanwan/services/trackbacks/9327.html #ifdef __STRICT_ANSI__
/* use ANSI/ISO C only here */
#else
/* use GNU extensions here */
#endif
如果用户或是ANSI兼容的编译器定义了__STRICT_ANSI__å®?则表明需施加ANSI兼容的环å¢?òq¶ç¼–è¯?ifdef语句块的½W¬ä¸€éƒ¨åˆ†ä»£ç .否则,¾~–译#else后面的代ç ?
2.GNU扩展
  gcc使用long long ¾cÕdž‹æ¥æä¾?4位储存单å…?
  long long long_int_var;
内联函数
  è¦ä‹É用内联函æ•?需在函数的˜q”回¾cÕdž‹å‰é¢æ’入关键字inline,如下面的代码片段所½C?˜q˜è¦åœ¨ç¼–译时使用-O优化选项.
  inline void swap(int *a, int *b)
  {
    int tmp = *a;
    *a = *b;
    *b = tmp;
  }
函数和变量属æ€?br>   å…³é”®å­—attribute通过向gcc指明有关代码的更多信息来帮助代码优化工作˜q›è¡Œå¾—æ›´å¥?例如,标准库函数exitå’? abort都不˜q”回调用它们的函æ•?¾~–译器如果知道它们不˜q”回ž®Þpƒ½ç”Ÿæˆæ•ˆçއ½Eé«˜çš„代ç ?当然用户½E‹åºä¹Ÿèƒ½å®šä¹‰ä¸è¿”回的函数.gccå…è®¸ä¸ø™¿™äº›å‡½æ•°æŒ‡å®? noreturn属æ€?ä½œäØ“¾~–译器在优化该函数时的提½C?
  
例如,假设有个没有˜q”回的函数die_on_error.ä¸ÞZº†ä½¿ç”¨å‡½æ•°å±žæ€?可以在函数声明后面加上__attribute__((attribute_name)).于是函数die_on_error的声明如ä¸?
  void die_on_error(void) __attribute__ ((noreturn));
函数˜q˜å’Œòq›_¸¸ä¸€æ äh¥å®šä¹‰:
  #include <stdlib.h>
  void die_on_error(void)
  {
    /* your code here */
    exit(EXIT_FAILURE);
  }

也可以对变量指定属æ€?例如,aligned属性指½Cºç¼–è¯‘å™¨åœ¨äØ“å˜é‡åˆ†é…å†…å­˜½Iºé—´æ—¶æŒ‰æŒ‡å®šå­—节数对齐边ç•?下列语句:
  int int_var __attribute__ ((aligned 16)) = 0;
使gcc让变量int_var的边界按16字节寚w½.packed属性告诉gcc为变量或¾l“构分配最ž®çš„内存½Iºé—´.

如果惌™¦å…³é—­å¯ÒŽœªç”¨å˜é‡å‘出的所有警å‘?那么可以对变量ä‹É用unused属æ€?它告诉编译器该变量不准备使用.下面的变量声明会消除警告:
  float big_salary __attribute__ ((unused));

使用case区间
case区间是一个非常有用的扩展.其语法如�
  case LOWVAL ... LOWVAL:
注意,在省略号前后必须有空�在switch语句�case区间指定了落在LOWVAL和HIVAL区间内的那些整数�例如:
  switch(int_var) {
  case 0 ... 2:
    /* your code here */
    break;
  case 3 ... 5:
    /* more code here */
    break;
  default:
    /* default code here */
  }

构造函数名¿U?br>   æŠŠå‡½æ•°åç”¨ä½œå­—符串是GNU的扩å±?它能极大地简化调试工ä½?gcc预先定义了变量__FUNCTION__为当前函æ•?控制‹¹ç¨‹å½“前所在的位置)的名å­?ž®±å¥½åƒå®ƒè¢«å†™åœ¨æºä»£ç é‡ŒåŽ»äº†ä¸€æ ?

使用__FUNCTION__变量
/*
*  showit.c - Illustrate using the __FUNCTION__ variable
*/
#include <stdio.h>

void foo(void);

int main(void)
{
  printf("The current function is %s\n", __FUNCTION__);
  foo();
  return 0;
}

void foo(void)
{
  printf("The current function is %s\n", __FUNCTION__);
}

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º Ì©ÖÝÊÐ| Û³ÁêÏØ| èëµéÊÐ| ¸ÊÂåÏØ| ÌÆº£ÏØ| ÒË´ºÊÐ| ÎijÉÏØ| ΢²©| Ï¢·éÏØ| ʯʨÊÐ| ÎÄÉ½ÏØ| ÄÏ¿ªÇø| ºþ±±Ê¡| ¼Ò¾Ó| Ì©À´ÏØ| ½­ÓÀÏØ| ³ç×óÊÐ| ÂåÆÖÏØ| μÄÏÊÐ| ÄþÄÏÏØ| ´Ó»¯ÊÐ| ÑÓ½òÏØ| ¶Ø»¯ÊÐ| Ô£ÃñÏØ| Ïå·ÚÏØ| ÐËÒåÊÐ| ÁÙÏÄÏØ| Áø½­ÏØ| ÏóÉ½ÏØ| ½Ò¶«ÏØ| ÀÉÏªÏØ| °ÍÌÁÏØ| ÐÂÐËÏØ| ¹ã×ÚÏØ| ½­°²ÏØ| ÓñÆÁ| ÕòÆ½ÏØ| ³Î½­ÏØ| ¹¢Âí| ³¤É³ÊÐ| ºþÄÏÊ¡|