Makefile及GCC编译选项培训

上传人:cn****1 文档编号:570635142 上传时间:2024-08-05 格式:PPT 页数:46 大小:346.50KB
返回 下载 相关 举报
Makefile及GCC编译选项培训_第1页
第1页 / 共46页
Makefile及GCC编译选项培训_第2页
第2页 / 共46页
Makefile及GCC编译选项培训_第3页
第3页 / 共46页
Makefile及GCC编译选项培训_第4页
第4页 / 共46页
Makefile及GCC编译选项培训_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《Makefile及GCC编译选项培训》由会员分享,可在线阅读,更多相关《Makefile及GCC编译选项培训(46页珍藏版)》请在金锄头文库上搜索。

1、MakefileMakefileGCCGCC编译选项编译选项培训培训Makefile简介简介:MAKE工具是一般C编译器都提供的一个编译控制工具,它可以自动确定程序的哪些部分需要重新编译,并执行命令重新编译它们。缺省情况下,GNU make自动使用一个构造文件makefile或Makefile来了解编译和链接一个程序的规则及方法。如果用户需要指定自己的构造文件,需要使用命令:make fXXXX其中XXXX就是用户所需要指定的构造文件名称。MakefileMakefile及及GCCGCC编译选项培训编译选项培训Makefile的基本规则的基本规则:简单的构造文件包含如下形式的规则:TARGET

2、 . : DEPENDENCIES . COMMAND.TARGET 一般是程序生成的文件名,如可执行文件或目标文件。它也可以是某个要执行的操作的名称,比如“clean”。DEPENDENCIES 是生成目标所用的输入文件。一个目标可以依靠多个文件。COMMAND 是make要执行的操作。一条规则可以包含多个命令,一个命令占一行。注意:在每行命令前需要有一个tab字符。MakefileMakefile及及GCCGCC编译选项培训编译选项培训Makefile里的规则解释了如何以及何时重新构造作为特定规则的目标的特定文件。它也可以解释如何以及何时执行一个操作。构造文件可以包含规则以外的其它文本,但

3、简单的构造文件只需要包含规则。如果目标是文件,那么任何一个依靠文件发生改变,它都需要重新编译或重新链接。自动生成的依靠文件本身首先被更新。需要记住的是,make并不知道命令是如何工作的,它只是在目标需要更新时按照指定的规则执行命令。MakefileMakefile及及GCCGCC编译选项培训编译选项培训MakefileMakefile中变量的使用中变量的使用: :objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit : $(objects) cc -o edit $(objects)用包

4、含“+=”的一行可以为变量附加文本,如:objects = main.o foo.o bar.o utils.oobjects += objects += another.oanother.o等同于:objects = main.o foo.o bar.o utils.oobjects := $(objects) objects := $(objects) another.oanother.o如果变量此前没有定义,“+=”与普通的“=”相同。但在此前有定义的情况下,“+=”按照变量初始定义的类型扩展。MakefileMakefile及及GCCGCC编译选项培训编译选项培训makemake使用的

5、自动变量使用的自动变量: :$规则目标的文件名。如果目标是档案文件的一个成员,$ 就是档案文件的名称。$%$%当目标是档案文件的一个成员时,$%$% 是该成员的名称。若目标不是档案文件的一个成员,$%$% 为空。$第一个依靠文件的名称。$?$?以空格隔开的比目标新的所有依靠文件名。在依靠文件是档案文件的成员时,只使用成员的名称。$以空格隔开的所有依靠文件名。在依靠文件是档案文件的成员时,只使用成员的名称。无论一个依靠文件出现过多 少次,$ 值中只包含其名称的一个拷贝。MakefileMakefile及及GCCGCC编译选项培训编译选项培训变量使用范例变量使用范例: :foo : foo.c -

6、lcurses cc $ -o $会解释为以下的命令cc foo.c /usr/lib/libcurses.a -o foo我们不推荐使用自动变量,虽然这样可以简化我们不推荐使用自动变量,虽然这样可以简化makefilemakefile的写作。的写作。参考文档参考文档 GNU MakefileMakefile及及GCCGCC编译选项培训编译选项培训GCCGCC简介简介: : 现在多个版本的编译器(C、C+、Objective-C、Ada、Fortran 和Java )已经被集成在一起,因此我们将GCC 称为“GNU 编译器集”(GNU Compiler Collection)。GCC 是GNU

