当前位置:文档之家› Makefile及GCC编译

Makefile及GCC编译


Makefile及GCC编译选项培训
-fno-builtin fno不识别不以两个下划线开头的内置函数,目前受影响的函数包括abort ,abs,alloca,cos,exit,fabs,ffs,labs,memcmp,memcpy,sin,sqrt, strcmp,strcpy和strlen。 一般情况下GCC会采用特殊代码更高效地实现特定的内置函数。比如 调用alloca会变成若干直接调整堆栈的单一指令,而调用memcpy 会变成直 接插入的复制循环。这样产生的代码更小更快,而由于代码中没有了函数 调用,无法在这些调用中设置断点,也不能通过连接不同的库来改变这些 函数的功能。 -ansi 开关禁止函数alloca和ffs成为内置函数,因为它们没有ANSI标准 下的意义。
Makefile及GCC编译选项培训
Makefile中变量的使用: 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编译选项培训
变量使用范例: 变量使用范例:
foo : foo.c -lcurses cc $^ -o $@ 会解释为以下的命令 cc foo.c /usr/lib/libcurses.a -o foo
我们不推荐使用自动变量,虽然这样可以简化makefile的写作。 我们不推荐使用自动变量,虽然这样可以简化makefile的写作。 makefile的写作
ห้องสมุดไป่ตู้
Makefile及GCC编译选项培训
-c 编译汇编源文件,不进行连接。最后的输出是为每一个源文件 生成一个目标文件。 缺省情况下,生成的目标文件名是将源文件名的后缀“.c”、 “.i”、“.s”等替换为后缀“.o”。 忽略不可识别的输入文件,不对其进行编译或汇编。
Makefile及GCC编译选项培训
Makefile及GCC编译选项培训
编译开关使用说明: 编译开关使用说明:
运行GNU CC一般会完成预处理、编译、汇编和连接四个过程。 “全局开关”允许在其中某个中间阶段停止这一过程。例如,“c”开关就要求不进行连接,这样得到的输出就是汇编程序输出的目 标文件。 其它开关则是传递给其中某一处理阶段的。某些开关是控制预 处理器的,某些是控制编译器本身的。还有一些控制汇编程序和连 接程序的开关,很少会被使用到。
Makefile及GCC编译选项培训
-x language 明确指定后面输入文件的语言为language(而不是让编译器根 据文件名后缀选择一个缺省值)。此选项影响后面的所有输入文件 ,一直到下一个 –x 选项。
language可取的值为:
cc c-header cppc++-cppcpp-output c++ c++-cpp-output objective- objc-cppobjective-c objc-cpp-output assembler-withassembler assembler-with-cpp ada f77-cppf77 f77-cpp-input ratfor java
Makefile及GCC编译选项培训
Makefile的基本规则 的基本规则: 的基本规则
简单的构造文件包含如下形式的规则: TARGET ... : DEPENDENCIES ... COMMAND ... ... TARGET 一般是程序生成的文件名,如可执行文件或目标文件。它 也可以是某个要执行的操作的名称,比如“clean”。 DEPENDENCIES 是生成目标所用的输入文件。一个目标可以依靠 多个文件。 COMMAND 是make要执行的操作。一条规则可以包含多个命令, 一个命令占一行。注意:在每行命令前需要有一个tab字符。
Makefile及GCC编译选项培训
-ansi
支持所有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将不是内置函数。
-S 在完全编译后结束,不进行汇编处理。输出的是每一个非汇编 输入文件相应的汇编码格式文件。 缺省情况下,生成的汇编文件名是将源文件名的后缀“.c”、 “.i”等替换为后缀“.s”。 忽略不需要进行编译的输入文件。
Makefile及GCC编译选项培训
-o file 将输出保存在文件file里,无论输出是何种格式,可执行文件 、目标文件、汇编文件或预处理过的C代码。 由于只能指定一个输出文件,所以在编译多于一个输入文件时 使用-o选项没有意义,除非输出是生成一个可执行文件。 如果没有使用-o选项,则在缺省情况下,可执行文件保存为 a.out, .o,其汇编码文件 a.out source.suffix的目标文件保存为source.o 保存为source.s .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
参考文档 <GNU make.htm>
Makefile及GCC编译选项培训
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编译选项培训
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-isvariable”也有此效果。) 11. 在预处理器中,注释被完全忽略。这就允许进行传统的标志连接。 12. 在预处理指令中,每一行必须以符号“#”开始。 13.在预处理器中,宏定义里的字符串常量被识别为宏参数(当它们出现在 上下文中时,虽然没有用引号括起来,其数值被字符串化)。预处理器 认为字符串常量以新行为结束。
Makefile及GCC编译选项培训
全局开关: 全局开关:
编译涉及的四个阶段依次为:预处理、完全编译、汇编和链接 。前三个阶段应用于一个单独的源文件,最后生成一个目标文件; 连接把所有目标文件(新编译的以及在输入里指定的那些文件)结 合成一个可执行文件。 对于给定的输入,编译器可以根据文件名的后缀决定进行哪一 种编译;但我们希望使用时通过选项“-x”明确指定编程语言。 以下为GCC支持的全局开关: pass-exit-c -S -E -o file -pipe -pass-exit-codes -x language --help --target target--version -v -### --help --target-help --version
相关主题