1 DSP编程技巧之6---揭开编译器神秘面纱之控制与语言 ... - 我是大彭的博客 - 电子技术论坛 - 广受欢迎的专业电子论坛! - 德赢Vwin官网
注册 登录
电子技术论坛 返回首页

我是大彭的个人空间 https://bbs.elecfans.com/?1408181 [收藏] [复制] [分享] [RSS]

博客

DSP编程技巧之6---揭开编译器神秘面纱之控制与语言 ...

热度 1已有 530 次阅读2014-7-24 14:43

tion: none; font-family: tahoma, Verdana, Arial, 宋体; font-size: 13.913043975830078px; line-height: 27.989131927490234px; background-color: rgb(255, 255, 255);">编译器有一些控制选项,这些选项是供我们来控制编译器的,不像前几篇文章提到的那些选项那样,是编译器用来控制编译结果的。下面我们就来看看我们可以使用的控制编译器的选项有哪些: 表1 编译器的控制选项

控制选项

别名

控制效果

--compile_only

-c

控制编译器使得它只编译,不链接。

--help

-h

输出编译器使用的优化、控制等选项信息。它的后面可以加一些更明确的选项或者名词,例如--help debug就可以输出关于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位的浮点运算被编译。目前C28xFPU不支持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

使用编译器的松弛模式。在标准ISO C模式下,大部分语法上的违规会被当作错误输出,从而使得我们的编译无法继续下去。如果我们有时需要使用这样的用法的话,就使用松弛模式,使得这些违规被作为警告信息输出,虽然有警告,但是不会妨碍程序的编译。当然我们要做的验证和确认我们的程序确实达到了我们的预期功能。

--rtti

-rtti

使用C++的运行时类型。

--static_template_instantiation

 

使用内部连接例化所有的模版。

--strict_ansi

-ps

使用严格的ANSI/ISO C/C++模式,这种模式与K&R版本的C是不兼容的。

  从表2里也可以看出,大部分特性是与C++编程息息相关的,如果仅仅使用C进行一些编程的话,对编译器的编程语言选项的使用确实要简单了不少。


路过

雷人
1

握手

鲜花

鸡蛋

刚表态过的朋友 (1 人)

返回顶部