7、编译器集的常用缩写,它既是该编译器最普遍的名称,也是在强调用来编译C程序时所用的名称(以前代表“GNU C编译器”的缩写)。 在特指C+编译时,该编译器常被称为“G+”。因为只存在一个编译器,所以把它称为“GCC”也是准确的。但“G+”更多地用于强调编译的是C+程序。 在我们谈论Ada编译的时候,也因此常把编译器称作“GNAT”。 我们用“GCC”指代整个编译系统,尤其是编译器中与编程语言无关的那部分。MakefileMakefile及及GCCGCC编译选项培训编译选项培训编译开关使用说明编译开关使用说明: : 运行GNU CC一般会完成预处理、编译、汇编和连接四个过程。“全局开关”允许在其中

8、某个中间阶段停止这一过程。例如,“-c”开关就要求不进行连接,这样得到的输出就是汇编程序输出的目标文件。 其它开关则是传递给其中某一处理阶段的。某些开关是控制预处理器的,某些是控制编译器本身的。还有一些控制汇编程序和连接程序的开关,很少会被使用到。 MakefileMakefile及及GCCGCC编译选项培训编译选项培训全局开关全局开关: : 编译涉及的四个阶段依次为:预处理、完全编译、汇编和链接。前三个阶段应用于一个单独的源文件,最后生成一个目标文件;连接把所有目标文件(新编译的以及在输入里指定的那些文件)结合成一个可执行文件。 对于给定的输入,编译器可以根据文件名的后缀决定进行哪一种编译;

9、但我们希望使用时通过选项“-x”明确指定编程语言。以下为GCC支持的全局开关: -c -S -E -o -c -S -E -o filefile -pipe -pass-exit-codes -x -pipe -pass-exit-codes -x languagelanguage -v -# -help -target-help -version -v -# -help -target-help -version MakefileMakefile及及GCCGCC编译选项培训编译选项培训-x -x languagelanguage 明确指定后面输入文件的语言为languagelanguage(

10、而不是让编译器根据文件名后缀选择一个缺省值)。此选项影响后面的所有输入文件,一直到下一个 x x 选项。 languagelanguage可取的值为: c c-headerc c-header cppcpp-output c+ -output c+ c+-cpp-outputc+-cpp-output objective-c objective-c objc-cpp-outputobjc-cpp-output assembler assembler-with- assembler assembler-with-cppcpp adaada f77 f77-cpp-input f77 f77-cp

11、p-input ratforratfor java javaMakefileMakefile及及GCCGCC编译选项培训编译选项培训-c-c 编译汇编源文件,不进行连接。最后的输出是为每一个源文件生成一个目标文件。 缺省情况下,生成的目标文件名是将源文件名的后缀“.c”、“.i”、“.s”等替换为后缀“.o”。 忽略不可识别的输入文件,不对其进行编译或汇编。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-S -S 在完全编译后结束,不进行汇编处理。输出的是每一个非汇编输入文件相应的汇编码格式文件。 缺省情况下,生成的汇编文件名是将源文件名的后缀“.c”、“.i”等替换

12、为后缀“.s”。 忽略不需要进行编译的输入文件。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-o -o filefile 将输出保存在文件filefile里,无论输出是何种格式,可执行文件、目标文件、汇编文件或预处理过的C代码。 由于只能指定一个输出文件,所以在编译多于一个输入文件时使用-o-o选项没有意义,除非输出是生成一个可执行文件。 如果没有使用-o-o选项,则在缺省情况下,可执行文件保存为a.outa.out,sourcesource. .suffixsuffix的目标文件保存为sourcesource.o.o,其汇编码文件保存为sourcesource.s

