跨 glibc 版本依赖解决方案

前言

image

在 Linux 下,运行一个在其他机器上编译的可执行文件经常会类似出现如图所示的 /lib64/libc.so.6: version ‘GLIBC_2.14’ not found 提示。原因是 glibc 版本太低,需要在本机重新链接使它使用低版本的 glib。为了解决整个问题,使用搜索引擎查阅了很多资料,大体给出了以下几种方案:

  • 方案一:升级机器的 glibc 版本以满足程序运行要求。
  • 方案二:在低版本的 glibc 版本的机器上重新编译。
  • 方案三:指定 glibc 版本编译。
  • 方案四:静态编译。

查看 glibc 版本

1
2
3
ldd --version
getconf GNU_LIBC_VERSION
getconf GNU_LIBPTHREAD_VERSION

ldd 隶属于 glibc,它的版本就是 glibc 的版本。

静态编译

在编译的时候添加 -static 链接标志。

1
gcc -static test.c -o test

-static 链接标志会将 GLIBC 的副本静态链接到应用程序中,而不是从系统中动态加载它。这确保了应用程序始终使用指定的 GLIBC 版本,即使系统上存在其他版本。

指定 glibc 版本编译

在编译和链接代码时,将程序链接/运行时的依赖路径指向期望的版本,手段包括:

  • -Wl,-rpath=编译参数。
  • -Wl,--dynamic-linker编译参数。
  • 设置LD_LIBRARY_PATH
  • 设置PATH