Makefile及GCC编译选项培训.ppt
《Makefile及GCC编译选项培训.ppt》由会员分享,可在线阅读,更多相关《Makefile及GCC编译选项培训.ppt(46页珍藏版)》请在三一办公上搜索。
1、MakefileGCC编译选项培训,Makefile简介:MAKE工具是一般C编译器都提供的一个编译控制工具,它可以自动确定程序的哪些部分需要重新编译,并执行命令重新编译它们。缺省情况下,GNU make自动使用一个构造文件makefile或Makefile来了解编译和链接一个程序的规则及方法。如果用户需要指定自己的构造文件,需要使用命令:make fXXXX其中XXXX就是用户所需要指定的构造文件名称。,Makefile及GCC编译选项培训,Makefile的基本规则:简单的构造文件包含如下形式的规则:TARGET.:DEPENDENCIES.COMMAND.TARGET 一般是程序生成的文
2、件名,如可执行文件或目标文件。它也可以是某个要执行的操作的名称,比如“clean”。DEPENDENCIES 是生成目标所用的输入文件。一个目标可以依靠多个文件。COMMAND 是make要执行的操作。一条规则可以包含多个命令,一个命令占一行。注意:在每行命令前需要有一个tab字符。,Makefile及GCC编译选项培训,Makefile里的规则解释了如何以及何时重新构造作为特定规则的目标的特定文件。它也可以解释如何以及何时执行一个操作。构造文件可以包含规则以外的其它文本,但简单的构造文件只需要包含规则。如果目标是文件,那么任何一个依靠文件发生改变,它都需要重新编译或重新链接。自动生成的依靠文
3、件本身首先被更新。需要记住的是,make并不知道命令是如何工作的,它只是在目标需要更新时按照指定的规则执行命令。,Makefile及GCC编译选项培训,Makefile中变量的使用:objects=main.o kbd.o command.o display.o insert.o search.o files.o utils.oedit:$(objects)cc-o edit$(objects)用包含“+=”的一行可以为变量附加文本,如:objects=main.o foo.o bar.o utils.oobjects+=another.o等同于:objects=main.o foo.o ba
4、r.o utils.oobjects:=$(objects)another.o如果变量此前没有定义,“+=”与普通的“=”相同。但在此前有定义的情况下,“+=”按照变量初始定义的类型扩展。,Makefile及GCC编译选项培训,make使用的自动变量:$规则目标的文件名。如果目标是档案文件的一个成员,$就是档案文件的名称。$%当目标是档案文件的一个成员时,$%是该成员的名称。若目标不是档案文件的一个成员,$%为空。$第一个依靠文件的名称。$?以空格隔开的比目标新的所有依靠文件名。在依靠文件是档案文件的成员时,只使用成员的名称。$以空格隔开的所有依靠文件名。在依靠文件是档案文件的成员时,只使用成
5、员的名称。无论一个依靠文件出现过多少次,$值中只包含其名称的一个拷贝。,Makefile及GCC编译选项培训,变量使用范例:foo:foo.c-lcurses cc$-o$会解释为以下的命令cc foo.c/usr/lib/libcurses.a-o foo我们不推荐使用自动变量,虽然这样可以简化makefile的写作。参考文档,Makefile及GCC编译选项培训,GCC简介:现在多个版本的编译器(C、C+、Objective-C、Ada、Fortran 和Java)已经被集成在一起,因此我们将GCC 称为“GNU 编译器集”(GNU Compiler Collection)。GCC 是GN
6、U编译器集的常用缩写,它既是该编译器最普遍的名称,也是在强调用来编译C程序时所用的名称(以前代表“GNU C编译器”的缩写)。在特指C+编译时,该编译器常被称为“G+”。因为只存在一个编译器,所以把它称为“GCC”也是准确的。但“G+”更多地用于强调编译的是C+程序。在我们谈论Ada编译的时候,也因此常把编译器称作“GNAT”。我们用“GCC”指代整个编译系统,尤其是编译器中与编程语言无关的那部分。,Makefile及GCC编译选项培训,编译开关使用说明:运行GNU CC一般会完成预处理、编译、汇编和连接四个过程。“全局开关”允许在其中某个中间阶段停止这一过程。例如,“-c”开关就要求不进行连
7、接,这样得到的输出就是汇编程序输出的目标文件。其它开关则是传递给其中某一处理阶段的。某些开关是控制预处理器的,某些是控制编译器本身的。还有一些控制汇编程序和连接程序的开关,很少会被使用到。,Makefile及GCC编译选项培训,全局开关:编译涉及的四个阶段依次为:预处理、完全编译、汇编和链接。前三个阶段应用于一个单独的源文件,最后生成一个目标文件;连接把所有目标文件(新编译的以及在输入里指定的那些文件)结合成一个可执行文件。对于给定的输入,编译器可以根据文件名的后缀决定进行哪一种编译;但我们希望使用时通过选项“-x”明确指定编程语言。以下为GCC支持的全局开关:-c-S-E-o file-pi
8、pe-pass-exit-codes-x language-v-#-help-target-help-version,Makefile及GCC编译选项培训,-x language 明确指定后面输入文件的语言为language(而不是让编译器根据文件名后缀选择一个缺省值)。此选项影响后面的所有输入文件,一直到下一个 x 选项。language可取的值为:c c-header cpp-output c+c+-cpp-output objective-c objc-cpp-output assembler assembler-with-cpp ada f77 f77-cpp-input ratfor
9、 java,Makefile及GCC编译选项培训,-c 编译汇编源文件,不进行连接。最后的输出是为每一个源文件生成一个目标文件。缺省情况下,生成的目标文件名是将源文件名的后缀“.c”、“.i”、“.s”等替换为后缀“.o”。忽略不可识别的输入文件,不对其进行编译或汇编。,Makefile及GCC编译选项培训,-S 在完全编译后结束,不进行汇编处理。输出的是每一个非汇编输入文件相应的汇编码格式文件。缺省情况下,生成的汇编文件名是将源文件名的后缀“.c”、“.i”等替换为后缀“.s”。忽略不需要进行编译的输入文件。,Makefile及GCC编译选项培训,-o file 将输出保存在文件file里,
10、无论输出是何种格式,可执行文件、目标文件、汇编文件或预处理过的C代码。由于只能指定一个输出文件,所以在编译多于一个输入文件时使用-o选项没有意义,除非输出是生成一个可执行文件。如果没有使用-o选项,则在缺省情况下,可执行文件保存为a.out,source.suffix的目标文件保存为source.o,其汇编码文件保存为source.s,所有预处理过的C代码发往标准输出设备。,Makefile及GCC编译选项培训,控制C语言变种的开关:-ansi-std=standard-aux-info filename-fno-asm-fno-builtin-fno-builtin-function-fho
11、sted 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编译选项培训,-ansi 支持所有ANSI标准的C程序。这个开关不支持那些GNU C中与ANSI C不兼容的特性,如关键词asm,inline和typeof,以及标明所用系统类型的
12、预定义宏,如unix和vax。它同时支持不受欢迎而且很少使用的ANSI三字母词特性,不允许“$”作为标识符的一部分,不识别C+风格的“/”注释。在使用了“-ansi”开关后,替代的关键词_asm_,_extension_,_inline_和_typeof_继续有效。替代的预定义宏_unix_和_vax_也可以继续使用,无论此开关是否使用。-ansi 开关并不会导致非ANSI程序被无故拒绝,为此需要同时使用“-pedantic”开关。使用了“-ansi”开关后,函数alloca,abort,exit和_exit将不是内置函数。,Makefile及GCC编译选项培训,-fno-builtin 不识
13、别不以两个下划线开头的内置函数,目前受影响的函数包括abort,abs,alloca,cos,exit,fabs,ffs,labs,memcmp,memcpy,sin,sqrt,strcmp,strcpy和strlen。一般情况下GCC会采用特殊代码更高效地实现特定的内置函数。比如调用alloca会变成若干直接调整堆栈的单一指令,而调用memcpy 会变成直接插入的复制循环。这样产生的代码更小更快,而由于代码中没有了函数调用,无法在这些调用中设置断点,也不能通过连接不同的库来改变这些函数的功能。-ansi 开关禁止函数alloca和ffs成为内置函数,因为它们没有ANSI标准下的意义。,Mak
14、efile及GCC编译选项培训,-traditional 试图支持传统C编译器的某些特性。特别是以下几点:所有的extern声明都具有全局意义,即使它们是在一个函数内部进行定义的。这包括了函数的隐含声明。不识别较新的关键词typeof,inline,signed,const和volatile。(但你可以使用诸如_typeof_,_inline_等替换的关键词。)允许指针与整型的比较。把整型unsigned short和unsigned char转为unsigned int。浮点数溢出不是错误。被ANSI当成无效的简单预处理数的特定结构,如0 xe-0 xd,按表达式处理。,Makefile及G
15、CC编译选项培训,字符串“constants”不必为常量,被存储在可写内存,而与之相同的常量被分开存储。(与“-fwritable-strings”开关的效果相同。)所有没有声明register的自动变量由longjmp进行保护。一般情况下,GNU C遵从ANSI C:没有声明为volatile的自动变量可以被保护。字符串“x”和“a”被处理为字符“x”和“a”。不打开“-traditional”开关,“x”是表示字符的十六进制数的前缀,“a”产生一次振铃。在C+程序中,“-traditional”开关允许对this进行分配。(“-fthis-is-variable”也有此效果。)在预处理器中
16、,注释被完全忽略。这就允许进行传统的标志连接。在预处理指令中,每一行必须以符号“#”开始。在预处理器中,宏定义里的字符串常量被识别为宏参数(当它们出现在上下文中时,虽然没有用引号括起来,其数值被字符串化)。预处理器认为字符串常量以新行为结束。,Makefile及GCC编译选项培训,在使用了“-traditional”开关后,预定义宏_STDC_不被定义,而_GNUC_被定义(因为_GNUC_表明的GNU扩展不受“-traditional”开关影响)。如果需要根据是否使用“-traditional”开关来决定头文件的工作方式,可以通过检测这两个预定义宏来区别以下四种情况:GNU C、传统GNU
17、C、其它ANSI C编译器和其它较早期的C编译器。在使用了“-traditional”开关后,预定义宏_STDC_VERSION_也不被定义。预处理器认为字符串常量以一个新行作为结束(除非该行以“”结束)。(如果不使用“-traditional”开关,字符串常量可以包含新行的字符。)如果在程序中使用了普通的GNU C内置函数名作其它用途,则需要在使用-traditional开关的同时使用-fno-builtin开关。如果在程序中包含了依赖ANSI C特性的头文件,则不能使用-traditional开关。一些销售商在提供系统时捆绑了ANSI C头文件,在这样的系统中就不可以使用-traditio
18、nal开关来编译包含系统头文件的程序。,Makefile及GCC编译选项培训,要求或禁止警告开关 警告是用来报告非内在错误但会有风险或可能出错的调试信息。用户可以通过使用以“-W”开头的开关来要求特定的警告,每种警告分别都有一个与之对应的“-Wno-”开头的禁止开关。,Makefile及GCC编译选项培训,-fsyntax-only 检查代码的句法错误,不进行更深层次的检查。-w 禁止所有的警告信息。-Wcomment 在“/*”标明的注释里又出现了“/*”,或“/”标明的注释里出现了“”,则给出警告。-Wformat 检查printf和scanf等的调用,确定提供的参数类型与给出的类型说明一
19、致。,Makefile及GCC编译选项培训,-Wimplicit 如果函数或参数是隐含声明的,则给出警告。-Wparentheses 如果特定上下文中遗漏了括号则给出警告,比如在期望真实值的上下文里有一个赋值语句,或操作符嵌套使优先次序无法分清。-Wunused 如果一个变量声明后没有使用,一个函数声明为静态但没有被定义,一个标号被声明而没有使用,一个语句计算出的结果没有被使用,则给出警告。要禁止对一个表达式产生此警告,简单地把该表达式转换为void。对不使用的变量和参数,使用“unused”属性。-Wall 前述“-W”开关的组合。,Makefile及GCC编译选项培训,此后的“-W.”开关
20、没有隐含在“-Wall”里,因为这些警告所对应的结构在某些情况下出现在程序里是合理的。-W 打印下列事件的额外信息:一个非易变的变量可能被一个longjmp调用改变。这一警告只可能在优化编译中出现。编译器只能了解setjmp调用,无法了解longjmp调用的地点,而事实上信号处理程序可以在代码的任意位置调用它。因此,在实际上longjmp不会出现在引起问题的位置时依然可能产生一个警告。一个函数可以返回值,也可以不返回值时。一个表达式语句或一个表达式逗号的左边没有副作用。一个无符号数用或=与零进行比较。一个类似x=y=z的比较出现;这等效与(x=y?1:0)=z,与普通的数学表示解释不同。类存储
21、标识如static出现在声明的非起始位置。按照C标准,这种用法正逐渐被废弃。如果开关-Wall或-Wunused也被使用,则对未使用的参数发出警告。一个集合体有部分带括号的初始化。一个集合体的初始化没有初始化所有成员。,Makefile及GCC编译选项培训,-Wtraditional 对传统C和ANSI C不一致的特定结构给出警告:在宏体内的字符串常量里出现宏参数。在传统C里这会替换参数,在ANSI C中它是常量的一部分。一个函数在一段代码中声明为外部的,随后在该段结束后被使用。switch语句中存在long类型的操作数。-Wshadow 在一个局部变量覆盖了另一个局部变量时给出警告。-Wba
22、d-function-cast 对函数调用转换为不匹配的类型给出警告。-Wcast-qual 当一个指针类型转换会除去目标类型的类型限制时给出警告。如const char*被转换为普通的char*则给出警告。,Makefile及GCC编译选项培训,-Wcast-align当一个指针类型转换会使目标的字节对齐要求增加时给出警告。比如在整型只能以两字节或四字节边界进行访问的机器上将char*转换为int*则给出警告。-Wwrite-strings将字符串常量设为const char length类型,把其地址拷贝到非const char*指针就会产生警告。这一警告可以帮助我们在编译时发现试图修改字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Makefile GCC 编译 选项 培训

链接地址:https://www.31ppt.com/p-2295303.html