13、.s,所有预处理过的C代码发往标准输出设备。MakefileMakefile及及GCCGCC编译选项培训编译选项培训控制控制控制控制C C C C语言变种的开关语言变种的开关语言变种的开关语言变种的开关: : : :-ansi -std=standard -aux-info filename-fno-asm -fno-builtin -fno-builtin-function-fhosted ffreestanding-trigraphs -no-integrated-cpp -traditional -traditional-cpp-fallow-single-precision -fcon

14、d-mismatch-fsigned-bitfields -fsigned-char-funsigned-bitfields -funsigned-char-fwritable-strings MakefileMakefile及及GCCGCC编译选项培训编译选项培训- - - -ansiansiansiansi 支持所有ANSI标准的C程序。 这个开关不支持那些GNU C中与ANSI C不兼容的特性,如关键词asm,inline和typeof,以及标明所用系统类型的预定义宏,如unix和vax。它同时支持不受欢迎而且很少使用的ANSI三字母词特性,不允许“$”作为标识符的一部分,不识别C+风格

15、的“/”注释。 在使用了“-ansi”开关后,替代的关键词_asm_,_extension_,_inline_和_typeof_继续有效。替代的预定义宏_unix_和_vax_也可以继续使用,无论此开关是否使用。 -ansi 开关并不会导致非ANSI程序被无故拒绝,为此需要同时使用“-pedantic”开关。 使用了“-ansi”开关后,函数alloca,abort,exit和_exit将不是内置函数。MakefileMakefile及及GCCGCC编译选项培训编译选项培训- -fno-builtinfno-builtin 不识别不以两个下划线开头的内置函数,目前受影响的函数包括abort,a

16、bs,alloca,cos,exit,fabs,ffs,labs,memcmp,memcpy,sin,sqrt,strcmp,strcpy和strlen。 一般情况下GCC会采用特殊代码更高效地实现特定的内置函数。比如调用alloca会变成若干直接调整堆栈的单一指令,而调用memcpy 会变成直接插入的复制循环。这样产生的代码更小更快,而由于代码中没有了函数调用,无法在这些调用中设置断点,也不能通过连接不同的库来改变这些函数的功能。 -ansi 开关禁止函数alloca和ffs成为内置函数,因为它们没有ANSI标准下的意义。MakefileMakefile及及GCCGCC编译选项培训编译选项培

17、训-traditional 试图支持传统C编译器的某些特性。特别是以下几点:1.所有的extern声明都具有全局意义,即使它们是在一个函数内部进行定义的。这包括了函数的隐含声明。2.不识别较新的关键词typeof,inline,signed,const和volatile。(但你可以使用诸如_typeof_,_inline_等替换的关键词。)3.允许指针与整型的比较。4.把整型unsigned short和unsigned char转为unsigned int。5.浮点数溢出不是错误。6.被ANSI当成无效的简单预处理数的特定结构,如0xe-0xd,按表达式处理。MakefileMakefile

18、及及GCCGCC编译选项培训编译选项培训7.字符串“constants”不必为常量,被存储在可写内存,而与之相同的常量被分开存储。(与“-fwritable-strings”开关的效果相同。)8.所有没有声明register的自动变量由longjmp进行保护。一般情况下,GNU C遵从ANSI C:没有声明为volatile的自动变量可以被保护。9.字符串“x”和“a”被处理为字符“x”和“a”。不打开“-traditional”开关,“x”是表示字符的十六进制数的前缀,“a”产生一次振铃。10.在C+程序中,“-traditional”开关允许对this进行分配。(“-fthis-is-va

19、riable”也有此效果。)11.在预处理器中,注释被完全忽略。这就允许进行传统的标志连接。12.在预处理指令中,每一行必须以符号“#”开始。13.在预处理器中,宏定义里的字符串常量被识别为宏参数(当它们出现在上下文中时,虽然没有用引号括起来,其数值被字符串化)。预处理器认为字符串常量以新行为结束。MakefileMakefile及及GCCGCC编译选项培训编译选项培训14.在使用了“-traditional”开关后,预定义宏_STDC_不被定义,而_GNUC_被定义(因为_GNUC_表明的GNU扩展不受“-traditional”开关影响)。如果需要根据是否使用“-traditional”开

