我是 Linux 编程新手,我想知道有没有办法在同一发行版的旧版本 Linux 上运行(而不是重新编译)我的 C++ 可执行文件?
示例:假设我在 RHEL 6 上编译了代码,并希望在 RHEL 4 或 5 上运行我的可执行文件。
在 Windows 中,当我们执行此操作时,我们只需安装 C++ 编译器版本的 C++ 运行时。
示例:如果我使用 VS2012 使用 C++11 构建 C++ 项目,我只需要在客户端计算机上安装 C++11 的 C++ 运行时即可运行我的应用程序,无论我使用什么版本的 Windows(课程从Windows XP开始)
迄今为止最简单的方法是利用 glibc 和 GCC 运行时库的强大未来兼容性:在您希望其运行的最旧的操作系统上编译可执行文件,并且它应该可以在以后的任何内容上工作而无需重新编译(也就是说,可能需要一些符号链接来满足可执行加载程序期望的依赖关系)。
一般来说,最好为您想要支持的每个发行版进行编译,这样就不会出现意外的冲突。
实际上,是的 - 找到您的应用程序 deps(例如:
ldd
)并将它们(例如:libstdc++.so.6
)从构建系统复制到目标系统上的某个位置(例如:/mylibs
)。将您的应用程序指向此处(例如:使用 patchelf 的 --rpath
和 --interpreter
)。您的应用程序应该运行(测试一下!)。如果没有,您的 glibc
可能与旧内核不兼容。您可以通过使用 glibc
--enable-kernel=<version>
开关重新编译所需版本的 ./configure
以支持旧内核来解决此问题。如果您所需的 glibc
版本不支持该内核版本,那么您可以在 .so 中提供缺少的函数并使用 LD_PRELOAD
加载它们。