我为我的C ++项目使用自定义make文件。我正在寻找发布版本最推荐的编译标志。我目前正在使用以下内容:
CXXFLAGS + = -O3 -Wall -DNDEBUG
我认为上面的内容已经足够,但后来我尝试在二进制文件上运行'strip'工具,它缩小了相当大的尺寸。看起来二进制文件中仍然存在一些非必要的内容。
我知道这是一个广泛的主题,但我正在寻找优化(速度和大小)发布版本的常用设置。我知道默认情况下gcc甚至不会丢弃死代码 - 我想知道如何尽快完成。
作为参考,我的make设置为https://github.com/YasserAsmi/buildmk
答案 0 :(得分:2)
是的,例如,链接后剥离将删除C ++库中包含的全局符号。您可以使用g++
选项获取-s
。它确实可以在客户现场调试应用程序(例如告诉客户运行gdb myprog
然后bt
当它崩溃时不会给你任何符号 - >更难找到代码的位置,除非你有一个带符号的相同二进制文件[或者可以复制一个],你可以找到符号[或者你可以重现问题,但很多时候这是一厢情愿的想法]。
如果你想要小代码,你也可以使用-Os而不是-O3 - 这将使编译器生成优化的代码,但不会进行使代码更大的优化(因此只有内联微小函数,而不是展开循环,等等)。对于某些情况,小代码实际上比“更高优化”级别运行得更快但代码更大,因为在许多地方调用的中型函数被保留为单个函数,它位于缓存中,而不是内联和膨胀应用
不幸的是,通常很难确定任何特定选项对可执行文件的大小有什么影响 - 在某些情况下,内联会产生更小的代码,而其他情况则会使代码更长。展开计数为2的循环可以缩短代码,而不是在循环中执行相同的操作等等。如果你想要快速和小代码,你将不得不摆弄setitngs,看看哪些对你的影响有什么影响码。确保跟踪每个选项的效果。有很多不同的优化选项,列出here(适用于4.9.1,您也可以在gcc网站上找到旧版手册的在线版本)。
答案 1 :(得分:1)
CXXFLAGS += -O3 -Wall -DNDEBUG
很好。假设使用NDEBUG,我从不亲自使用它。 如果您需要较小的二进制文件,请使用" -s"条带符号表,类似于条带所做的。一般来说,我不会打扰并将符号表留在那里,因为它仍然有用。