【问题标题】:How can I solve libstdc++ portability problem如何解决 libstdc++ 可移植性问题
【发布时间】:2020-03-12 19:26:30
【问题描述】:

我已经构建了一个在我的系统(fedora 30)中运行的二进制文件,但是当我想在 ubuntu 上运行它时出现以下错误:

/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./App)

解决这个问题的标准方法是什么?还是我总是需要在各种操作系统上重新构建我的应用程序才能运行它?

【问题讨论】:

  • 这不是 glibc 的版本标签,而是 GNU (GCC) libstdc++ 的。
  • 除非您使用特定于您的 Fedora 操作系统的 API,或者您的 Ubuntu 环境与您的 Fedora 环境的架构不同,否则您通常会提供安装程序或至少将所有程序依赖项与你的代码。如果架构不匹配,则需要在本地交叉编译或重新编译。

标签: c++ g++ dynamic-linking


【解决方案1】:

解决这个问题的标准方法是什么?

解决这个问题的标准方法是定义您的最低要求,然后以只需要这个最低要求的方式构建您的二进制文件,而不需要其他任何东西。

例如,如果您在 RedHat 7.2 发行版上构建程序,并且不使用 C++,那么您的程序将在所有不超过 20 年的 Linux 发行版上运行。

还是我总是需要在各种操作系统上重新构建我的应用程序才能运行它?

你没有。

GLIBCXX_3.4.26 版本符号的特定情况下,您已经使用 GCC 9.0.0(或更高版本)构建了二进制文件:请参阅 ABI document

该二进制文件不会在仅安装了 GCC-8.x 运行时的任何系统上运行。

避免此要求的一种方法是链接-static-libstdc++ 标志。您的二进制文件会更大(可能很多更大),并且可能需要以不同的形式分发(由于 GPL 的病毒性质;请咨询您的律师),但它适用于旧版本分布。

或者,如果您“定期”在基于 GCC-8.x 的发行版上构建二进制文件,则该二进制文件应该可以在基于 GCC-9.x 的较新发行版上正常工作。

另一种解决方案是将二进制文件分发到具有所有先决条件的 docker 容器中。

附:我不建议您实际运行物理 RedHat-7.2 主机。使用具有旧发行版的隔离 VM 仅用于构建应该可以工作。

【讨论】:

  • @employees_russain 感谢您的详细回复,因为我是初学者,“并且不使用 C++,您的程序将在所有 Linux 发行版上运行”意味着如果我用 c 和我没有使用 c++ 我不会有(或者至少我有更少的)可移植性问题?
  • @alirezasadeghpour 正确:纯 C 程序比 C++ 更易于移植(但 C++ 也不错)。当您将 X11 和/或 Qt 和/或 GL 添加到混合中时,保持二进制可移植性变得更加困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多