GLIBCXX版本

如果我在我的机器上编译一个C ++程序,并在另一个(使用较旧的软件)上运行它,则会得到: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found . /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 strings /usr/lib/libstdc++.so.6 | grep GLIBCXXstrings /usr/lib/libstdc++.so.6 | grep GLIBCXX打印到GLIBCXX_3.4.14 。 在另一个系统上,它只打印到GLIBCXX_3.4.8 (我有libstdc ++。so.6.0.8)。

所以我有几个问题:

  1. 为什么我的链接程序将C ++二进制文件与libstdc ++版本GLIBCXX_3.4.9而不是GLIBCXX_3.4.14

  2. 如果我GLIBCXX_3.4 libstdc ++版本GLIBCXX_3.4编译我的二进制文件, GLIBCXX_3.4我猜它几乎在任何地方运行。 这是否意味着任何问题? (例如:它会使用更老的algorithm,因此更糟糕的algorithm实现?)

  3. 如果相反,我静静地链接我的程序对我的libstdc ++,我想它会运行到处; 当然,这个二进制文件会更大(〜1MB),其他的优点和缺点呢?

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

使用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上的语义的符号。

  1. 即在您的系统上安装的库版本。 您可以手动构建glibc 3.4.14版本并链接到它
  2. 那要看。 也许更高版本修复了一些问题。 您的程序的用户将不得不链接到您的程序需要的版本
  3. 内存使用率更高
  4. 是的,将适当的参数传递给链接器。 如果你需要特定版本的库,那么最好下载它,然后手动构建,并链接到它。

编辑

我只记得,静态链接库增加了内存使用量。

在我看来,如果你的二进制文件不使用新的GLIBCXX版本的新功能,那么它们将不会与该版本链接。 所以你的二进制文件与GLBCXX 3.4.9链接,必须至少有一个符号从它导出,没有从3.4.9以上的版本导出的任何符号。