推荐的 GCC 版本构建标志

Yas*_*smi 5 c++ gcc

我为我的 C++ 项目使用自定义 make 文件。我正在为发布版本寻找最推荐的编译标志。我目前正在使用以下内容:

CXXFLAGS += -O3 -Wall -DNDEBUG

我认为以上内容就足够了,但后来我尝试在二进制文件上运行“strip”工具,它大大缩小了大小。看起来二进制文件中仍然有一些非必要的东西。

我知道这是一个广泛的主题,但我正在寻找优化(速度和大小)发布版本的通用设置。我知道默认情况下 gcc 甚至不会丢弃死代码——我想尽快弄清楚如何做到这一点。

作为参考,我的 make 设置是https://github.com/YasserAsmi/buildmk

Mat*_*son 4

是的,例如,链接后剥离将删除 C++ 库中包含的全局符号。您可以g++使用-s选项来做到这一点。它确实可以在客户站点调试应用程序(例如,告诉客户运行gdb myprog然后执行bt在崩溃时执行)不会给您任何符号 \xe2\x86\x92 更难找出代码在哪里,除非你有一个相同的带有符号的二进制文件(或者可以重现一个),并且你可以在其中找到符号(或者你可以重现问题,但这很多时候都是一厢情愿的想法))。

\n

如果你想要小的代码,你也可以使用 -Os不是 -O3\xe2\x80\x94 这将使编译器生成优化的代码,但不会进行使代码更大的优化(因此仅内联微小函数,而不是展开循环, ETC。)。在某些情况下,小型代码实际上比“较高优化”级别但较大的代码运行得更快,因为在许多地方调用的中等大小的函数被保留为单个函数,位于缓存中,而不是被内联并膨胀应用。

\n

不幸的是,通常很难确定任何特定选项对可执行文件的大小有什么影响 - 在某些情况下,内联会使代码更小,而在其他情况下它会使代码更长。展开计数为 2 的循环比在循环中执行相同的操作会缩短代码,等等。如果您想要快速且小的代码,您将不得不摆弄设置并查看哪些设置对您有什么影响代码。确保跟踪每个选项所带来的效果。这里列出了很多不同的优化选项(适用于 4.9.1,您也可以在 GCC 网站上找到旧手册的在线版本)。

\n