链接程序时是不是需要重复编译标志?

Posted

技术标签:

【中文标题】链接程序时是不是需要重复编译标志?【英文标题】:Is it necessary to repeat compilation flags when linking a program?链接程序时是否需要重复编译标志? 【发布时间】:2014-11-04 15:40:08 【问题描述】:

g++ 标志(例如用于优化的-O 和用于创建调试符号的-g)是否会影响链接过程中的任何内容?

更具体地说,如果我将编译和链接分开(例如,在 make 文件中),并且我在编译期间提供了 -O-g 标志,我是否应该在链接时也提供这些标志?

【问题讨论】:

-g 用于生成调试符号,-O 优化,即删除发布版本中没有的东西。如果您想要优化,您不应该使用 -g ,而是您的选择。如果您使用的是 make 文件,则在编译阶段完成后就不必这样做了。 @DevSolar 已更正。我的错。 @hagubear:-g 即使对于优化的代码也很有用 - 它使可执行文件更大一些,但通常不会影响性能,并且有助于调试(一些错误只出现在优化的代码)和分析(没有必要分析未优化的代码)。 【参考方案1】:

传统上,这是不必要的。然而,编译器的最新改进确实让至少优化也可以在链接时运行:LTO(链接时优化)导致编译的目标文件包含中间代码,而不是机器代码,并且中间代码将被编译为机器代码在链接时,如果每个目标文件本身包含机器代码,则可以应用无效的优化。编译的第二步受-O 等命令行选项的影响,因此您应该在链接时将它们包含在命令行中。

【讨论】:

以上是关于链接程序时是不是需要重复编译标志?的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 中添加链接器标志

代码块 - 使用大地址感知标志编译

编译时 -pthread 标志的意义

使用 -pg 编译时更改 gmon.out 文件的名称 [重复]

我怎样才能知道 GCC 可以使用哪些标志来更轻松地链接库?

使用 -g gcc 标志编译的程序是不是比不使用 -g 编译的同一程序慢?