如何将我的动态库的要求降级到 glibcxx 3.4.20?

How to downgrade requirement to glibcxx 3.4.20 of my dynamic library?

我曾经在 Docker 中为 Centos7 构建我的动态库,一切正常,直到发生某些事情(或者我改变了一些事情),现在 .so 需要 libstdc++ 和 glibcxx 3.4.20。如何降低要求?谢谢!

注意:

我只需要知道升级的原因,以及如何恢复即可。

更新: 如果我执行 objdump,我会得到以下符号:

[root@a0d062ba3109 bin]# objdump -x ../plugin/va/lib/libvaplugin.so |    grep GLIBCXX_3.4.20
...
_ZSt24__throw_out_of_range_fmtPKcz@@GLIBCXX_3.4.20

看起来 throw_out_of_range_fmt 被 vector::range_check 使用了。但是为什么它开始使用它而之前没有使用throw_out_of_range_fmt?

But why it started using it and didn't use throw_out_of_range_fmt before?

您开始使用一些以前没有使用过的功能。猜测:

  1. 您启用了例外,但之前禁用了例外,
  2. 您现在正在呼叫 std::vector::at 之前没有呼叫过。

您可以通过将 -Wl,-y,_ZSt24__throw_out_of_range_fmtPKcz 添加到您图书馆的 link 行来 准确地 找到对 _ZSt24__throw_out_of_range_fmtPKcz 的引用来自何处.这将告诉您库中的哪个 .o 需要符号。

使用objdump -dr foo.o查找对符号的引用,您就会知道是哪个函数在调用它。

正如 Jesper Juhi 已经评论过的,如果您需要您的库与 pre-GCC-4.9 libstdc++ 一起工作,您应该使用 pre-GCC-4.9 编译器构建它。