动态编译而不是静态编译的c ++二进制文件时出现glibc错误

问题描述

请考虑以下内容我有一个C ++文件。我使用RHEL6机器来编译我的代码。但我希望我的可执行文件/二进制文件也能够在RHEL4上运行。 现在我经历了以下3种情况-

  1. 如果我在gcc版本4.4.7的RHEL6上编译了一个简单的c ++文件,则无法在RHEL4机器上执行它。错误
加载共享库时出现

错误:需要glibc 2.5或更高版本 动态链接

对此的解决方案在gcc: Reduce libc required version中给出。修复之后,我可以在RHEL4上运行二进制文件

  1. 如果我使用静态库进行编译(在具有相同gcc版本的RHEL6上), 我可以在RHEL4机器上执行它。不需要像情况1那样使用-Wl,--hash-style=both

  2. 如果我在RHEL6上编译项目(而不是单个文件),则在RHEL4平台上运行二进制文件时会收到以下错误

/lib64/libc.so.6:未找到版本“ GLIBC_2.7”

我的问题是:

a)在静态链接库的情况下为什么没有错误

b)情况1和情况3产生的错误有什么区别?

解决方法

  1. 无法用于该链接器,默认库和动态链接。 3.静态链接将代码从库中复制到可执行文件中,并且无论该可执行文件在哪里,它们都可以稳定地工作。动态链接可能有点麻烦,因为在运行时在动态库搜索路径中具有相同的库和库版本,而在运行时却使代码不完整。