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

标签 c++ g++ dynamic-linking

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

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

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

最佳答案

what is the standard way to solve this problem?



解决此问题的标准方法是定义最低要求,然后以仅要求最低要求而无其他要求的方式构建二进制文件。

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

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运行时的系统无法在任何系统上运行该二进制文件。

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

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

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

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

关于c++ - 我该如何解决libstdc++可移植性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60660701/

相关文章:

c++ - 使用不同的编译器输入 char* 时出现奇怪的输出

c++ - 在一个 VS 项目中使用多个工具集——有风险吗?

c++ - 最快的排序功能

c++ - 模板化递归数据类型

c++ - g++ 错误 : specialization after instantiation (template class as friend)

c++ - 使用 RTLD_DEEPBIND 动态加载共享库

c++ - 在代码片段 ":"中解释 C++ 中 "int i:2;"运算符的使用

c++ - 为什么 g++ 不优化局部数组而是优化全局数组?

linux - 如何处理不匹配的共享对象的 "undefined symbol"错误

c++ - 为什么即使链接器可以找到库,我也会收到 "DSO missing"错误?