我如何解决 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 仅用于构建应该可行。
我已经在我的系统 (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 仅用于构建应该可行。