在GCC中进行全面优化的“发布模式”中需要构建哪些具体选项?如果有多个选项,请列出所有选项。感谢。
答案 0 :(得分:20)
这是我经常使用的Makefile的一部分(在这个例子中,它正在尝试构建一个名为 foo 的程序)。
如果你像$ make BUILD=debug
或$ make debug
那样运行它
然后将使用 Debug CFLAGS。这些关闭优化(-O0
)并包括调试符号(-g
)。
如果省略这些标记(通过运行$ make
而没有任何其他参数),您将构建 Release CFLAGS版本,其中启用了优化(-O2
),调试符号被剥离(-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...
答案 1 :(得分:18)
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
没有“一刀切” - 您需要了解您的应用程序,您的要求和优化标志,以确定二进制文件的正确子集。
或者你想要的答案: -O3
答案 2 :(得分:8)
请注意,gcc没有像“MSVC”那样的“发布模式”和“调试模式”。所有代码都只是代码。存在各种优化选项(-O2和-Os是您通常需要关注的唯一选项,除非您进行非常精细的调整)修改生成的代码,但不能防止与其他ABI兼容的互操作性码。通常,您希望对要发布的内容进行优化。
“-g”选项的存在将导致扩展的符号和源代码信息被放置在生成的文件中,这对于调试很有用,但会增加文件的大小(并显示您的源代码),这是在“已发布”的二进制文件中你经常不想要的东西。
但他们不是排他性的。您可以使用优化和调试信息编译二进制文件,也可以使用两者都不编译。
答案 3 :(得分:4)
-O2将打开所有不需要空格\速度权衡的优化,并且往往是我最常使用的那种优化。 -O3为速度权衡做了一些空间(比如函数内联。)-Os O2 plus会做其他事情以减少代码大小。通过改进缓存使用,这可以使事情比O3更快。 (测试以确定它是否适合您。)请注意,有许多O开关都没有触摸的选项。它们被排除在外的原因是因为它通常取决于您正在编写的代码类型或依赖于体系结构。