资源预览内容
第1页 / 共46页
第2页 / 共46页
第3页 / 共46页
第4页 / 共46页
第5页 / 共46页
第6页 / 共46页
第7页 / 共46页
第8页 / 共46页
第9页 / 共46页
第10页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
MakefileGCC编译选项培训Makefile简介:MAKE工具是一般C编译器都提供的一个编译控制工具,它可以自 动确定程序的哪些部分需要重新编译,并执行命令重新编译它们。缺省情况下,GNU make自动使用一个构造文件makefile或Makefile 来了解编译和链接一个程序的规则及方法。如果用户需要指定自己 的构造文件,需要使用命令: make fXXXX 其中XXXX就是用户所需要指定的构造文件名称。Makefile及GCC编译选项培训Makefile的基本规则:简单的构造文件包含如下形式的规则: TARGET . : DEPENDENCIES .COMMAND . . TARGET 一般是程序生成的文件名,如可执行文件或目标文件。它 也可以是某个要执行的操作的名称,比如“clean”。DEPENDENCIES 是生成目标所用的输入文件。一个目标可以依靠 多个文件。COMMAND 是make要执行的操作。一条规则可以包含多个命令, 一个命令占一行。注意:在每行命令前需要有一个tab字符。Makefile及GCC编译选项培训Makefile里的规则解释了如何以及何时重新构造作为特定规则的目 标的特定文件。它也可以解释如何以及何时执行一个操作。构造文件可以包含规则以外的其它文本,但简单的构造文件只需要 包含规则。如果目标是文件,那么任何一个依靠文件发生改变,它都需要重新 编译或重新链接。自动生成的依靠文件本身首先被更新。需要记住的是,make并不知道命令是如何工作的,它只是在目标需 要更新时按照指定的规则执行命令。Makefile及GCC编译选项培训Makefile中变量的使用:objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects)用包含“+=”的一行可以为变量附加文本,如: objects = main.o foo.o bar.o utils.o objects += another.o 等同于: objects = main.o foo.o bar.o utils.o objects := $(objects) another.o如果变量此前没有定义,“+=”与普通的“=”相同。但在此前有定 义的情况下,“+=”按照变量初始定义的类型扩展。Makefile及GCC编译选项培训make使用的自动变量:$规则目标的文件名。如果目标是档案文件的一个成员, $ 就是档案文件的名称。 $%当目标是档案文件的一个成员时,$% 是该成员的名称。若 目标不是档案文件的一个成员,$% 为空。 $Makefile及GCC编译选项培训GCC简介:现在多个版本的编译器(C、C+、Objective-C、Ada、Fortran 和Java )已经被集成在一起,因此我们将GCC 称为“GNU 编译器集 ”(GNU Compiler Collection)。GCC 是GNU编译器集的常用缩写 ,它既是该编译器最普遍的名称,也是在强调用来编译C程序时所用 的名称(以前代表“GNU C编译器”的缩写)。在特指C+编译时,该编译器常被称为“G+”。因为只存在一 个编译器,所以把它称为“GCC”也是准确的。但“G+”更多地用 于强调编译的是C+程序。 在我们谈论Ada编译的时候,也因此常把编译器称作“GNAT”。 我们用“GCC”指代整个编译系统,尤其是编译器中与编程语言 无关的那部分。Makefile及GCC编译选项培训编译开关使用说明:运行GNU CC一般会完成预处理、编译、汇编和连接四个过程。 “全局开关”允许在其中某个中间阶段停止这一过程。例如,“- c”开关就要求不进行连接,这样得到的输出就是汇编程序输出的目 标文件。其它开关则是传递给其中某一处理阶段的。某些开关是控制预 处理器的,某些是控制编译器本身的。还有一些控制汇编程序和连 接程序的开关,很少会被使用到。 Makefile及GCC编译选项培训全局开关:编译涉及的四个阶段依次为:预处理、完全编译、汇编和链接 。前三个阶段应用于一个单独的源文件,最后生成一个目标文件; 连接把所有目标文件(新编译的以及在输入里指定的那些文件)结 合成一个可执行文件。对于给定的输入,编译器可以根据文件名的后缀决定进行哪一 种编译;但我们希望使用时通过选项“-x”明确指定编程语言。以下为GCC支持的全局开关:-c -S -E -o file -pipe -pass-exit-codes -x language-v -# -help -target-help -version Makefile及GCC编译选项培训-x language明确指定后面输入文件的语言为language(而不是让编译器根 据文件名后缀选择一个缺省值)。此选项影响后面的所有输入文件 ,一直到下一个 x 选项。language可取的值为:c c-headercpp-output c+ c+-cpp-outputobjective-c objc-cpp-outputassembler assembler-with-cppada f77 f77-cpp-input ratforjavaMakefile及GCC编译选项培训-c编译汇编源文件,不进行连接。最后的输出是为每一个源文件 生成一个目标文件。缺省情况下,生成的目标文件名是将源文件名的后缀“.c”、 “.i”、“.s”等替换为后缀“.o”。忽略不可识别的输入文件,不对其进行编译或汇编。Makefile及GCC编译选项培训-S 在完全编译后结束,不进行汇编处理。输出的是每一个非汇编 输入文件相应的汇编码格式文件。缺省情况下,生成的汇编文件名是将源文件名的后缀“.c”、 “.i”等替换为后缀“.s”。忽略不需要进行编译的输入文件。Makefile及GCC编译选项培训-o file 将输出保存在文件file里,无论输出是何种格式,可执行文件 、目标文件、汇编文件或预处理过的C代码。由于只能指定一个输出文件,所以在编译多于一个输入文件时 使用-o选项没有意义,除非输出是生成一个可执行文件。如果没有使用-o选项,则在缺省情况下,可执行文件保存为 a.out,source.suffix的目标文件保存为source.o,其汇编码文件 保存为source.s,所有预处理过的C代码发往标准输出设备。Makefile及GCC编译选项培训控制控制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 -fcond-mismatch -fsigned-bitfields -fsigned-char -funsigned-bitfields -funsigned-char -fwritable-strings Makefile及GCC编译选项培训- -ansiansi支持所有ANSI标准的C程序。 这个开关不支持那些GNU C中与ANSI C 不兼容的特性,如关键词asm,inline和typeof,以及标明所用系统类型的预 定义宏,如unix和vax。它同时支持不受欢迎而且很少使用的ANSI三字母词 特性,不允许“$”作为标识符的一部分,不识别C+风格的“/”注释。在使用了“-ansi”开关后,替代的关键词_asm_,_extension_, _inline_和_typeof_继续有效。替代的预定义宏_unix_和_vax_也可 以继续使用,无论此开关是否使用。-ansi 开关并不会导致非ANSI程序被无故拒绝,为此需要同时使用“- pedantic”开关。使用了“-ansi”开关后,函数alloca,abort,exit和_exit将不是内置函数。Makefile及GCC编译选项培训- -fno-builtinfno-builtin不识别不以两个下划线开头的内置函数,目前受影响的函数包括abort ,abs,alloca,cos,exit,fabs,ffs,labs,memcmp,memcpy,sin,sqrt, strcmp,strcpy和strlen。一般情况下GCC会采用特殊代码更高效地实现特定的内置函数。比如 调用alloca会变成若干直接调整堆栈的单一指令,而调用memcpy 会变成直 接插入的复制循环。这样产生的代码更小更快,而由于代码中没有了函数 调用,无法在这些调用中设置断点,也不能通过连接不同的库来改变这些 函数的功能。-ansi 开关禁止函数alloca和ffs成为内置函数,因为它们没有ANSI标准 下的意义。Makefile及GCC编译选项培训-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“,按表达式 处理。Makefile及GCC编译选项培训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- variable”也有此效果。)11. 在预处理器中,注释被完全忽略。这就允许进行传统的标志连接。12. 在预处理指令中,每一行必须以符号“#”开始。13.在预处理器中,宏定义里的字符串常量被识别为宏参数(当它们出现在 上下文中时,虽然没有用引号括起来,其数值被字符串化)。预处理器 认为字符串常量以新行为结束。Makefile及GCC编译选项培训14. 在使用了“-traditional”开关后,预定义宏_STDC_不被定义,而 _GNUC_被定义(因为_GNUC_表明的GNU扩展不受“-traditional”开 关影响)。如果需要根据是否使用“-traditional”开关来决定头文件的工作 方式,可以通过检测这两个预定义宏来区别以下四种情况:GNU C、传 统GNU C、其它ANSI C编译器和其它较早期的C编译器。 在使用了“- traditional”开关后,预定义宏_STDC_VERSION_也不被定义。15. 预处理器认为字符串常量以一个新行作为结束(除非该行以“”结束)。 (如果不使用“-traditional”开关,字符串常量可以包含新行的字符。)如果在程序中使用了普通的GNU C内置函数名作其它用途,则需要在使 用“-traditional“开关的同时使用“-fno-builtin“开关。如果在程序中包含了
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号