【问题标题】:How to know the optimzation options used to build a shared library in C++如何知道用于在 C++ 中构建共享库的优化选项
【发布时间】:2025-12-26 00:15:12
【问题描述】:

我有一个非常简单的问题,但我还没有找到答案,所以我开始了: 我正在使用一个共享库,我想知道它是否已使用优化标志(例如 -O3)进行编译。

有没有办法找到这些信息?

非常感谢

【问题讨论】:

  • 您是否期待精确的优化标志或简单的想法是否维护调试符号?我想了解您为什么要寻找 O3?

标签: c++ optimization compilation


【解决方案1】:

如果您使用gcc 4.3 或更高版本,请查看-frecord-gcc-switches。构建二进制文件后,使用readelf -n 阅读注释部分。 更多信息可以在这里找到Detect GCC compile-time flags of a binary

【讨论】:

    【解决方案2】:

    除非首先编译该库的人使用编译器以某种方式将这些标志保存到二进制文件中(我认为只有最近的 GCC 允许这样做,并且可能是 clang),否则本质上无法确切知道使用了哪些标志。当然,如果您在组装方面有很多经验,您可以扣除很多(例如“这看起来像一个自动展开的循环”、“这看起来像是针对A xor AA := 0x0"等)。

    通常,总有不同的源代码最终会成为相同的编译代码,因此无法判断编译的内容是首先“手动”优化的,还是在许多情况下已经看到编译器优化。

    此外,还有很多 C++ 编译器,这些编译器的很多版本,甚至更多标志...

    现在,您的问题来自某处;我猜你问这个是因为

    1. 你想知道里面是否有调试符号,或者
    2. 您想确保某些东西不会因为不正确的优化而崩溃,或者
    3. 您想知道是否有优化的潜力。

    现在,1. 确实与优化级别无关;当然,你优化得越多,你的字节码对应的“源代码行”就越少,但你仍然可以有调试符号。

    第二点:我学到了一个艰难的方法,除非我成功地排除了所有其他替代方案,否则我是错误的罪魁祸首(而不是我的编译器)。

    第三点:总是有优化的空间,但这对你没有帮助,除非你自己重新编译库。如果您重新编译,您将设置标志,因此无需首先确定它们是否已设置。如果您无法重新编译:知道有空间对您没有帮助。如果您只是从复杂的构建过程中获取库:大多数构建系统都会给您留下一个包含编译器标志等内容的日志。

    【讨论】:

    • 您好,感谢您的指导性回答。我属于你描述的第三类。出于科学目的,我正在使用一个必须处理 TBytes 数据的库,但我什至不确定代码是否经过优化,所以我想自己检查一下。