Makefile及GCC编译
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Makefile及GCC编译选项培训
Makefile的基本规则 的基本规则: 的基本规则
简单的构造文件包含如下形式的规则: TARGET ... : DEPENDENCIES ... COMMAND ... ... TARGET 一般是程序生成的文件名,如可执行文件或目标文件。它 也可以是某个要执行的操作的名称,比如“clean”。 DEPENDENCIES 是生成目标所用的输入文件。一个目标可以依靠 多个文件。 COMMAND 是make要执行的操作。一条规则可以包含多个命令, 一个命令占一行。注意:在每行命令前需要有一个tab字符。
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编译选项培训
变量使用范例: 变量使用范例:
foo : foo.c -lcurses cc $^ -o $@ 会解释为以下的命令 cc foo.c /usr/lib/libcurses.a -o foo
我们不推荐使用自动变量,虽然这样可以简化makefile的写作。 我们不推荐使用自动变量,虽然这样可以简化makefile的写作。 makefile的写作
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
Makefile GCC编译选项 培训
DOPRA MO 2004-03-26
Makefile及GCC编译选项培训
Makefile简介 简介: 简介
MAKE工具是一般C编译器都提供的一个编译控制工具, 它 可 以 自 动确定程序的哪些部分需要重新编译,并执行命令重新编译它们。 缺省情况下,GNU make自动使用一个构造文件makefile或Makefile 来了解编译和链接一个程序的规则及方法。如果用户需要指定自己 的构造文件,需要使用命令: make –fXXXX 其中XXXX就是用户所需要指定的构造文件名称。
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编译选项培训
-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编译选项培训
-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编译选项培训
-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将不是内置函数。
Makefile及GCC编译选项培训
Makefile里的规则解释了如何以及何时重新构造作为特定规则的目 标的特定文件。 它也可以解释如何以及何时执行一个操作。 构造文件可以包含规则以外的其它文本,但简单的构造文件只需要 包含规则。 如果目标是文件,那么任何一个依靠文件发生改变,它都需要重新 编译或重新链接。自动生成的依靠文件本身首先被更新。 需要记住的是,make并不知道命令是如何工作的,它只是在目标需 要更新时按照指定的规则执行命令。
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编译选项培训
控制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编译选项培训
编译开关使用说明: 编译开关使用说明:
运行GNU CC一般会完成预处理、编译、汇编和连接四个过程。 “全局开关”允许在其中某个中间阶段停止这一过程。例如,“c”开关就要求不进行连接,这样得到的输出就是汇编程序输出的目 标文件。 其它开关则是传递给其中某一处理阶段的。某些开关是控制预 处理器的,某些是控制编译器本身的。还有一些控制汇编程序和连 接程序的开关,很少会被使用到。
参考文档 <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”指代整个编译系统,尤其是编译器中与编程语言 无关的那部分。
-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”、 “.i”、“.s”等替换为后缀“.o”。 忽略不可识别的输入文件,不对其进行编译或汇编。
Makefile及GCC编译选项培训
Makefile及GCC编译选项培训
wk.baidu.com
make使用的自动变量: make使用的自动变量: 使用的自动变量
$@ $% $< $? $^ 规则目标的文件名。如果目标是档案文件的一个成员, $@ 就是档案文件的名称。 当目标是档案文件的一个成员时,$% 是该成员的名称。若 $% 目标不是档案文件的一个成员,$% 为空。 $% 第一个依靠文件的名称。 以空格隔开的比目标新的所有依靠文件名。在依靠文件是 档案文件的成员时,只使用成员的名称。 以空格隔开的所有依靠文件名。在依靠文件是档案文件的 成员时,只使用成员的名称。无论一个依靠文件出现过多 少次,$^ 值中只包含其名称的一个拷贝。 $^