首页 理论教育 嵌入式Linux编程实例:GCC编译选项分析

嵌入式Linux编程实例:GCC编译选项分析

时间:2023-10-31 理论教育 版权反馈
【摘要】:在使用GCC编译器时,必须给出一系列必要的选项和文件名。GCC有超过100个的可用选项,主要包括总体选项、告警和出错选项、优化选项、体系结构相关选项和调试选项。表5-2 GCC的总体选项由于库文件的通常路径不是在系统默认的路径下,因此,首先要使用调用路径选项来指定相关的库文件位置。图5-5 例5-3使用-pedantic告警选项的运行结果GCC通过编译选项-On来控制优化代码的生成,其中n是一个代表优化级别的整数。

嵌入式Linux编程实例:GCC编译选项分析

在使用GCC编译器时,必须给出一系列必要的选项和文件名。GCC有超过100个的可用选项,主要包括总体选项、告警和出错选项、优化选项、体系结构相关选项和调试选项。具体选项可以使用以下代码来查看。

978-7-111-33316-6-Chapter05-21.jpg

1.总体选项

GCC的总体选项见表5-2。

表5-2 GCC的总体选项

978-7-111-33316-6-Chapter05-22.jpg

由于库文件的通常路径不是在系统默认的路径下,因此,首先要使用调用路径选项来指定相关的库文件位置。

2.告警和出错选项

当GCC在编译过程中检查到错误时,它就会中止编译;但检测到警告时却能继续编译生成可执行程序,因为警告只是针对程序结构的诊断信息,它不能说明程序一定有错误,而是存在风险,或者可能存在错误。虽然GCC提供了非常丰富的警告,但前提是你已经启用了它们,否则它不会报告这些检测到的警告。GCC的警告提示选项有很多种类型,主要分为“-Wall”类和非“-Wall”类。

(1)Wall类警告提示

这类警告提示选项占了GCC警告选项的90%以上,它不仅包含打开所有警告等功能,还可以单独对常见错误分别指定警告,这些常见的警告选项见表5-3(这些选项可供读者在实际操作时查阅使用)。

表5-3 GCC的Wall类警告提示选项

978-7-111-33316-6-Chapter05-23.jpg

这些警告提示读者可以根据自己的不同情况进行相应的选择,这里最常用的是-Wall。

【例5-3】告警和出错选项的使用。

下面通过程序来使用GCC的告警和出错选项。

设计步骤

1)在Vim中创建一个新工程文件,命名为“example5_3.c”。

2)在“example5_3.c”中创建如下代码。

978-7-111-33316-6-Chapter05-24.jpg

978-7-111-33316-6-Chapter05-25.jpg

该程序存在的问题是:i的大小写不一致,x=sqrt(i+100)之后没有加分号,最后一行的}之后不需要加分号。

上面这一小段程序使用该警告提示后的结果如图5-3所示。

(2)非Wall类警告提示

最常用的非Wall类警告提示有以下两种:“-ansi”和“-pedantic”。

●-ansi:该选项强制GCC生成标准语法所要求的告警信息,尽管这并不能保证所有没有警告的程序都符合ANSIC标准,例5-3使用该选项的运行结果如图5-4所示。(www.xing528.com)

978-7-111-33316-6-Chapter05-26.jpg

图5-3 例5-3使用警告提示后的结果

978-7-111-33316-6-Chapter05-27.jpg

图5-4 例5-3使用-ansi告警选项的运行结果

●-pedantic:该选项允许发出ANSIC标准所列出的全部警告信息,同样也保证所有没有警告的程序都符合ANSIC标准。例5-3使用该选项的运行结果如图5-5所示。

3.优化选项

用GCC编译C/C++代码时,它会试着用最少的时间完成编译,并且编译后的代码易于调试。易于调试意味着编译后的代码与源代码有同样的执行顺序。编译后的代码没有经过优化。有很多选项可以告诉GCC在耗费更多编译时间和牺牲易调试性的基础上产生更小、更快的可执行文件。

978-7-111-33316-6-Chapter05-28.jpg

图5-5 例5-3使用-pedantic告警选项的运行结果

GCC通过编译选项-On来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的GCC来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。

不同的优化级别对应不用的优化处理工作。编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1。在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(ThreadJump)和延迟退栈(DeferredStackPops)两种优化。

●选项-O:对程序进行优化编译和链接。采用这个选项,整个源代码会在编译、链接过程中进行优化处理,这样产生的可执行文件的执行效率较高。但是,编译、链接的速度相对慢一些。

●选项-O2:告诉GCC除了完成所有-O1级别的优化外,同时还要进行一些额外的调整工作,如处理器指令调度等。

●选项-O3:除了完成所有-O2级别的优化外,还包括循环展开和其他一些与处理器特性相关的优化工作。

通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些都将使调试工作异常艰难。

建议在调试时最好不使用任何优化选项,只有当程序在最终发行时才考虑对其进行优化。

4.体系结构相关选项

表5-4给出了GCC体系结构相关选项。

表5-4 GCC体系结构相关选项

978-7-111-33316-6-Chapter05-29.jpg

5.调试选项

在程序开发的过程中难免会出现错误,所以需要对程序进行调试,以排除错误。如果要在编译后的程序中插入调试信息,可以使用-g或-ggdb选项。

使用-gN选项时,N可以取1、2或3。N越大,加入的调试信息就越多。使用级别1时仅生成必要的信息以创建回退和堆栈转储,不包含局部变量和与行号有关的调试信息。选项2是默认级别,调试信息会包含扩展的符号表、行号以及局部或外部变量信息。选项3除了包含选项2的全部信息外,还包含了宏定义信息。

如果所使用的调试器是GNUDebugger,即GDB,就需要使用-ggdb选项来生成额外的调试信息,以方便GDB的使用。同时,这样做也使得程序必能被其他调试器调试。-ggdb能接受的调试级别和-g选项相同,对调试输出也有同样的影响。

此外,还有-p、-pg、-save和-save-temps选项,它们将统计信息加到二进制文件中。-p选项在代码中加入prof能够读取的统计信息。-pg选项在代码中加入的符号只能被GNU的prof所解释。-a选项在代码中加入记录代码块执行次数的计数器。-save-temps选项用于保存在编译过程中生成的中间文件。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