完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
编译器有一些控制选项,这些选项是供我们来控制编译器的,不像前几篇文章提到的那些选项那样,是编译器用来控制编译结果的。下面我们就来看看我们可以使用的控制编译器的选项有哪些:
表1 编译器的控制选项 [tr][td]控制选项[/td][td]别名 [/td][td]控制效果 [/td][/tr][tr][td]--compile_only[/td][td]-c [/td][td]控制编译器使得它只编译,不链接。 [/td][/tr][tr][td]--help[/td][td]-h [/td][td]输出编译器使用的优化、控制等选项信息。它的后面可以加一些更明确的选项或者名词,例如--help debug就可以输出关于debug的选项的信息。 [/td][/tr][tr][td]--run_linker[/td][td]-z [/td][td]使能编译之后的链接功能,与第一行的-c相对。-c与-z同时存在时,-c起作用,-z不起作用。 [/td][/tr][tr][td]--skip_assembler[/td][td]-n [/td][td]只编译,但是也不产生汇编文件。这样做的目的主要是为了快速验证程序有没有基本的语法错误等。-n选项和-z同时存在的时候,-n起作用,-z不起作用。从流程上讲不难理解,汇编等工作不完成,链接器没有工作目标也没法完成链接。 [/td][/tr][/table] 就编译器本身来说,它只要读取C、C++、汇编等文件进行处理就完成任务了,所以编译器的控制选项并不多,一般情况下一个-z选项就足够我们完成从编译程序到生成目标的编译器控制效果了。相比较而言,C、C++这些语言本身就复杂的多了,并且因为有很多个版本的存在,难免有一些小混乱的存在,所以编译器里与编程语言本身相关的选项就显得特别多,以便我们来对语言的特性等进行正确使用,下面就看看编译器里与编程语言有关的选项: 表2 编译器的编程语言选项 [tr][td]语言选项[/td][td]别名 [/td][td]控制效果 [/td][/tr][tr][td]--cpp_default[/td][td]-fg [/td][td]通知编译器把所有的.c文件也当作C++源程序看待。如果不使用这个默认选项的话,也可以分别指定不同后缀名的文件,例如--asm_file=filename,--c_file=filename,-cpp_file=filename,--obj_file=filename。举例说明,现在我们有个文件叫file.s,那么使用--c_file=file.s的话能使得编译器按照处理C文件的方式处理file.s。 [/td][/tr][tr][td]--embedded_cpp[/td][td]-pe [/td][td]使能嵌入式的C++模式。嵌入式C++是标准的C++的一个子集,由NEC, Hitachi, Fujitsu,以及 Toshiba等几个公司在十几年前制定,移除了模版、异常处理、运行时类型、新式C++转型、可变关键字、多重继承、虚拟继承等C++特性。 [/td][/tr][tr][td]--exceptions[/td][td] [/td][td]使能标准C++语言中的异常处理。默认情况下编译器是不使能C++的异常处理的,如果启用了这个选项的话,则所有的C++源程序都在启用了异常处理的情况下进行编译。 [/td][/tr][tr][td]--float_operations_allowed[/td][td] [/td][td]限制浮点类型的操作,包括完全禁止、允许32位浮点类型运行、允许64位浮点类型运行和同时允许32位与64位的浮点运算被编译。目前C28x的FPU不支持64位浮点的硬件运算,如果非要使用的话,需要编译器调用相关的算法库在编译时进行支持,效率不高。[/td][/tr][tr][td]={none|all|32|64}[/td][/tr][tr][td]--gcc[/td][td] [/td][td]GCC提供了在标准C/C++里面没有的一些特性,在嵌入式系统的开发中应用比较广泛,所以编译器也提供了对它的支持。关于GCC的特点,可以参考http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/C-Extensions.html#C-Extensions [/td][/tr][tr][td]--gen_acp_raw[/td][td]-pl[/td][td]使 用这个选项可以使得编译器在编译时输出原始列表文件,从而更好地帮助我们理解编译的过程。这个原始列表文件里面包含了源程序里的行信息、头文件的切入和切 出信息、诊断信息、交叉编译时预处理的源文件中相关语句的信息等。这个文件的内容比较详细,有兴趣的网友可以启用这个选项之后编译看看。它包含了一些标识 符,以帮助我们更快定位和理解相关的信息,包括: [/td][/tr][tr][td]N:对应的源程序的行数 [/td][/tr][tr][td]X:源程序中的扩展行数,交叉编译时会遇到。 [/td][/tr][tr][td]S:跳过的行数,例如使用#if这样的预编译指令时,判断条件为假对应的不会被编译的行。 [/td][/tr][tr][td]L:源程序中跳转对应的行数,例如调用一个头文件中定义的函数,或者从头文件中的函数定义返回。 [/td][/tr][tr][td]E:错误 [/td][/tr][tr][td]F:关键错误 [/td][/tr][tr][td]R:提醒 [/td][/tr][tr][td]W:警告 [/td][/tr][tr][td]--gen_acp_xref[/td][td]-px [/td][td]输出交叉参考的信息列表,包括文件名、行数、列数,交叉引用产生的声明、修改、调用等信息。 [/td][/tr][tr][td]--keep_unneeded_statics[/td][td] [/td][td]保留定义了但是违背使用的静态变量,例如这些变量是我们出于调试目的设置的,所以不希望被编译器给清除掉。这个选项不能阻止编译器删除未被使用的静态函数。 [/td][/tr][tr][td]--kr_compatible[/td][td]-pk [/td][td]保持与K&R版本C语言的兼容性,只能作用于C程序上,对C++程序无效。 [/td][/tr][tr][td]--multibyte_chars[/td][td]-pc [/td][td]允许在注释、字符串常量和字符常量中使用多字节字符。多字节字符和Unicode是相对的,Unicode字符都使用两个字节编码的编码模,多字节字符则是可变的。这个选项有时候是直观的,例如用英语以外的其它语言编写的注释,再打开的时候在CCS里面可能就全变成?????这样的了。 [/td][/tr][tr][td]--no_inlining[/td][td]-pi [/td][td]禁止编译器对函数进行内联。但是在启用了-O3编译器优化选项的情况下,编译器仍然会执行自动内联功能。 [/td][/tr][tr][td]--no_intrinsics[/td][td]-pn [/td][td]禁止使用编译器内建的intrinsics函数。这些函数一般是汇编语言写成的,例如在C28x上调用IQMath库里的_IQMpy编程时,编程产生的汇编语言就可以直接使用内建的__qmpy32(a32, b32, q)完成对数学表的调用。 [/td][/tr][tr][td]--program_level_compile[/td][td]-pm [/td][td]启用程序级别的优化。在这种优化条件下,编译器会把所有的源程序集合到一个模块中进行编译,这样它就能清楚了解所有的代码的来龙去脉,从而更好地完成程序的优化。例如,一个有内容的函数既没有被main()函数调用,也没有被其它函数调用的话,编译器就把它优化掉了。 [/td][/tr][tr][td]--relaxed_ansi[/td][td]-pr [/td][td]使用编译器的“松弛”模式。在标准ISO C模式下,大部分语法上的违规会被当作错误输出,从而使得我们的编译无法继续下去。如果我们有时需要使用这样的用法的话,就使用松弛模式,使得这些违规被作为警告信息输出,虽然有警告,但是不会妨碍程序的编译。当然我们要做的验证和确认我们的程序确实达到了我们的预期功能。 [/td][/tr][tr][td]--rtti[/td][td]-rtti [/td][td]使用C++的运行时类型。 [/td][/tr][tr][td]--static_template_instantiation[/td][td] [/td][td]使用内部连接例化所有的模版。 [/td][/tr][tr][td]--strict_ansi[/td][td]-ps [/td][td]使用严格的ANSI/ISO C/C++模式,这种模式与K&R版本的C是不兼容的。 [/td][/tr][/table] 从表2里也可以看出,大部分特性是与C++编程息息相关的,如果仅仅使用C进行一些编程的话,对编译器的编程语言选项的使用确实要简单了不少。 |
|
|
|
只有小组成员才能发言,加入小组>>
809 浏览 0 评论
1161 浏览 1 评论
2535 浏览 5 评论
2871 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2719 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1107浏览 3评论
198浏览 2评论
464浏览 2评论
378浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
459浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 15:42 , Processed in 1.381873 second(s), Total 47, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号