如何在GCC中使用优化构建发布模式?

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

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

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

或者你想要的答案:-O3

这是我经常使用的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... 

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

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

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

-O2将打开所有不需要空间\速度权衡的优化,并且往往是我经常使用的那个。 -O3为速度权衡做了一些空间(比如函数内联。)-Os O2 plus会做其他事情以减少代码大小。 通过改进缓存使用,这可以使事情比O3更快。 (测试以确定它是否适合您。)注意,有许多O开关都没有触摸的选项。 它们被排除在外的原因是因为它通常取决于您正在编写的代码类型或依赖于体系结构。