我已经建立了一个在我的系统中运行的二进制文件(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/