编译器有一些控制选项,这些选项是供我们来控制编译器的,不像前几篇文章提到的那些选项那样,是编译器用来控制编译结果的。下面我们就来看看我们可以使用的控制编译器的选项有哪些:
表1编译器的控制选项
控制选项
别名
控制效果
--compile_only
-c
控制编译器使得它只编译,不链接。
--help
-h
输出编译器使用的优化、控制等选项信息。它的后面可以加一些更明确的选项或者名词,例如--helpdebug就可以输出关于debug的选项的信息。
--run_linker
-z
使能编译之后的链接功能,与第一行的-c相对。-c与-z同时存在时,-c起作用,-z不起作用。
--skip_assembler
-n
只编译,但是也不产生汇编文件。这样做的目的主要是为了快速验证程序有没有基本的语法错误等。-n选项和-z同时存在的时候,-n起作用,-z不起作用。从流程上讲不难理解,汇编等工作不完成,链接器没有工作目标也没法完成链接。
就编译器本身来说,它只要读取C、C++、汇编等文件进行处理就完成任务了,所以编译器的控制选项并不多,一般情况下一个-z选项就足够我们完成从编译程序到生成目标的编译器控制效果了。相比较而言,C、C++这些语言本身就复杂的多了,并且因为有很多个版本的存在,难免有一些小混乱的存在,所以编译器里与编程语言本身相关的选项就显得特别多,以便我们来对语言的特性等进行正确使用,下面就看看编译器里与编程语言有关的选项:
表2编译器的编程语言选项
语言选项
别名
控制效果
--cpp_default
-fg
通知编译器把所有的.c文件也当作C++源程序看待。如果不使用这个默认选项的话,也可以分别指定不同后缀名的文件,例如--asm_file=filename,--c_file=filename,-cpp_file=filename,--obj_file=filename。举例说明,现在我们有个文件叫file.s,那么使用--c_file=file.s的话能使得编译器按照处理C文件的方式处理file.s。
--embedded_cpp
-pe
使能嵌入式的C++模式。嵌入式C++是标准的C++的一个子集,由NEC,Hitachi,Fujitsu,以及Toshiba等几个公司在十几年前制定,移除了模版、异常处理、运行时类型、新式C++转型、可变关键字、多重继承、虚拟继承等C++特性。
--exceptions
使能标准C++语言中的异常处理。默认情况下编译器是不使能C++的异常处理的,如果启用了这个选项的话,则所有的C++源程序都在启用了异常处理的情况下进行编译。
--float_operations_allowed
={none|all|32|64}
限制浮点类型的操作,包括完全禁止、允许32位浮点类型运行、允许64位浮点类型运行和同时允许32位与64位的浮点运算被编译。目前C28x的FPU不支持64位浮点的硬件运算,如果非要使用的话,需要编译器调用相关的算法库在编译时进行支持,效率不高。
--gcc
GCC提供了在标准C/C++里面没有的一些特性,在嵌入式系统的开发中应用比较广泛,所以编译器也提供了对它的支持。关于GCC的特点,可以参考http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Extensions.html#C-Extensions
--gen_acp_raw
-pl
使用这个选项可以使得编译器在编译时输出原始列表文件,从而更好地帮助我们理解编译的过程。这个原始列表文件里面包含了源程序里的行信息、头文件的切入和切出信息、诊断信息、交叉编译时预处理的源文件中相关语句的信息等。这个文件的内容比较详细,有兴趣的网友可以启用这个选项之后编译看看。它包含了一些标识符,以帮助我们更快定位和理解相关的信息,包括:
N:对应的源程序的行数
X:源程序中的扩展行数,交叉编译时会遇到。
S:跳过的行数,例如使用#if这样的预编译指令时,判断条件为假对应的不会被编译的行。
L:源程序中跳转对应的行数,例如调用一个头文件中定义的函数,或者从头文件中的函数定义返回。
E:错误
F:关键错误
R:提醒
W:警告
--gen_acp_xref
-px
输出交叉参考的信息列表,包括文件名、行数、列数,交叉引用产生的声明、修改、调用等信息。
--keep_unneeded_statics
保留定义了但是违背使用的静态变量,例如这些变量是我们出于调试目的设置的,所以不希望被编译器给清除掉。这个选项不能阻止编译器删除未被使用的静态函数。
--kr_compatible
-pk
保持与K&R版本C语言的兼容性,只能作用于C程序上,对C++程序无效。
--multibyte_chars
-pc
允许在注释、字符串常量和字符常量中使用多字节字符。多字节字符和Unicode是相对的,Unicode字符都使用两个字节编码的编码模,多字节字符则是可变的。这个选项有时候是直观的,例如用英语以外的其它语言编写的注释,再打开的时候在CCS里面可能就全变成?????这样的了。
--no_inlining
-pi
禁止编译器对函数进行内联。但是在启用了-O3编译器优化选项的情况下,编译器仍然会执行自动内联功能。
--no_intrinsics
-pn
禁止使用编译器内建的intrinsics函数。这些函数一般是汇编语言写成的,例如在C28x上调用IQMath库里的_IQMpy编程时,编程产生的汇编语言就可以直接使用内建的__qmpy32(a32,b32,q)完成对数学表的调用。
--program_level_compile
-pm
启用程序级别的优化。在这种优化条件下,编译器会把所有的源程序集合到一个模块中进行编译,这样它就能清楚了解所有的代码的来龙去脉,从而更好地完成程序的优化。例如,一个有内容的函数既没有被main()函数调用,也没有被其它函数调用的话,编译器就把它优化掉了。
--relaxed_ansi
-pr
使用编译器的“松弛”模式。在标准ISOC模式下,大部分语法上的违规会被当作错误输出,从而使得我们的编译无法继续下去。如果我们有时需要使用这样的用法的话,就使用松弛模式,使得这些违规被作为警告信息输出,虽然有警告,但是不会妨碍程序的编译。当然我们要做的验证和确认我们的程序确实达到了我们的预期功能。
--rtti
-rtti
使用C++的运行时类型。
--static_template_instantiation
使用内部连接例化所有的模版。
--strict_ansi
-ps
使用严格的ANSI/ISOC/C++模式,这种模式与K&R版本的C是不兼容的。
从表2里也可以看出,大部分特性是与C++编程息息相关的,如果仅仅使用C进行一些编程的话,对编译器的编程语言选项的使用确实要简单了不少。