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

C++ 如何解决libstdc++;可移植性问题,c++,g++,dynamic-linking,C++,G++,Dynamic Linking,我已经构建了一个在我的系统(Fedora30)中运行的二进制文件,但是当我想在ubuntu上运行它时,我得到了以下错误: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./App) 解决这个问题的标准方法是什么?还是我总是需要在各种操作系统上重新构建我的应用程序才能运行它 解决这个问题的标准方法是什么 解决这个问题的标准方法是定义您的最低要求,然后以这样一种方式

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

/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./App)
解决这个问题的标准方法是什么?还是我总是需要在各种操作系统上重新构建我的应用程序才能运行它

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

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

例如,如果你在ReHAT 7.2分布上建立你的程序,并且不使用C++,你的程序将运行在所有不超过20年的Linux发行版上。 还是我总是需要在各种操作系统上重新构建我的应用程序才能运行它

你没有

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

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

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

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

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


另外,我不建议您实际运行物理RedHat-7.2主机。使用带有旧发行版的独立虚拟机进行构建应该是可行的。

这不是glibc的版本标签,而是GNU(GCC)libstdc++。除非您使用的是特定于Fedora操作系统的API,或者您的Ubuntu环境与Fedora环境是不同的体系结构,您通常会提供一个安装程序,或者至少随代码一起提供所有程序依赖项。如果体系结构不匹配,你需要在本地进行交叉编译或重新编译。@雇佣者RuSain感谢你的详细响应,仅仅因为我是初学者,“并且不使用C++,你的程序将运行在所有Linux发行版上”意味着如果我用C和我写我的应用程序不使用C++,我就不会拥有(或者至少我没有)。C++的程序比C语言更容易移植(但C++也不算太坏)。当您将X11和/或Qt和/或GL添加到混合中时,保持二进制文件的可移植性变得更加困难。