GCC编译器选项及优化提示12页word
GCC编译器选项及优化提示
[原创]GCC编译器选项及优化提示很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gc c的绝佳途径;因此献上此帖,以供各位玩家参考,绝对原创噢============================大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在I nte l/AMD平台上默认按照i386处理器来编译。
如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。
一种方法是修改每个源码包中的M akef ile文件,在其中寻找CF LAGS和C XXFLAG S变量(C和C++编译器的编译选项)并修改它的值。
一些源码包比如binuti ls, gcc, glibc等等,在每个子文件夹中都有M ak efile文件,这样修改起来就太累了!另一种简易做法是设置C FL AGS和CX XFLA GS环境变量。
大多数c onf igure脚本会使用这两个环境变量代替M akef ile文件中的值。
但是少数c on figure脚本并不这样做,他们必须需要手动编辑才行。
为了设置C FL AGS和CX XFLA GS环境变量,你可以在bas h中执行如下命令(也可以写进.bas hrc以成为默认值):exportC FLA GS="-O3 -marc h=<c pu类型>" && C XXFLAG S=$CFLAGS这是一个确保能够在几乎所有平台上都能正常工作的最小设置。
"-marc h"选项表示为特定的c pu类型编译二进制代码(不能在更低级别的c pu上运行),I ntel通常是:pentium2, pentium3, pentium3m, pentium4, pentium4m, pentium-m, pres c ot t, noc ona说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的c pu;pres c ot t是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);noc ona则是最新的带有E M T64(64位)的P4(同样可以煎鸡蛋)AMD通常是:k6, k6-2, k6-3, athlon, athlon-tbird, athlon-xp, athlon-mp, opteron, athlon64, athlon-fx用AMD的一般都是DI Ye r,就不必解释了吧。
GCC编译选项参数
GCC编译选项参数1. -o,指定输出文件的名称。
例如,gcc -o output main.c将生成一个名为output的可执行文件。
2.-c,只编译源文件但不链接生成可执行文件。
这个选项可以用于分离编译,将源代码和编译后的目标文件分开存放。
3.-g,生成包含调试信息的可执行文件。
这个选项可用于在程序出错时进行调试。
4. -Wall,显示所有警告信息。
这个选项用于尽可能多地检测潜在的错误。
5. -Werror,将警告视为错误。
这个选项会将所有警告信息转化为编译错误,编译过程中如果遇到任何警告就会停止编译。
6. -std,指定所使用的C或C++的标准版本。
例如,-std=c99指定使用C99标准。
7.-I,指定额外的头文件路径。
可以通过多次使用该选项来指定多个路径。
8.-L,指定额外的库文件路径。
可以通过多次使用该选项来指定多个路径。
9. -l,指定要链接的库文件。
例如,-lmath将链接数学库。
10.-O,指定优化级别。
有多个优化级别可选,从-O0(不进行任何优化)到-O3(进行最高级别的优化)。
11.-D,定义预处理宏。
可以使用-D定义宏并为其指定值。
例如,-DDEBUG定义一个名为DEBUG的宏。
12.-U,取消预定义宏的定义。
可以使用-U取消已定义的宏。
13.-E,只进行预处理,生成预处理后的源代码。
可以通过这个选项将预处理后的代码输出到标准输出或另一个文件中。
14.-S,只进行编译,生成汇编代码。
可以通过这个选项将汇编代码输出到标准输出或另一个文件中。
15. -shared,生成共享库文件。
这个选项可以用于生成可供其他程序调用的动态链接库。
16.-fPIC,生成位置无关的代码。
这个选项可以用于在共享库中使用。
17. -pthread,为多线程程序链接额外的线程库。
18. -march,指定目标处理器的架构。
例如,-march=armv7指定目标处理器是ARMv7架构。
19. -mfpu,指定使用的浮点单元类型。
GCC常用编译命令选项
GCC常⽤编译命令选项假设源程序⽂件名为main.c1. ⽆选项编译链接⽤法: gcc main.c作⽤: main.c预处理、汇编、编译并链接形成可执⾏⽂件。
这⾥未指定输出⽂件,默认输出为a.out。
2. 选项 –o⽤法:gcc main.c -o main.out作⽤:将main.c预处理、汇编、编译并链接形成可执⾏⽂件main.out。
-o选项⽤来指定输出⽂件的⽂件名。
3. 选项 –E⽤法:gcc -E main.c -o main.i作⽤:将 main.c预处理输出 main.i⽂件。
4. 选项 –S⽤法:gcc -S main.i作⽤:将预处理输出⽂件main.i汇编成main.s⽂件。
5. 选项 –c⽤法:gcc -c main.s作⽤:将汇编输出⽂件main.s编译输出main.o⽂件。
6. ⽆选项链接⽤法:gcc main.o -o main.out作⽤:将编译输出⽂件main.o链接成最终可执⾏⽂件main.out。
7. 选项-O⽤法:gcc -O1 main.c -o main.out作⽤:使⽤编译优化级别1编译程序。
级别为1~3,级别越⼤优化效果越好,但编译时间越长。
8.运⾏可执⾏⽂件⽤法:>>./main.out输出结果9.查看动态可执⾏⽂件动态库加载情况⽤法:>>ldd main.exe静态库后缀名⼀般为“.a”动态库后缀名⼀般为“.so”10.反汇编⽤法:objdump -d main.out⼆. 多源⽂件的编译⽅法假设有两个源⽂件为main.c和test.c1、多个⽂件⼀起编译⽤法:gcc main.c test.c -o main.out作⽤:将main.c和test.c分别编译后链接成main.out可执⾏⽂件。
2、分别编译各个源⽂件,之后对编译后输出的⽬标⽂件链接。
⽤法:gcc -c main.c //将main.c编译成main.ogcc -c test.c //将test.c编译成test.ogcc -o main.o test.o -o main//将main.o和test.o链接成main3、如果要编译的⽂件都在同⼀个⽬录下,可以⽤通配符gcc *.c -o 来进⾏编译。
GCC(警告.优化以及调试选项)
GCC(警告.优化以及调试选项)[介绍]gcc and g 分别是gnu的c & c 编译器gcc/g 在执行编译工作的时候,总共需要4步1.预处理,生成.i的文件预处理器cpp2.将预处理后的文件不转换成汇编语言,生成文件.s编译器egcs3.有汇编变为目标代码(机器代码)生成.o的文件汇编器as4.连接目标代码,生成可执行程序连接器ld1.总体选项-E只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.例子用法:gcc -E hello.c > pianoapan.txtgcc -E hello.c | more慢慢看吧,一个hello word 也要与处理成800行的代码-S只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法gcc -S hello.c他将生成.s的汇编代码,你可以用文本编辑器察看-c只激活预处理,编译,和汇编,也就是他只把程序做成obj文件例子用法:gcc -c hello.c他将生成.o的obj文件2.目录选项-Idir在你是用#include'file'的时候,gcc/g 会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找.对于#include,gcc/g 会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找-include file-i相当于“#include”包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include例子用法:gcc hello.c -include /root/pianopan.h-I-就是取消前一个参数的功能,所以一般在-Idir之后使用-idirafter dir在-I的目录里面查找失败,讲到这个目录里面查找.-iprefix prefix-iwithprefix dir一般一起使用,当-I的目录查找失败,会到prefix dir下查找-Ldir制定编译的时候,搜索库的路径。
gcc选项中文版
gcc选项中文版1.用法:gcc [选项] 文件...2.选项:3. -pass-exit-codes 在某一阶段退出时返回最高的错误码4. --help 显示此帮助说明5. --target-help 显示目标机器特定的命令行选项6. --help={common|optimizers|params|target|warnings|[^]{joined|se parate|undocumented}}[,...]7.显示特定类型的命令行选项8. --version 显示编译器版本信息9. -dumpspecs 显示所有内建 spec 字符串10. -dumpversion 显示编译器的版本号11. -dumpmachine 显示编译器的目标处理器12. -print-search-dirs 显示编译器的搜索路径13. -print-libgcc-file-name 显示编译器伴随库的名称14. -print-file-name=<库> 显示 <库> 的完整路径15. -print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径16. -print-multiarch Display the target's normalized GNU triplet, usedas17. a component in the library path18. -print-multi-directory 显示不同版本 libgcc 的根目录19. -print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射20. -print-multi-os-directory 显示操作系统库的相对路径21. -print-sysroot 显示目标库目录22. -print-sysroot-headers-suffix 显示用于寻找头文件的sysroot 后缀23. -Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器24. -Wp,<选项> 将逗号分隔的 <选项> 传递给预处理器25. -Wl,<选项> 将逗号分隔的 <选项> 传递给链接器26. -Xassembler <参数> 将 <参数> 传递给汇编器27. -Xpreprocessor <参数> 将 <参数> 传递给预处理器28. -Xlinker <参数> 将 <参数> 传递给链接器29. -save-temps 不删除中间文件30. -save-temps= 不删除中间文件31. -no-canonical-prefixes 生成其他 gcc 组件的相对路径时不生成规范化的32.前缀33. -pipe 使用管道代替临时文件34. -time 为每个子进程计时35. -specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件36. -std=<标准> 指定输入源文件遵循的标准37. --sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录38. -B <目录> 将 <目录> 添加到编译器的搜索路径中39. -v 显示编译器调用的程序40. -### 与 -v 类似,但选项被引号括住,并且不执行命令41. -E 仅作预处理,不进行编译、汇编和链接42. -S 编译到汇编语言,不进行汇编和链接43. -c 编译、汇编到目标代码,不进行链接44. -o <文件> 输出到 <文件>45. -pie Create a position independent executable46. -shared Create a shared library47. -x <语言> 指定其后输入文件的语言48.允许的语言包括:c c++ assembler none49.‘none’意味着恢复默认行为,即根据文件的扩展名猜测50.源文件的语言51.52.以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的53.不同子进程。
GCC编译优化选项
GCC编译优化选项-march第⼀个重要的选项是-march。
这个选项告诉编译器该为你的处理器(或arch)⽣成何种代码,它告诉编译器只为特定类型的CPU⽣成代码。
不同的CPU具有不同的能⼒,⽀持不同的指令集,以及不同的执⾏代码⽅式。
-march标记指⽰编译器根据你CPU的能⼒、特征、指令集、怪癖等⽣成特定的代码。
即使/etc/make.conf中的CHOST变量指定了所使⽤的通⽤构架,-march还是可以⽤来为特定的处理器优化程序。
x86和x86-64(也包括其他的)的CPU尤其应该利⽤-march标记。
-O接下来是-O变量。
这个选项控制所有的优化等级。
使⽤优化选项会使编译过程耗费更多的时间,并且占⽤更多的内存,尤其是在提⾼优化等级的时候。
-O设置⼀共有五种:-O0、-O1、-O2、-O3和-Os。
你只能在/etc/make.conf⾥⾯设置其中的⼀种。
除了-O0以外,每⼀个-O设置都会多启⽤⼏个选项,请查阅gcc⼿册的章节,以便了解每个-O等级启⽤了哪些选项及它们有何作⽤。
让我们来逐⼀考察各个优化等级:-O0:这个等级(字母“O”后⾯跟个零)关闭所有优化选项,也是CFLAGS或CXXFLAGS中没有设置-O等级时的默认等级。
这样就不会优化代码,这通常不是我们想要的。
-O1:这是最基本的优化等级。
编译器会在不花费太多编译时间的同时试图⽣成更快更⼩的代码。
这些优化是⾮常基础的,但⼀般这些任务肯定能顺利完成。
-O2:-O1的进阶。
这是推荐的优化等级,除⾮你有特殊的需求。
-O2会⽐-O1启⽤多⼀些标记。
设置了-O2后,编译器会试图提⾼代码性能⽽不会增⼤体积和⼤量占⽤的编译时间。
-O3:这是最⾼最危险的优化等级。
⽤这个选项会延长编译代码的时间,并且在使⽤gcc4.x的系统⾥不应全局启⽤。
⾃从3.x版本以来gcc的⾏为已经有了极⼤地改变。
在3.x,-O3⽣成的代码也只是⽐-O2快⼀点点⽽已,⽽gcc4.x中还未必更快。
最新GCC编译器选项及优化提示
G C C编译器选项及优化提示GCC编译器选项及优化提示GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径;因此献上此帖,以供各位玩家参考,绝对原创噢=大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。
如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。
一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。
一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了!另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。
大多数configure 脚本会使用这两个环境变量代替Makefile文件中的值。
但是少数configure脚本并不这样做,他们必须需要手动编辑才行。
为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值):export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS这是一个确保能够在几乎所有平台上都能正常工作的最小设置。
"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行),Intel通常是:pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium-m,prescott,nocona说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu;prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx用AMD的一般都是DIYer,就不必解释了吧。
GCC编译的一些选项
(GCC)GCC编译的一些选项1. -c 编译产生对象文件(*.obj)而不链接成可执行文件,当编译几个独立的模块,而待以后由链接程序把它们链接在一起时,就可以使用这个选项,如:$cc -c hello.c ===> hello.o$cc hello.o2. -o 允许用户指定输出文件名,如$cc hello.c -o hello.oor$cc hello.c -o hello3. -g 指明编译程序在编译的输出中应产生调试信息.这个调试信息使源代码和变量名引用在调试程序中或者当程序异常退出后在分析core文件时可被使用.4. -D 允许从编译程序命令行定义宏符号一共有两种情况:一种是用-DMACRO,相当于在程序中使用#define MACRO,另一种是用-DMACRO=A,相当于程序中的#define MACRO A.如对下面这代码:#ifdefine DEBUGprintf("debug message\n");#endif编译时可加上-DDEBUG参数,执行程序则打印出编译信息5. -I 可指定查找include文件的其他位置.例如,如果有些include文件位于比较特殊的地方,比如/usr/local/include,就可以增加此选项如下:$cc -c -I/usr/local/include -I/opt/include hello.c 此时目录搜索会按给出的次序进行.6. -E 这个选项是相对标准的,它允许修改命令行以使编译程序把预先处理的C文件发到标准输出,而不实际编译代码.在查看C预处理伪指令和C宏时,这是很有用的.可能的编译输出可重新定向到一个文件,然后用编辑程序来分析:$cc -c -E hello.c >cpp.out 此命令使include文件和程序被预先处理并重定向到文件cpp.out.以后可以用编辑程序或者分页命令分析这个文件,并确定最终的C语言代码看起来如何.7. -O 优化选项, 这个选项不是标准的-O和-O1指定1级优化-O2 指定2级优化-O3 指定3级优化-O0指定不优化$cc -c O3 -O0 hello.c 当出现多个优化时,以最后一个为准!!8. -Wall 以最高级别使用GNU编译程序,专门用于显示警告用!!$gcc -Wall hello.c9. -L指定连接库的搜索目录,-l(小写L)指定连接库的名字$gcc main.o -L/usr/lib -lqt -o hello上面的命令把目标文件main.o与库qt相连接,连接时会到/usr/lib查找这个库文件.也就是说-L与-l一般要成对出现.**********************gcc/egcs 的主要选项*********gcc 命令的常用选项选项解释-ansi 只支持ANSI 标准的 C 语法。
简述gcc命令的选项
简述gcc命令的选项gcc命令是一个常用的编译器命令,用于编译和链接C、C++等程序。
它有许多选项可以用来控制编译过程中的行为。
本文将简要介绍gcc 命令的一些常用选项。
1. -c选项:该选项用于编译源文件,生成目标文件,但不进行链接。
例如,gcc -c test.c会将test.c编译为test.o。
2. -o选项:该选项用于指定生成的可执行文件的名称。
例如,gcc -o test test.c会将test.c编译为名为test的可执行文件。
3. -g选项:该选项用于在生成的可执行文件中包含调试信息,以便于调试程序。
例如,gcc -g test.c会生成一个包含调试信息的可执行文件。
4. -Wall选项:该选项用于打开所有警告信息。
例如,gcc -Wall test.c会显示所有的警告信息。
5. -I选项:该选项用于指定头文件的搜索路径。
例如,gcc -I/usr/include test.c会在/usr/include目录中搜索头文件。
6. -L选项:该选项用于指定库文件的搜索路径。
例如,gcc -L/usr/lib test.c会在/usr/lib目录中搜索库文件。
7. -l选项:该选项用于指定需要链接的库文件。
例如,gcc -lmylib test.c会将名为libmylib.so或libmylib.a的库文件链接到可执行文件中。
8. -D选项:该选项用于定义预处理器宏。
例如,gcc -DDEBUG test.c 会定义一个名为DEBUG的宏。
9. -E选项:该选项用于只进行预处理,并将结果输出到标准输出。
例如,gcc -E test.c会将test.c进行预处理,并将结果输出到屏幕上。
10. -S选项:该选项用于只进行编译,并将结果输出为汇编代码。
例如,gcc -S test.c会将test.c编译为test.s。
11. -O选项:该选项用于指定优化级别。
例如,gcc -O2 test.c会进行优化级别为2的优化。
简述gcc命令的选项
简述gcc命令的选项GCC是GNU Compiler Collection的缩写,是一款开源的编译器,支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。
GCC命令的选项非常多,可以根据不同的需求进行选择,下面将对GCC命令的选项进行简述。
1. 常用选项(1)-c:只编译不链接,生成目标文件。
(2)-o:指定输出文件名。
(3)-g:生成调试信息。
(4)-Wall:开启所有警告信息。
(5)-Werror:将警告信息视为错误。
(6)-O:优化选项,包括-O0、-O1、-O2、-O3等级别。
(7)-I:指定头文件搜索路径。
(8)-L:指定库文件搜索路径。
(9)-l:指定链接的库文件名。
2. 预处理选项(1)-E:只进行预处理,输出预处理结果。
(2)-D:定义宏。
(3)-U:取消定义宏。
(4)-I:指定头文件搜索路径。
(5)-M:输出依赖关系。
3. 编译选项(1)-S:只编译不汇编,生成汇编代码。
(2)-fPIC:生成位置无关代码。
(3)-fno-strict-aliasing:关闭严格别名规则。
(4)-fno-omit-frame-pointer:不省略函数栈帧指针。
(5)-fno-common:禁止共享数据段。
(6)-fno-builtin:禁用内建函数。
(7)-fno-stack-protector:禁用栈保护。
4. 链接选项(1)-shared:生成共享库。
(2)-static:生成静态库。
(3)-nostdlib:不使用标准库。
(4)-nodefaultlibs:不使用默认库。
(5)-Wl:传递参数给链接器。
(6)-rpath:指定运行时库搜索路径。
5. 其他选项(1)-v:显示编译器版本信息。
(2)-dumpversion:显示编译器版本号。
(3)-dumpmachine:显示编译器目标机器。
(4)-print-search-dirs:显示搜索路径。
(5)-print-libgcc-file-name:显示libgcc文件路径。
gcc编译选项
gcc编译选项提供了⼤量的警告选项,对代码中可能存在的问题提出警告,通常可以使⽤-Wall来开启以下警告:-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat-Wchar-subscripts -Wimplicit-int -Wimplicit-function-declaration-Wcomment -Wformat -Wmain (only for C/ObjC and unless-ffreestanding) -Wmissing-braces -Wnonnull -Wparentheses-Wpointer-sign -Wreorder -Wreturn-type -Wsequence-point-Wsign-compare (only in C++) -Wstrict-aliasing -Wstrict-overflow=1-Wswitch -Wtrigraphs -Wuninitialized (only with -O1 and above)-Wunknown-pragmas -Wunused-function -Wunused-label -Wunused-value-Wunused-variableunused-function:警告声明但是没有定义的static函数;unused- label:声明但是未使⽤的标签;unused-parameter:警告未使⽤的函数参数;unused-variable:声明但是未使⽤的本地变量;unused-value:计算了但是未使⽤的值;format:printf和scanf这样的函数中的格式字符串的使⽤不当;implicit-int:未指定类型;implicit-function:函数在声明前使⽤;char- subscripts:使⽤char类作为数组下标(因为char可能是有符号数);missingbraces:⼤括号不匹配;parentheses: 圆括号不匹配;return-type:函数有⽆返回值以及返回值类型不匹配;sequence-point:违反顺序点的代码,⽐如 a[i] = c[i++];switch:switch语句缺少default或者switch使⽤枚举变量为索引时缺少某个变量的case;strict- aliasing=n:使⽤n设置对指针变量指向的对象类型产⽣警告的限制程度,默认n=3;只有在-fstrict-aliasing设置的情况下有效;unknow-pragmas:使⽤未知的#pragma指令;uninitialized:使⽤的变量为初始化,只在-O2时有效;以下是在-Wall中不会激活的警告选项:cast-align:当指针进⾏类型转换后有内存对齐要求更严格时发出警告;sign- compare:当使⽤signed和unsigned类型⽐较时;missing-prototypes:当函数在使⽤前没有函数原型时;packed:packed 是gcc的⼀个扩展,是使结构体各成员之间不留内存对齐所需的,有时候会造成内存对齐的问题;padded:也是gcc的扩展,使结构体成员之间进⾏内存对齐的填充,会造成结构体体积增⼤.unreachable-code:有不会执⾏的代码时.inline:当inline函数不再保持inline时 (⽐如对inline函数取地址);disable-optimization:当不能执⾏指定的优化时.(需要太多时间或资源).可以使⽤ -Werror时所有的警告都变成错误,使出现警告时也停⽌编译.需要和指定警告的参数⼀起使⽤.优化:gcc默认提供了5级优化选项的集合:-O0:⽆优化(默认)-O和-O1:使⽤能减少⽬标⼤⼩以及执⾏时间并且不会使编译时间明显增加的优化.在编译⼤型程序的时候会显著增加编译时内存的使⽤.-O2: 包含-O1的优化并增加了不需要在⽬标⽂件⼤⼩和执⾏速度上进⾏折衷的优化.编译器不执⾏循环展开以及函数内联.此选项将增加编译时间和⽬标⽂件的执⾏性能.-Os:专门优化⽬标⽂件⼤⼩,执⾏所有的不增加⽬标⽂件⼤⼩的-O2优化选项.并且执⾏专门减⼩⽬标⽂件⼤⼩的优化选项.-O3: 打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项.-O1包含的选项-O1通常可以安全的和调试的选项⼀起使⽤:-fauto-inc-dec -fcprop-registers -fdce -fdefer-pop -fdelayed-branch-fdse -fguess-branch-probability -fif-conversion2 -fif-conversion-finline-small-functions -fipa-pure-const -fipa-reference-fmerge-constants -fsplit-wide-types -ftree-ccp -ftree-ch-ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse-ftree-fre -ftree-sra -ftree-ter -funit-at-a-time以下所有的优化选项需要在名字前加上-f,如果不需要此选项可以使⽤-fno-前缀defer-pop:延迟到只在必要时从函数参数栈中pop参数;thread- jumps:使⽤跳转线程优化,避免跳转到另⼀个跳转;branch-probabilities:分⽀优化;cprop- registers:使⽤寄存器之间copy-propagation传值;cprop- registers:使⽤寄存器之间copy-propagation传值;guess-branch-probability:分⽀预测;omit- frame-pointer:可能的情况下不产⽣栈帧;-O2:以下是-O2在-O1基础上增加的优化选项:-falign-functions -falign-jumps -falign-loops -falign-labels-fcaller-saves -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks-fdelete-null-pointer-checks -fexpensive-optimizations -fgcse-fgcse-lm -foptimize-sibling-calls -fpeephole2 -fregmove-freorder-blocks -freorder-functions -frerun-cse-after-loop-fsched-interblock -fsched-spec -fschedule-insns-fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-pre-ftree-vrpcpu架构的优化选项,通常是-mcpu(将被取消);-march,-mtuneDebug选项:在 gcc编译源代码时指定-g选项可以产⽣带有调试信息的⽬标代码,gcc可以为多个不同平台上帝不同调试器提供调试信息,默认gcc产⽣的调试信息是为 gdb使⽤的,可以使⽤-gformat 指定要⽣成的调试信息的格式以提供给其他平台的其他调试器使⽤.常⽤的格式有-ggdb:⽣成gdb专⽤的调试信息,使⽤最适合的格式(DWARF 2,stabs等)会有⼀些gdb专⽤的扩展,可能造成其他调试器⽆法运⾏.-gstabs:使⽤ stabs格式,不包含gdb扩展,stabs常⽤于BSD系统的DBX调试器.-gcoff:产⽣COFF格式的调试信息,常⽤于System V下的SDB调试器;-gxcoff:产⽣XCOFF格式的调试信息,⽤于IBM的RS/6000下的DBX调试器;-gdwarf- 2:产⽣DWARF version2 的格式的调试信息,常⽤于IRIXX6上的DBX调试器.GCC会使⽤DWARF version3的⼀些特性.可以指定调试信息的等级:在指定的调试格式后⾯加上等级:如: -ggdb2 等,0代表不产⽣调试信息.在使⽤-gdwarf-2时因为最早的格式为-gdwarf2会造成混乱,所以要额外使⽤⼀个-glevel来指定调试信息的等级,其他格式选项也可以另外指定等级.gcc可以使⽤-p选项指定⽣成信息以供porf使⽤.GCC常⽤选项选项含义--help显⽰ gcc 帮助说明。
gcc常用的编译选项
gcc常⽤的编译选项⼀、程序编译过程程序编译的时候,要分四个阶段:1、预处理阶段,完成宏定义和include⽂件展开等⼯作;2、根据编译参数进⾏不同程度的优化,编译成汇编代码;3、⽤汇编器把汇编代码进⼀步⽣成⽬标代码;4、⽤连接器把⽣成的⽬标代码和系统或⽤户提供的库连接起来,⽣成可执⾏⽂件;⼆、gcc/g++的编译过程1.预处理,不⽣成⽂件[预处理器cpp]2.将预处理后的⽂件转换成汇编语⾔,⽣成.s的⽂件[编译器egcs]3.由汇编变为⽬标代码(机器代码)⽣成.o的⽂件[汇编器as]4.连接⽬标代码,⽣成可执⾏程序[链接器ld]三、gcc常⽤编译选项-E 只运⾏C预编译器cpp,不⽣成⽂件-S 只把⽂件编译成为汇编代码-c 只⽣成object⽂件,不链接-o ⽣成指定的输出⽂件-g ⽣成可被gdb使⽤的标准调试信息-IDIR 指定额外的头⽂件搜索路径DIR-LDIR 指定额外的库函数搜索路径DIR-lLIBRARY 指定链接时需要的其它函数库“LIBRARY-w 不⽣成任何警告信息-Wall ⽣成所有级别的警告信息-shared ⽣成⽀持动态共享库的执⾏⽂件-static 不⽀持动态共享库,把函数库内容静态链接到可执⾏程序中-O0 不进⾏代码优化处理-O,O1 进⾏⼀般优化,减少⼤⼩和时间-O2 进⼀步优化,⼀般在内核编译时使⽤-O3 较-O2进⼀步优化四、arm-linux-gcc常⽤编译选项arm-linux-gccarm-linux-objdump–D 显⽰所有段的汇编内容 -d 显⽰可执⾏段的汇编内容 –m arm。
GCC -o 优化选项说明
GCC编译器优化选项分析及具体优化了什么收藏起因:目前项目使用nios IDE作为开发平台,其使用的编译器为gcc的交叉编译器。
在设定编译条件时,在debug模式下生成的程序正常,但是在release模式下会出现LCD显示的开端显示不全,缺少一个字节或字的状况。
为了了解具体为什么造成该问题,对两种模式下的配置做了对比,编译器皆为nios2-elf-gcc交叉编译器,debug模式编译器参数为:-DALT_DEBUG -O0 -g –Wall。
release模式编译器参数为: -DALT_RELEASE -O2 -g –Wall。
两种模式下的参数简单说明如下-DALT_DEBUG:目前没有明确资料显示该项的具体作用,根据命名可认为与调试有关选项。
且两种模式下都有,暂时认为不会造成差异。
-O0: gcc编译器默认优化等级。
-g:gdb调试器支持选项用于在编译时生成相关调试信息。
-Wall:打开所有编译器告警选项,即编译器最严格告警模式。
-O2:gcc编译高于O0低于O3的编译优化选项。
通过对比可以发现两种模式主要的不同在于编译器优化程度不同,那么编译器在两种优化下究竟做了什么优化那?是否由这些问题造成的显示丢失问题那??现在我们来看看gcc编译器的优化参数到底做了什么优化。
(注:由于关于nios2-elf-gcc的文档资料十分稀少,不能形成可分析的文档,所以以通用的gcc作为分析,毕竟同出一源)正文:GCC编译器优化选项介绍:GCC编译器在目前是不是用最多的编译器也相去不远,尤其在嵌入式领域很多编译器都是基于GCC的cross gcc版本。
毕竟功能成熟而且有开放的源代码。
这里只介绍优化编译的参数-O用来开启优化编译选项。
-O0:默认模式,不做任何优化。
-O1:优化。
该模式下对于一个大的函数或功能会花费更多的时间和内存。
在-O1下:编译会尝试减少代码体积和代码运行时间。
但是并不执行会花费大量时间的优化操作。
GCC编译选项参数
GCC编译选项参数GCC是一种开源的编译器套件,可用于编译多种编程语言,例如C、C++、Objective-C、Fortran等。
GCC提供了许多编译选项参数,以便开发人员根据需要自定义编译过程。
以下是一些常用的GCC编译选项参数。
1. -o filename:指定输出文件的名称,例如gcc -o myprogram.c。
2.-c:仅编译源文件,生成相应的目标文件,而不进行链接操作。
3.-E:仅进行预处理,输出预处理后的源代码。
4.-S:仅进行编译,生成汇编语言代码。
5.-g:生成调试信息,以便在调试程序时使用调试器。
6. -O[level]:优化编译,提高程序执行效率。
级别有-O0(关闭优化)、-O1(开启基本优化)、-O2(开启更多优化)、-O3(开启所有优化)等。
7. -Wall:输出所有警告信息。
8. -Werror:将所有警告信息视为错误,编译过程中出现警告将中断编译。
9. -std=标准:指定使用的语言标准,例如-std=c9910. -I directory:指定头文件的路径,可以使用多个-I选项来指定多个路径。
11. -L directory:指定库文件的路径,可以使用多个-L选项来指定多个路径。
12. -l library:链接指定的库文件,例如-lm表示链接数学库。
13. -D macro:定义一个宏,可以使用-D选项定义多个宏。
14. -U macro:取消一个宏的定义。
15. -pedantic:严格按照标准执行,当代码使用了标准不允许的特性时给出警告。
16. -Werror-implicit-function-declaration:函数未声明时,将其视为错误。
17. -Wno-unused-variable:忽略未使用的变量警告。
18.-fPIC:生成位置无关代码,用于生成共享库。
19. -march=architecture:指定目标架构,例如-march=native表示使用当前机器的最佳指令集扩展。
【GCC】gcc警告选项汇总--编辑中gcc编译选项
【GCC】gcc警告选项汇总--编辑中gcc编译选项⽬录参考原⽂:https:///qq_17308321/article/details/79979514前⾔警告:不是错误的,但是有风险或表明可能有错误。
英⽂原⽂:请求或取消警告选项加上-Wall吧,gcc 默认不加参数的情况下连定义了返回值的函数没有返回值都不报错。
-Wall,-Wextra 就是加-Wall 和-Wall不启动的选项也加上()-fsyntax-only检查代码中的语法错误,但除此之外不要做任何事情。
-w (⼩写)禁⽌所有警告消息。
-W (⼤写)以“ -W ”请求特定的警告 - 可以隐式地请求隐式声明的警告。
-W和-Wall的区别-Wall选项意思是编译后显⽰所有警告。
-W选项类似-Wall,会显⽰警告,但是只显⽰编译器认为会出现错误的警告。
在编译⼀些项⽬的时候可以-W和-Wall选项⼀起使⽤。
gcc -W -Wall test_w_wall testwwall.c-Werror=将指定的警告转换为错误。
请注意,指定-Werror = foo会⾃动隐含-W foo 。
但是, -Wno-error = foo并不意味着什么。
反过来:-Wno-error取消编译选项-Werror⽤途:假设我们使⽤了⼀个⼈的代码A⽬录,⾥⾯有⼀个-Werror的选项,把所有的警告当做错误;⼜使⽤了另⼀个⼈的代码B⽬录,⾥⾯存在⼀堆Warning。
这样,当我们把它们合在⼀起编译的时候,A中的-Werror选项会导致B的代码编译不过。
但我们⼜不想去修改B的代码,怎么办?⽅法是,先add_subdirectory(A),之后,加上⼀句set(CMAK_CXX_FLAGS "${CMAK_CXX_FLAGS} -Wno-error")-Wno-这个前缀,就是⽤来取消⼀个编译选项的然后,再add_subdirectory(B)-Wfatal-errors在发⽣第⼀个错误时中⽌编译。
警惕arm-linux-gcc编译器优化选项
警惕arm-linux-gcc编译器优化选项arm-linux-gcc的优化选项例如(-O2),可以加速我们的程序,使程序执⾏效率更⾼。
但是,倘若我们就是需要程序慢⼀点运⾏,但是优化却把我们的延时函数优化的没有了的时候,这种优化却不是我们想要的。
有时候,我们需要事物差的⼀⾯。
下边的代码是我的main.c程序。
#define GPBCON (*(volatile unsigned long *)0x56000010)#define GPBDAT (*(volatile unsigned long *)0x56000014)#define GPB5_out (1<<(5*2))#define GPB6_out (1<<(6*2))#define GPB7_out (1<<(7*2))#define GPB8_out (1<<(8*2))void wait(unsigned long dly){for(; dly > 0; dly--);}int main(void){unsigned long i = 0;GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out; // 将LED1-4对应的GPB5/6/7/8四个引脚设为输出while(1){wait(30000);GPBDAT = (~(i<<5)); // 根据i的值,点亮LED1-4if(++i == 16){i = 0;}}return0;} 这部分程序使⽤优化选项(-O2)编译的,编译后的汇编程序如下所⽰。
0000001c <wait>:1c: e12fff1e bx lr00000020 <main>:20: e92d4010 stmdb sp!, {r4, lr}24: e3a03b55 mov r3, #87040; 0x1540028: e3a04456 mov r4, #1442840576; 0x560000002c: e59f0060 ldr r0, [pc, #96] ; 94 <.text+0x94>30: e5843010 str r3, [r4, #16]34: ebfffff8 bl 1c <wait>38: e3e03000 mvn r3, #0; 0x03c: e59f0050 ldr r0, [pc, #80] ; 94 <.text+0x94>40: e5843014 str r3, [r4, #20]44: ebfffff4 bl 1c <wait>48: e3e03020 mvn r3, #32; 0x204c: e5843014 str r3, [r4, #20]50: e59f003c ldr r0, [pc, #60] ; 94 <.text+0x94>54: ebfffff0 bl 1c <wait>58: e3e03040 mvn r3, #64; 0x405c: e3a01003 mov r1, #3; 0x360: e5843014 str r3, [r4, #20]64: e1a04001 mov r4, r168: e59f0024 ldr r0, [pc, #36] ; 94 <.text+0x94>6c: ebffffea bl 1c <wait>70: e2841001 add r1, r4, #1; 0x174: e1a03284 mov r3, r4, lsl #578: e1e03003 mvn r3, r37c: e3a02456 mov r2, #1442840576; 0x5600000080: e3510010 cmp r1, #16; 0x1084: e5823014 str r3, [r2, #20]88: e3a04000 mov r4, #0; 0x08c: 1afffff4 bne 64 <main+0x44>90: eafffff4 b 68 <main+0x48>94: 00007530 andeq r7, r0, r0, lsr r5 可以看到,我们的延时函数完全被优化的没有了,那么我们的延时函数还有什么⽤。
GCC编译优化指南
GCC编译优化指南GCC编译优化指南作者:金步国版权声明本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着GPL 的精神发布。
任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。
您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。
其他作品本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作品的列表:•金步国作品列表BUG报告,切磋与探讨由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。
如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。
如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。
联系方式:MSN:**********************前言网上关于编译优化的文章很多,但大多零零散散,不成体系,本文试图给出一个完整和清晰的优化思路,同时提供在实践中如何进行优化的详尽参考。
但是,在介绍所有优化知识之前首先引用LFS-Book中的一句忠告:“使用编译器优化得到的小幅度性能提升,与它带来的风险相比微不足道”。
你还要进行优化吗?%@&#=^%~*# ...OK, crazy guy! Let's Go!!在继续之前,作者还是奉劝各位:如果追求极致的优化,那么它将是一件既耗时又麻烦的事情,你会陷入无止尽的测试、测试、再测试……另外Gentoo wiki 上有这么一句话:"GCC has well over a hundred individual optimization flags and it would be insane to try and describe them all."所以本文不会涉及全部GCC优化选项。
gcc编译选项手册
gcc编译选项手册
GCC是一款功能强大的开源编译器,提供了许多编译选项来控
制编译过程和生成的代码。
以下是一些常用的编译选项手册:
1. `-o <output>`: 指定生成的可执行文件的名称。
2. `-c`: 生成目标文件但不进行链接,通常用于生成中间文件。
3. `-g`: 生成调试信息,方便调试程序。
4. `-Wall`: 开启所有警告信息,帮助发现潜在的问题。
5. `-O`: 启用优化,包括`-O0`(无优化)、`-O1`(基本优化)、`-O2`(更多优化)和`-O3`(最大优化)。
6. `-I <path>`: 添加包含文件的搜索路径。
7. `-L <path>`: 添加库文件的搜索路径。
8. `-l<library>`: 指定链接时需要的库文件。
9. `-D<macro>`: 定义一个预处理宏。
10. `-std=<standard>`: 指定使用的语言标准,如`-std=c11`表示使用C11标准。
除了上述常用的编译选项外,GCC还提供了许多其他选项,用于控制优化、调试信息、代码生成等方面的细节。
通过查阅GCC官方文档或者在命令行下输入`gcc --help`可以获取完整的编译选项手册。
总的来说,GCC编译选项提供了丰富的功能,能够帮助开发者控制编译和链接过程中的各个细节,从而生成高质量的目标文件和可执行文件。
对于不同的项目和需求,合理选择和使用编译选项是非常重要的。
gcc编译选项分析
小知识
可以看出,该选项并没有发现”long long”这个无效数据类型的错误。
∙“-pedantic”
允许发出ANSI C标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSI C标准的。
其运行结果如下所示:
[root@localhost Gcc]# Gcc –pedantic warning.c –o warning
warning.c: 在函数“main”中:
warning.c:5 警告:ISO C90不支持“long long”
warning.c:7 警告:在无返回值的函数中,“return”带返回值
warning.c:4 警告:“main”的返回类型不是“int”
可以看出,使用该选项查看出了”long long”这个无效数据类型的错误。
∙“-Wall”
允许发出Gcc能够提供的所有有用的报警信息。
该选项的运行结果如下所示:[root@localhost Gcc]# Gcc –Wall warning.c –o warning
warning.c:4 警告:“main”的返回类型不是“int”
warning.c: 在函数”main”中:
warning.c:7 警告:在无返回值的函数中,”return”带返回值
warning.c:5 警告:未使用的变量“tmp”
使用“-Wall”选项找出了未使用的变量tmp,但它并没有找出无效数据类型的错误。
另外,Gcc还可以利用选项对单独的常见错误分别指定警告,有关具体选项的含义感兴趣的读者可以查看Gcc手册进行学习。
(3)优化选项。
gcc编译选项
gcc编译选项摘⾃/liuchao1986105/article/details/6674822版本] -0.13[声明]这篇⽂档是我的关于gcc参数的笔记,我很怀念dos年代我⽤⼩本⼦,纪录任何的dos 命令的参数.哈哈,下⾯的东西可能也不是很全⾯,我参考了很多的书,和gcc的帮助.不全的原因是,有可能我还没有看到这个参数,另⼀种原因是,我可能还不会⽤他但是,我会慢慢的补齐的.哈哈假如您要转在本⽂章请保留我email()和⽂章的全⾯性.[介绍]gcc and g++分别是gnu的c & c++编译器 gcc/g++在执⾏编译⼯作的时候,总共需要4步1.预处理,⽣成.i的⽂档[预处理器cpp]2.将预处理后的⽂档不转换成汇编语⾔,⽣成⽂档.s[编译器egcs]3.有汇编变为⽬标代码(机器代码)⽣成.o的⽂档[汇编器as]4.连接⽬标代码,⽣成可执⾏程式[链接器ld][参数详解]-x language filename 设定⽂档所使⽤的语⾔,使后缀名⽆效,对以后的多个有效.也就是根据约定C语⾔的后缀名称是.c的,⽽C++的后缀名是.C或.cpp,假如您很个性,决定您的C代码⽂档的后缀名是.pig 哈哈,那您就要⽤这个参数,这个参数对他后⾯的⽂档名都起作⽤,除⾮到了下⼀个参数的使⽤。
能够使⽤的参数吗有下⾯的这些 `c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp'. 看到英⽂,应该能够理解的。
例⼦⽤法: gcc -x c hello.pig-x none filename 关掉上⼀个选项,也就是让gcc根据⽂档名后缀,⾃动识别⽂档类型 例⼦⽤法: gcc -x c hello.pig -x none hello2.c-c 只激活预处理,编译,和汇编,也就是他只把程式做成obj⽂档 例⼦⽤法: gcc -c hello.c 他将⽣成.o的obj⽂档-S 只激活预处理和编译,就是指把⽂档编译成为汇编代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GCC编译器选项及优化提示GCC编译器选项及优化提示2010-08-01 19:41很多弟兄可能都很关心如何优化编译自己的程序,虽然本人不赞成"骨灰"玩法,却也不得不承认这是掌握gcc的绝佳途径;因此献上此帖,以供各位玩家参考,绝对原创噢大多数程序和库在编译时默认的优化级别是"2"(使用gcc选项:"-O2")并且在Intel/AMD平台上默认按照i386处理器来编译。
如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。
一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。
一些源码包比如binutils,gcc,glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了!另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。
大多数configure脚本会使用这两个环境变量代替Makefile文件中的值。
但是少数configure脚本并不这样做,他们必须需要手动编辑才行。
为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值):export CFLAGS="-O3-march="&&CXXFLAGS=$CFLAGS这是一个确保能够在几乎所有平台上都能正常工作的最小设置。
"-march"选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行),Intel通常是:pentium2,pentium3,pentium3m,pentium4,pentium4m,pentium-m,prescott,nocona说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m 是迅驰I/II代笔记本的cpu;prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)AMD通常是:k6,k6-2,k6-3,athlon,athlon-tbird,athlon-xp,athlon-mp,opteron,athlon64,athlon-fx用AMD的一般都是DIYer,就不必解释了吧。
如果编译时没有抱怨"segmentation fault,core dumped",那么你设定的"-O"优化参数一般就没什么问题。
否则请降低优化级别("-O3"-"-O2"-"-O1"-取消)。
个人意见:服务器使用"-O2"就可以了,它是最安全的优化参数(集合);桌面可以使用"-O3";不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时"-O3"反而更慢)。
编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。
所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。
注意:选项的顺序很重要,如果有两个选项互相冲突,则以后一个为准。
比如"-O3"将打开-finline-functions选项,但是可以用"-O3-fno-inline-functions"既使用-O3的功能又关闭函数内嵌功能。
更多的优化选项请参见:所有GCC选项完整列表参见:有两个页面值的参考:(对于gentoo-1.4)比较安全的优化选项(对于gentoo-1.4)进阶优化选项哦,忘了说一声,"-O2"已经启用绝大多数安全的优化选项了,所以其实你不必对那一堆选项发愁。
先说说"-O3"在"-O2"基础上增加的几项,你可以按需添加(还算比较安全):[gcc-3.4.4]-finline-functions允许编译器选择某些简单的函数在其被调用处展开-fweb为每个web结构体分配一个伪寄存器-frename-registers试图驱除代码中的假依赖关系,这个选项对具有大量寄存器的机器很有效。
[gcc-4.0.2]-finline-functions说明如上-funswitch-loops将循环体中不改变值的变量移动到循环体之外-fgcse-after-reload*不太明白它的含义*[哪位大峡知道给小弟讲解一下,先行谢过说完"-O3"再说说在嵌入式系统上常用的"-Os"选项,这个选项其实也很重要,它的含义是对生成的二进制代码进行尺寸上的优化,它打开了所有"-O2"打开的选项,因此通常认为的"-Os"生成的二进制代码执行效率低的潜在意识是错误的!当然该选项与"-O2"的不同之处在于它在"-O2"的基础上禁止了所有为了对齐而插入的空间,也就是将所有"-falign-*"系列的选项禁用了。
这种禁用究竟是否一定降低了代码的执行效率,依据程序的不同而不同,据说某些情况下"-Os"的效率比"-O3"还要高14%!请兄弟们在实践中自己摸索吧.下面选择我认为比较重要的几项简单介绍一下[gcc-3.4.4],GCC选项完整列表太长了!精力有限。
[注意]这里列出的都是非默认的选项,你只需要添加你所需要的选项即可-w禁止输出警告消息-Werror将所有警告转换为错误-Wall显示所有的警告消息-v显示编译程序的当前版本号-V指定gcc将要运行的版本。
只有在安装了多个版本gcc的机器上才有效。
-ansi按照ANSI标准编译程序,但并不限制与标准并不冲突的GNU 扩展(一般不用该选项)-pedantic如果要限制代码必须严格符合ISO标准,就在"-ansi"的基础上同时启用这个选项(很少使用)-std=指定C语言的标准(c89,c99,gnu89),该选项禁止了GNU C的扩展关键字asm,typeof,inline(一般不用该选项)-static连接器将忽略动态连接库,同时通过将静态目标文件直接包含到结果目标文件完成对所有引用的解析。
-shared连接器将生成共享目标代码,该共享库可在运行时动态连接到程序形成完整的可执行体。
如果使用gcc命令创建共享库作为其输出,该选项可以防止连接器将缺失main()方法视为错误。
为了可以正确的工作,应该一致的使用选项"-fpic"以及目标平台选项编译构成同一个库的所有共享目标模块。
-shared-libgcc该选项指定使用共享版本的libgcc,在没有共享版本的libgcc的机器上该选项无效。
-specs=gcc驱动程序读取该文件以确定哪些选项应该传递给那些子进程。
该选项可以通过指定配置文件来覆盖默认配置,指定的文件将在默认配置文件读取后进行处理以修改默认配置。
-pipe使用管道而不是临时文件一个阶段到另一个阶段交换输出的方式,可以加快编译速度。
建议使用。
-o指定输出文件,对各种输出皆有效。
由于只能指定一个文件,所以在产生多个输出文件的情况下不要使用该选项。
--help显示gcc的命令行选项列表;与"-v"一起使用时还将显示gcc调用的各个进程所接受的选项。
--target-help显示目标机器相关的命令行选项列表-b指示需要编译程序的目标机器;默认为编译程序所运行的目标机编译代码。
目标机通过指定包含编译程序的目录来确定,通常为/usr/local/lib/gcc-lib//-B指定库文件的位置,包括编译程序的文件、执行程序和数据文件,如果需要运行子程序(如cpp,as,ld)就会用该前缀来定位。
这个前缀可以是用冒号分割的多个路径,环境变量GCC_EXEC_PREFIX和这个选项有相同的效果。
-I指定搜索系统头文件的目录,可以重复使用多个该选项指定多个目录。
-dumpmachine显示该程序的目标机名字,不做其他任何动作-dumpspecs显示构件编译程序的规范信息,包括用来编译、汇编和连接gcc编译程序自身用到的所有选项,不做其他任何动作。
-dumpversion显示编译程序自身的版本号,不做其他任何动作-falign-functions=N将所有函数的起始地址在N(N=1,2,4,8,16.)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。
-falign-jumps=N将分支目标在N(N=1,2,4,8,16.)的边界上对齐,默认为机器自身的默认值,指定为1表示禁止对齐。
-fno-align-labels建议使用它,以保证不和-falign-jumps("-O2"默认启用的选项)冲突-fno-align-loops建议使用它,以确保不会在分支目标前插入多余的空指令。
-fbranch-probabilities在使用"-fprofile-arcs"选项编译程序并执行它来创建包含每个代码块执行次数的文件之后,程序可以利用这一选项再次编译,文件中所产生的信息将被用来优化那些经常发生的分支代码。
如果没有这些信息,gcc将猜测那一分支可能经常发生并进行优化。
这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。
-fno-guess-branch-probability默认情况下gcc将使用随机模型进行猜测哪个分支更可能被经常执行,并以此来优化代码,该选项关闭它。
-fprofile-arcs在使用这一选项编译程序并运行它以创建包含每个代码块的执行次数的文件后,程序可以再次使用"-fbranch-probabilities"编译,文件中的信息可以用来优化那些经常选取的分支。
如果没有这些信息,gcc将猜测哪个分支将被经常运行以进行优化。
这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。
-fforce-addr必须将地址复制到寄存器中才能对他们进行运算。
由于所需地址通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。
-fforce-mem必须将数值复制到寄存器中才能对他们进行运算。
由于所需数值通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。