编译简介(四)

本文简单介绍gcc的优化(-O)和调试(-g)选项。

遥想当年,同学教我用Visual Studio,开发选Debug,发布选Release,我还不知其所以然。工作后也曾以此作为面试题目,不少同学跟我当初一样青涩,回答起来支支吾吾。

其实没有纯粹的Debug和Release,都是不同选项的组合,以达到不同的目的。

使用-g选项编译,使得我们可以在源代码级别调试编译出来的程序,这也是我们通常意义下所说的调试,如调试C/C++程序。因此,我们一定会在开发时使用-g选项。为了获得更好的调试效果,通常我们不会打开编译器优化功能,即不使用-O选项(或者使用-O0显式的关闭优化)。如

gcc -g -O0 hello.c -o hello

或者

gcc -g hello.c -o hello

然而,-g-O不是互斥的。事实上,大多数Linux发行版的程序都使用了-g选项,这意味着,尽管调试效果不好,我们能够调试已经发布的程序(当然,如果真得打算编译的话,可能还需要安装额外的源代码包和调试信息包)。比如我们也可以这样编译:

gcc -g -O2 hello.c -o hello

另外,-g-O后面都可以接一个数字,一般地讲,数字越大,能力越强。比如优化能力

-O1 < -O2 < -O3

当然特定程序可能出现-O3的优化效果不如-O2的情况。由于-O3的某些优化过于激进,可能导致生成错误的程序,因此,大多数软件在发布时使用-O2作为默认优化选项。

-g是我们绝大多数时候会使用的编译选项,如果想调试宏,需要使用-g3,不过要小心,这可能导致生成非常大的文件。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据