本文简单介绍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
,不过要小心,这可能导致生成非常大的文件。