如何知道用于在 C++ 中构建共享库的优化选项

How to know the optimzation options used to build a shared library in C++

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

有没有办法找到该信息?

非常感谢

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

除非首先编译该库的人使用编译器以某种方式将这些标志保存到二进制文件中(我认为只有最近的 GCC 才允许这样做,并且可能是 clang),否则本质上没有办法确切地知道哪些标志是用过的。当然,如果你有很多看汇编的经验,你可以扣除很多(例如"this looks like an automatically unrolled loop"、"This looks like someone optimized for a processor where A xor A is faster than A := 0x0"等)。

一般来说,总是有不同的源代码最终可能会变成相同的编译代码,因此无法判断编译的内容是首先优化了 "by hand" 还是已经看到了编译器优化许多案例。

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

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

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

现在,1. 确实与优化级别无关;当然越优化你的字节码对应的越少"lines of source code",但是你还是可以有调试符号的

第二点:我从惨痛的教训中了解到,除非我成功排除了所有其他选择,否则我是错误的罪魁祸首(而不是我的编译器)。

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