GLIBCXX版本

时间:2010-11-09 12:33:49

标签: 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 GLIBCXXGLIBCXX_3.4打印到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. 如果我对libstdc ++版本GLIBCXX_3.4编译我的二进制文件,我想它几乎可以在任何地方运行。这会暗示任何问题吗? (例如:它会使用较旧的算法实现吗?)

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

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

3 个答案:

答案 0 :(得分:34)

使用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 :(得分:0)

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

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

答案 2 :(得分:-1)

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