20、关来决定头文件的工作方式,可以通过检测这两个预定义宏来区别以下四种情况:GNU C、传统GNU C、其它ANSI C编译器和其它较早期的C编译器。 在使用了“-traditional”开关后,预定义宏_STDC_VERSION_也不被定义。15.预处理器认为字符串常量以一个新行作为结束(除非该行以“”结束)。(如果不使用“-traditional”开关,字符串常量可以包含新行的字符。) 如果在程序中使用了普通的GNU C内置函数名作其它用途,则需要在使用-traditional开关的同时使用-fno-builtin开关。 如果在程序中包含了依赖ANSI C特性的头文件,则不能使用-tradit

21、ional开关。一些销售商在提供系统时捆绑了ANSI C头文件,在这样的系统中就不可以使用-traditional开关来编译包含系统头文件的程序。MakefileMakefile及及GCCGCC编译选项培训编译选项培训要求或禁止警告开关要求或禁止警告开关 警告是用来报告非内在错误但会有风险或可能出错的调试信息。 用户可以通过使用以“-W”开头的开关来要求特定的警告,每种警告分别都有一个与之对应的“-Wno-”开头的禁止开关。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-fsyntax-only 检查代码的句法错误,不进行更深层次的检查。 -w 禁止所有的警告信息。-

