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

事实上,在我的系统上,glibc是更新的(我得到了gcc libs 4.5.1:libstdc++.so.6.0.14),从GLIBCXX_3.4GLIBCXX_3.4.14打印了strings /usr/lib/libstdc++.so.6 | grep GLIBCXX次.而在另一个系统上,它最多只能打印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++链接我的二进制文件吗?

推荐答案

使用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上引入/更改了语义的符号.

Linux相关问答推荐

为什么 linux shell diff 命令有时会显示与空行相关的输出,即使存在 -B(--ignore-blank-lines)选项?

将所有列乘以一个常数

删除一行和它之前的一行

更改 awk 中的上一个重复行

如何使用 awk 重新排列列?

bash 更有效的方法来转换奇数日期格式以被 linux 日期识别

在 puppet 中管理 linux 的用户密码

CHMOD 755 与 750 权限集之间的差异

在 Linux 下将 TCP 流量重定向到 UNIX 域套接字

如何判断 Ubuntu 12.04 LTS 上是否安装了多个版本的 PHP?

如何增加 /proc/pid/cmdline 4096 字节限制?

优雅地杀死在 Linux 上运行的 .NET Core 守护进程

Pthread mutex互斥断言错误

用于数据库备份的 Linux shell 脚本

如何运行时调试共享库?

如何等待第一个命令完成?

如何将文件夹中的文件列表发送到Linux中的txt文件

如何使用 sed 通过灵活的键和值更改我的配置文件?

Linux控制台中的模糊文件搜索

Linux cmd 在 jar 中搜索类文件,而不考虑 jar 路径