我如何解决 libstdc++ 可移植性问题

How can I solve libstdc++ portability problem

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

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

解决这个问题的标准方法是什么?还是我总是需要在各种 os 到 运行 上重建我的应用程序?

what is the standard way to solve this problem?

解决这个问题的标准方法是定义你的最低要求,然后以只需要这个最低要求的方式构建你的二进制文件,没有其他要求。

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

or do I always need to rebuild my app on various os to run it?

你不知道。

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

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

避免此要求的一种方法是 link 带有 -static-libstdc++ 标志。您的二进制文件会更大(可能 much),并且可能需要以不同的形式分发(由于 GPL 的病毒性质;请咨询您的律师),但它会在较旧的发行版上工作。

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

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

P.S。我不建议您实际上 运行 物理 RedHat-7.2 主机。使用带有旧发行版的隔离 VM 仅用于构建应该可行。