22、Wcomment 在“/*”标明的注释里又出现了“/*”,或“/”标明的注释里出现了“”,则给出警告。-Wformat 检查printf和scanf等的调用,确定提供的参数类型与给出的类型说明一致。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-Wimplicit 如果函数或参数是隐含声明的,则给出警告。-Wparentheses 如果特定上下文中遗漏了括号则给出警告,比如在期望真实值的上下文里有一个赋值语句,或操作符嵌套使优先次序无法分清。 -Wunused 如果一个变量声明后没有使用,一个函数声明为静态但没有被定义,一个标号被声明而没有使用,一个语句计算出的结果没

23、有被使用,则给出警告。 要禁止对一个表达式产生此警告,简单地把该表达式转换为void。对不使用的变量和参数,使用“unused”属性。-Wall 前述“-W”开关的组合。MakefileMakefile及及GCCGCC编译选项培训编译选项培训 此后的“-W. ”开关没有隐含在“-Wall”里,因为这些警告所对应的结构在某些情况下出现在程序里是合理的。-W 打印下列事件的额外信息:1.一个非易变的变量可能被一个longjmp调用改变。这一警告只可能在优化编译中出现。编译器只能了解setjmp调用,无法了解longjmp调用的地点,而事实上信号处理程序可以在代码的任意位置调用它。因此,在实际上lo

24、ngjmp不会出现在引起问题的位置时依然可能产生一个警告。2.一个函数可以返回值,也可以不返回值时。3.一个表达式语句或一个表达式逗号的左边没有副作用。4.一个无符号数用或=与零进行比较。5.一个类似x = y = z的比较出现;这等效与(x = y ? 1 : 0) = z,与普通的数学表示解释不同。6.类存储标识如static出现在声明的非起始位置。按照C标准,这种用法正逐渐被废弃。7.如果开关-Wall或-Wunused也被使用,则对未使用的参数发出警告。8.一个集合体有部分带括号的初始化。9.一个集合体的初始化没有初始化所有成员。 MakefileMakefile及及GCCGCC编译选

25、项培训编译选项培训-Wtraditional 对传统C和ANSI C不一致的特定结构给出警告:1.在宏体内的字符串常量里出现宏参数。在传统C里这会替换参数,在ANSI C中它是常量的一部分。2.一个函数在一段代码中声明为外部的,随后在该段结束后被使用。3.switch语句中存在long类型的操作数。-Wshadow 在一个局部变量覆盖了另一个局部变量时给出警告。-Wbad-function-cast 对函数调用转换为不匹配的类型给出警告。-Wcast-qual 当一个指针类型转换会除去目标类型的类型限制时给出警告。如const char *被转换为普通的char *则给出警告。Makefile

26、Makefile及及GCCGCC编译选项培训编译选项培训-Wcast-align当一个指针类型转换会使目标的字节对齐要求增加时给出警告。比如在整型只能以两字节或四字节边界进行访问的机器上将char *转换为int *则给出警告。-Wwrite-strings将字符串常量设为const char length类型,把其地址拷贝到非const char *指针就会产生警告。这一警告可以帮助我们在编译时发现试图修改字符串常量的代码,除非在声明和原型里很小心地使用const。否则,这一警告会很讨厌,所以没有在-Wall开关中包含它。-Wconversion当一个原型引起的类型转变与原型不存在时参数的类

27、型转变不一致时给出警告。其中包括定点转为浮点,或浮点转为定点,改变定点参数的宽度或符号特性,除非这种转变是缺省操作。同样,当一个负整型常量表达式被隐含地转变为无符号类型时也给出警告。例如,若x是无符号数,则赋值x = -1会产生警告。但对于(unsigned) -1这样明确的转换不产生警告。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-Waggregate-return对定义或调用的返回结构或联合的函数给出警告。(在允许返回数组的语言里依然会产生警告。)-Wstrict-prototypes如果函数在声明或定义中没有指定参数类型则给出警告。(早期风格的函数定义是在定

28、义之前的声明中指定参数的类型,对此不产生警告。)-Wmissing-prototypes如果在全局函数定义之前没有原型声明则给出警告。即使在函数定义本身提供了原型,依然会产生警告。这一警告的目的是检查没有在头文件中声明的全局函数。-Wmissing-declarations如果在全局函数定义之前没有声明则给出警告。即使在函数定义本身提供了原型,依然会产生警告。这一警告的目的是检查没有在头文件中声明的全局函数。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-Wredundant-decls 如果在相同环境下出现了多于一次的声明,则给出警告,即使多个声明是合法的而且没有任

29、何改变。-Wnested-externs 如果在一个函数的内部出现了“extern”声明,则给出警告。-Winline 如果一个函数不能内嵌却被声明为内嵌的,或使用了“-finline-functions”开关,则给出警告。-Wold-style-cast 在程序中使用了早期风格(C风格)的类型转换则给出警告。-Werror 使所有的Warning报告为Error。MakefileMakefile及及GCCGCC编译选项培训编译选项培训GNU CC调试开关调试开关 -g用操作系统的格式(stabs, COFF, XCOFF, or DWARF)生成调试信息。GDB可以利用这些调试信息进行调试。

30、在大多数采用stabs格式的系统里,-g会生成只有GDB能使用的额外信息。与其它大多数C编译器不同,GNU CC允许开关-g与-O同时使用。优化代码采用的简捷方式可能会产生令人惊异的结果:一些声明了的变量可能根本不出现;控制流可能短暂地移动到你想不到的地方;一些语句因为其结果是常数或值已存在而不被执行;一些语句会被移到循环体外执行。无论如何这使对优化后的代码进行调试成为可能,从而可以使用优化程序处理带有BUG的程序。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-glevel要求产生调试信息,并使用level来限度信息的多少。缺省的level为2。level为1生成最

31、少量的信息,足以回溯到没有计划调试的程序部分。其中包括函数说明和外部变量,但没有局部变量信息与行号。level为3包含额外信息,如程序中出现的所有宏定义,有些调试器在使用“-g3”开关后支持宏扩展。-Q使编译器打印出编译的每一个函数名,并在编译结束后打印每一遍的若干统计信息。-save-temps 把通常的临时中间文件永久保存起来,放置在当前目录下,并根据源文件名进行命名。这样,用开关-c -save-temps编译foo.c会生成文件foo.i、foo.s以及foo.o。MakefileMakefile及及GCCGCC编译选项培训编译选项培训控制优化的开关控制优化的开关-O/O1 优化。优化

32、编译会花更长的时间,对大的函数需要更多的内存。 不使用-O开关,编译器的目标是减少编译开销,进行调试以产生期望的结果。语句是独立的:如果在语句间用断点暂停程序,你可以给任意变量重新赋值,或把程序计数器改到函数的其它语句,最后得到的结果与源代码产生的结果还是一样的。 不使用“-O”开关,编译器只把声明为“register”的变量分配到寄存器。这样编译的目标代码比PCC不使用“-O”开关编译产生的代码还差一些。 使用-O开关,编译器力图减少代码大小和运行时间。 在使用-O开关后,编译器在所有机器上打开-fthread-jumps和-fdefer-pop开关。在有延迟时隙的机器上,编译器打开-fde

33、layed-branch开关,在支持调试的机器上即使没有帧指针也打开-fomit-frame-pointer开关。在某些机器上编译器还会打开其它的开关。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-O2进一步优化。GNU CC进行几乎所有支持的优化,但不进行空间速度平衡。编译器在使用-O2开关时不进行循环展开或函数内嵌。与开关-O相比,这一开关既增加了编译时间,又提高了生成代码的性能。-O2开关打开了除循环展开或函数内嵌之外的所有优化开关。也在所有机器上打开-fforce-mem开关,在不干扰调试的机器上消除帧指针。-O3更进一步优化。-O3开关打开所有-O2开关指

34、定的优化项,并打开inline-functions开关。-O0不进行优化。-Os为大小进行优化。-Os开关打开所有-O2开关指定的不显著增加代码大小的优化项,同时还进行针对减少代码量的进一步优化。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-fforce-mem 强迫内存操作数在进行算术运算前拷贝到寄存器中。这可以通过使所有内存参考成为潜在的通用子表达式而产生更好的代码。在它们不是通用子表达式时,指令组合可以消除寄存器负载的分隔。-O2开关打开这一开关。-fforce-addr 强迫内存地址常量在进行算术运算前拷贝到寄存器中。这同 “-fforce-mem”开关类似

35、会产生更好的代码。-fno-inline 忽略关键词“inline”。一般用此开关禁止编译器把函数扩展为内嵌函数。注意:如果不使用优化,函数不会被扩展为内嵌函数。-finline-functions 把所有简单的函数集成到它们的调用者里。编译器试探性地决定哪个函数简单到可以采用此法集成。-fkeep-inline-functions 即使对一个指定函数的所有调用都被集成,而且此函数被声明为static,仍然产生独立的该函数运行时可调用版本。MakefileMakefile及及GCCGCC编译选项培训编译选项培训 后面的开关控制特别的优化方式。-O2开关会打开其中除了-funroll-loops

36、和-funroll-all-loops之外的所有开关。在大多数机器上,-O开关会打开-fthread-jumps和-fdelayed-branch开关,但不同的机器对此的处理方法不同。 在期望进行“fine-tuning”优化时很少使用以下开关。-fstrength-reduce进行减少循环强度和消除叠代变量的优化。-fthread-jumps检查是否找到一个跳转的分支,其目的地所在的另一个比较已经被第一个比较包括在内,对此进行优化。如果找到,则依据条件是否已知为真或假,将第一个分支重定向到第二个分支的目的地,或紧跟其后的一点。-fcse-follow-jumps在通常消除子表达式的过程中,扫

37、描跳转指令中无法由其它路径到达的跳转目标。例如,当CSE遇到一个带有else从句的if语句,CSE会按测试条件为假进行跳转。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-fcse-skip-blocks同-fcse-follow-jumps开关类似,但使CSE进行有条件地跳过程序块的跳转。当CSE遇到不带从句的if语句时,-fcse-skip-blocks开关使CSE采用越过if体的跳转。-frerun-cse-after-loop在进行完循环优化后再进行一次普通子表达式的消除。-frerun-loop-opt运行两次循环优化。-fgcse进行一次全局普通子表达式的

38、消除。 这一次还对全局常量和拷贝传递进行优化。-fexpensive-optimizations进行一些代价较高的次要优化。-foptimize-register-moves/-fregmove试图为移动指令重新分配寄存器的数目,或重新分配寄存器作为其它简单指令的操作数,以最大化绑定的寄存器数量。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-fdelayed-branch如果目标机器支持,试图重新安排指令的次序以利用延迟分支指令后的指令间隙。-fschedule-insns如果目标机器支持,试图重新安排指令的次序以消除由于需要的数据未准备好引起的执行延迟。-fsch

39、edule-insns2同-fschedule-insns开关类似,但要求在寄存器分配后进行一次附加的指令调度。这对寄存器数目相对较少,而内存载入指令需要多于一个机器周期的机器特别有用。-ffunction-sections如果目标机器支持任意段,则在输出文件中把每一个函数放置在其自己的段内。输出文件中由函数名决定段名。只有在会带来显著效益的情况下才使用此开关。使用此开关后,汇编程序和连接程序会创建更大的对象和可执行文件,编译得更慢。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-fcaller-saves允许值分配在会被函数调用改变的寄存器里,产生额外的指令在调用处

40、保存和恢复寄存器。只有在会产生更好的代码情况下进行这种分配。-funroll-loops进行循环体展开优化。只有在编译或运行时重复次数可以确定的循环能这样做。隐含-fstrength-reduce/-frerun-cse-after-loop开关。-funroll-all-loops进行循环体展开优化。对所有的循环这样做,常常使程序运行得更慢。 隐含-fstrength-reduce/-frerun-cse-after-loop开关。 -fmove-all-movables强制所有循环体内的变量计算移到循环体外。-freduce-all-givs强制循环体内的所有普通前言变量降低强度。Make

41、fileMakefile及及GCCGCC编译选项培训编译选项培训-fno-peephole禁止任何由机器指定的窥孔优化。-fbranch-probabilities在运行使用-fprofile-arcs开关编译的程序后,可以使用-fbranch-probabilities开关再进行一次编译,以改进基于猜测分支路径的优化。使用-fbranch-probabilities开关,GCC在每一个基本块的第一条指令上加上REG_EXEC_COUNT标注,在每一个JUMP_INSN和CALL_INSN上加上REG_BR_PROB标注。这些可以用来改进优化。目前,它们只用于一个地方:reorg.c,不用猜测

42、哪一个分支路径更常用,通过REG_BR_PROB的值准确得到哪一个分支路径更常用。-fstrict-aliasing允许编译器假定被编译语言采用最严格的别名规则。对C(和C+),这个开关激活了基于表达式类型的优化。特别是,一个类型的对象不会与另一个不同类型的对象存在同一个地址,除非类型几乎一样。MakefileMakefile及及GCCGCC编译选项培训编译选项培训控制预处理器的开关控制预处理器的开关-include FILE在处理正常输入文件前先处理FILE。事实上FILE的内容首先被编译。无论书写的次序如何,-D和-U开关都在-include FILE之前进行处理。而-include和-i

43、macros开关总是按其出现的次序进行处理。-imacros FILE在处理正常输入文件前按输入文件处理FILE,丢弃处理后的输出。由于FILE产生的输出被丢弃,-imacros FILE开关的唯一效果就是使FILE中定义的宏可以被正常的输入文件所使用。无论书写的次序如何,-D和-U开关都在-imacros FILE之前进行处理。而-include和-imacros开关总是按其出现的次序进行处理。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-idirafter DIR把目录DIR加到第二个包含的路径。在主包含路径(由-I开关加入)下的目录里没找到头文件,则搜索第二个

44、包含的路径中的目录。-DMACRO定义宏MACRO为字符串1。-DMACRO=DEFN定义宏MACRO为DEFN。 命令行中所有的-D开关都在-U之前进行处理。-UMACRO取消宏MACRO的定义。-U开关在所有的-D开关之后进行处理,但在-include和-imacros开关之前进行处理。MakefileMakefile及及GCCGCC编译选项培训编译选项培训连接开关连接开关-lLIBRARY 在连接时查找文件名为libLIBRARY.a的库文件。 在命令中使用此开关的位置会对结果产生影响,因为连接程序会按指定的次序搜索处理库文件与目标文件。 -s 从可执行文件中除去所有的符号表和重定位信息

45、。 MakefileMakefile及及GCCGCC编译选项培训编译选项培训查找目录开关查找目录开关 这些开关用于指定查找头文件、库文件和编译器部件的目录。-IDIR把目录DIR加在查找头文件的目录列表前面。这被用来覆盖一个系统头文件,替换为自己的版本,因为这些目录会在系统头文件目录前被查找。如果使用了多个-I开关,则按从左至右的顺序进行查找,然后才是标准的系统目录。-I-在-I-开关之前使用-I指定的目录只对#include FILE进行查找,不查找#include 。在“-I-”开关之后使用“-I”指定的目录查找所有的“#include”指令。(通常几乎所有的“-I”目录都是这样使用的。)

46、-LDIR把目录DIR加到查找“-l”的目录列表上。MakefileMakefile及及GCCGCC编译选项培训编译选项培训-BPREFIX 这个开关指定可执行文件、库文件、包含文件和编译器自己的数据文件的存放地点。 编译器驱动程序运行一个或多个子程序“cpp”、“cc1”、“as”和“ld”。尝试PREFIX作为每一个试图运行的子程序的前缀,使用和不使用“MACHINE/VERSION/”。 对每一个要运行的子程序,编译器驱动程序先尝试“-B”前缀。若没找到或没使用“-B”,则尝试两个标准前缀,“/usr/lib/gcc/”和“/usr/local/lib/gcc-lib/”。如果这样的文件

47、名都没找到,就在“PATH”环境变量指定的目录里查找未加修饰的程序名。MakefileMakefile及及GCCGCC编译选项培训编译选项培训产品编译选项示例产品编译选项示例ccppc -Bd:Tornado/host/x86-win32/lib/gcc-lib/ -I./././src/xxxx1-I./././src/xxxx2 -I./././Work/xxxx3-nostdinc -O2 -fvolatile -fno-builtin -fno-for-scope-Wall -I/h -I. -Id:Tornadotargetconfigall -Id:Tornadotarget/h

48、-DCPU=PPCEC603 -x c -freg-struct-return -DVOS_OS_VER=3 -DVOS_HARDWARE_PLATFORM=2 -DVOS_CPU_TYPE=6-I./././DOPRA/TARGET/config -I./././DOPRA/TARGET/include-msoft-float -DRELEASE_VERSION=1 -DMD_ASX=1-imacros ./././src/include/xxxx4.h -fpack-struct -mno-strict-align-I./././src -I./././xxx5 -I./././PORT/

49、VXWORKS-c -o ./././Work/xxxx.o ./././src/xxxx.cMakefileMakefile及及GCCGCC编译选项培训编译选项培训-nostdinc不在标准系统目录下搜索头文件,只搜索用“-I”开关指定的目录(以及当前目录)。同时使用“-nostdinc”和“-I-”开关,可以把包含文件的搜索路径限定在那些明确指出的目录里。-fvolatile认为所有通过指针的内存引用都是易变的。-fno-builtin禁止编译器把函数扩展为内嵌函数。-fno-for-scope在for的初始状态声明的变量的有效范围一直延伸到该段程序结束,与老版本的gcc和其它(传统的)C

50、+实现方案一致。 -freg-struct-return 尽可能采用寄存器返回结构与联合值。对小结构而言效率比较高。 -msoft-float产生包含浮点库调用的输出。 -imacros ./././src/include/xxxx4.h只使用xxxx4.h中定义的宏-fpack-struct把所有结构成员不留空隙地压在一起。-mno-strict-align在SV.4和嵌入式PowerPC系统中假定系统会处理未进行对齐的内存引用。MakefileMakefile及及GCCGCC编译选项培训编译选项培训DOPRA编译选项示例编译选项示例VxWorks8260 (for debug)ADDED_

51、CFLAGS += -gdwarf -fno-common -x c -O0 -freg-struct-return -DVOS_OS_VER=3 -DVOS_HARDWARE_PLATFORM=2 -DVOS_CPU_TYPE=6 -DVOS_DISPATCHING_MODE=1DOPRA_PATH = -I$(DOPRA_CONFIG) -I$(DOPRA_ROOT)/include -I$(DOPRA_ROOT)/include/dopra -I$(DOPRA_ROOT)/src/ssp/tips -I$(DOPRA_ROOT)/include/db2 -I$(DOPRA_ROOT)/include/db2/kernelMakefileMakefile及及GCCGCC编译选项培训编译选项培训

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号