如何在GCC中进行优化的发布模式?

Pol*_*878 15 c c++ gcc g++

在GCC中进行全面优化的"发布模式"中需要构建哪些具体选项?如果有多个选项,请列出所有选项.谢谢.

Wer*_*sey 20

这是我经常使用的Makefile的一部分(在这个例子中,它正在尝试构建一个名为foo的程序).

如果你运行它,$ make BUILD=debug或者$ make debug 然后将使用调试 CFLAGS.这些关闭优化(-O0)并包括调试符号(-g).

如果省略这些标志(通过在$ make没有任何其他参数的情况下运行),您将构建Release CFLAGS版本,其中打开优化(-O2),调试符号stripped(-s)和断言禁用(-DNDEBUG).

正如其他人所建议的那样,您可以-O*根据您的具体需求尝试不同的设置.

ifeq ($(BUILD),debug)   
# "Debug" build - no optimization, and debugging symbols
CFLAGS += -O0 -g
else
# "Release" build - optimization, and no debug symbols
CFLAGS += -O2 -s -DNDEBUG
endif

all: foo

debug:
    make "BUILD=debug"

foo: foo.o
    # The rest of the makefile comes here...
Run Code Online (Sandbox Code Playgroud)


Jos*_*osh 19

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

没有"一刀切" - 您需要了解您的应用程序,您的要求和优化标志,以确定二进制文件的正确子集.

或者你想要的答案:-O3

  • 通常,你也希望`-DNDEBUG`去掉断言. (3认同)
  • 此外,SO的观点是出现在像Google这样的搜索引擎中,所以最好还是在这里使用它. (2认同)

And*_*oss 9

请注意,gcc没有像MSVC那样的"释放模式"和"调试模式".所有代码都只是代码.存在各种优化选项(-O2和-Os是您通常需要关注的唯一选项,除非您进行非常精细的调整)修改生成的代码,但不能防止与其他ABI兼容的互操作性码.通常,您希望对要发布的内容进行优化.

"-g"选项的存在将导致扩展的符号和源代码信息被放置在生成的文件中,这对于调试很有用,但会增加文件的大小(并显示您的源代码),这是您经常使用的不想要"已发布"的二进制文件.

但它们并不是排他性的.您可以使用优化和调试信息编译二进制文件,也可以使用两者都不编写.

  • 在相关说明中,有一些方法可以在“发布”版本中保留用于维护的调试符号。一种方法:`gcc -g source.cc -o a.out; strip a.out -o a.out.syms; 剥离 a.out`。使用 `objdump -t a.out` 来验证符号是否已实际被剥离。 (2认同)

sto*_*tal 6

-O2 将打开所有不需要空间\速度权衡的优化,并且往往是我看到最常用的优化。-O3 为速度权衡做了一些空间(如内联函数)。 -Os 做 O2 加上做其他事情来减少代码大小。通过改善缓存的使用,可以使速度比 O3 更快。(测试一下它是否适合您。)请注意,有大量 O 开关无法触及的选项。它们被排除在外的原因是因为它通常取决于您正在编写的代码类型或者非常依赖于体系结构。