GLIBCXX版本

peo*_*oro 37 c++ linux portability glibc

如果我在我的机器上编译C++程序,并在另一台机器上运行它(使用较旧的软件),我得到:/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found.

实际上在我的系统上glibc更新(我得到了gcc-libs 4.5.1:libstdc ++.so.6.0.14)并strings /usr/lib/libstdc++.so.6 | grep GLIBCXX从中打印GLIBCXX_3.4GLIBCXX_3.4.14.相反,在另一个系统上,它只打印到GLIBCXX_3.4.8(我得到了libstdc ++.so.6.0.8).

所以我有几个问题:

  1. 为什么我的链接器将c ++二进制文件链接到libstdc ++版本GLIBCXX_3.4.9而不是GLIBCXX_3.4.14

  2. 如果我对libstdc ++版本编译我的二进制文件,GLIBCXX_3.4我想它几乎可以在任何地方运行.这会暗示任何问题吗?(例如:它会使用较旧的 - 因此更糟糕的算法实现吗?)

  3. 相反,我将我的程序静态链接到我的libstdc ++,我想它会在任何地方运行; 当然,二进制文件会更大(~1MB),任何其他优点/缺点?

  4. 我可以强制链接器将我的二进制文件链接到给定版本的libstdc ++吗?

nin*_*alj 36

使用readelf -aobjdump -x优先检查ELF文件strings.

实际上,所有GLIBCXX_*版本都不适用于整个库,而是适用于每个符号(符号版本控制,请参阅DSO-howto).所以你可以拥有例如:std::char_traits<wchar_t>::eq@@GLIBCXX_3.4.5std::ios_base::Init::~Init()@@GLIBCXX_3.4相同的库文件.

您的程序需要GLIBCXX_3.4.9这一事实可能意味着它已经链接到已在GLIBCXX_3.4.9上引入/已更改语义的符号.