使用g ++创建静态库的优化和标志

时间:2009-04-28 04:00:16

标签: c++ optimization g++ compiler-flags

我刚开始使用Linux上的g ++编译器,并对编译器标志有一些疑问。他们是

优化

我在g ++手册页中读到了有关优化标记-O1-O2-O3的信息。我不明白何时使用这些标志。通常你使用什么优化级别? g ++手册对-O2说明了以下内容。

  

进一步优化。 GCC几乎执行所有支持的优化,不涉及空速 - 权衡。指定-O2时,编译器不执行循环展开或函数内联。与-O相比,此选项增加了编译时间和生成代码的性能。

如果它没有进行内联和循环展开,那么如何实现所述性能,是否建议使用此选项?

静态库

如何使用g ++创建静态库?在Visual Studio中,我可以选择一个类库项目,它将被编译成“lib”文件。 g ++中的等价物是什么?

5 个答案:

答案 0 :(得分:41)

经验法则:

需要调试时,请使用-O0(和-g生成调试符号。)

准备发货时,请使用-O2。

使用gentoo时,请使用-O3 ...!

当您需要将其放在嵌入式系统上时,请使用-Os(优化尺寸,而不是效率。)

答案 1 :(得分:6)

gcc手册列出了每个优化级别的所有隐含选项。在O2,您可以获得常量折叠,分支预测和co等内容,这些内容可以显着改变应用程序的速度,具体取决于您的代码。确切的选项取决于版本,但会详细记录它们。

要构建静态库,请按如下方式使用ar:

ar rc libfoo.a foo.o foo2.o ....
ranlib libfoo.a

Ranlib并不总是必要的,但没有理由不使用它。

答案 2 :(得分:4)

关于何时使用什么优化选项 - 没有单一的正确答案。

某些优化级别有时可能会降低性能。这取决于您编写的代码类型及其具有的执行模式,具体取决于您运行的特定CPU。

(为了给出一个简单的规范示例 - 编译器可能决定使用一种优化,使您的代码比以前略大。这可能导致代码的某一部分不再适合指令缓存,此时许多需要更多访问内存 - 例如循环中。)

最好根据您的需要进行测量和优化。尝试,衡量和决定。

一个重要的经验法则 - 对代码执行的优化越多,使用调试器(或读取其反汇编)调试它就越困难,因为C / C ++源视图远离生成的二进制文件。由于这个原因,在开发/调试时使用较少的优化是一个很好的经验法则。

答案 3 :(得分:2)

除了循环展开和内联之外,编译器还可以执行许多优化。从那时起就特别提到了循环展开和内联,尽管它们使代码更快,但它们也使代码更大。

要制作静态库,请使用'g ++ -c'生成.o文件,使用'ar'将其存档到库中。

答案 4 :(得分:0)

关于静态库问题,David Cournapeau给出的答案是正确的,但您也可以使用' s'用' ar'标记而不是在静态库文件上运行ranlib。 'ar' manual page表示

  

在存档上运行ar s相当于在其上运行ranlib。

您使用的方法只是个人偏好。