CentOS 7运行Ubuntu编译的Tensorflow C API程序遇GLIBC版本缺失问题求解决方案
解决CentOS7.6运行Ubuntu编译的TensorFlow库出现GLIBC/GLIBCXX版本缺失问题
这个问题我之前帮人排查过,本质就是编译环境(Ubuntu16.04)和运行环境(CentOS7.6)的C/C++标准库版本差异过大导致的:
- Ubuntu16.04默认搭载GLIBC 2.23、gcc 5.x(对应GLIBCXX最高到3.4.21+)
- CentOS7.6默认只有GLIBC 2.17、gcc 4.8.5(对应GLIBCXX最高仅3.4.19)
你在Ubuntu编译的TensorFlow库依赖高版本的库符号,而CentOS7的系统库根本没有这些符号,所以才会抛出一堆版本缺失的错误。
下面给你三个可行的解决办法,按稳妥程度排序:
方案一:在CentOS7上重新编译TensorFlow(最推荐)
直接在目标集群上编译TensorFlow,生成的库会自动适配CentOS7的系统库版本,从根源解决兼容问题:
- 升级编译用的gcc版本:CentOS7默认gcc版本太低,无法编译高版本TensorFlow,用
devtoolset安装高版本gcc:# 先安装SCL源 sudo yum install -y centos-release-scl # 安装gcc8(足够编译大部分TensorFlow版本) sudo yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++ # 启用gcc8(每次编译前执行,或者加到~/.bashrc里永久生效) scl enable devtoolset-8 bash - 安装bazel:根据你要编译的TensorFlow版本,安装对应版本的bazel(比如TensorFlow1.x对应bazel0.24.x左右),可以从官方仓库下载rpm包安装,或者编译源码。
- 编译TensorFlow C API:
- 克隆TensorFlow源码,切换到你需要的版本分支
- 配置编译选项:运行
./configure,按提示设置,重点确保开启C API支持,添加--copt=-fPIC(适配OpenFOAM的编译需求) - 执行编译命令:
bazel build --config=opt --copt=-fPIC //tensorflow:libtensorflow.so //tensorflow:libtensorflow_framework.so
- 编译完成后,把生成的
libtensorflow.so.1和libtensorflow_framework.so.1替换掉你OpenFOAM目录下的旧库即可。
方案二:局部升级C/C++标准库(谨慎操作)
如果不想重新编译,可以在CentOS7上安装高版本的GLIBC和libstdc++到非系统目录,运行时指定优先加载这些库:
- 编译高版本GLIBC:下载GLIBC2.27源码,编译安装到
/opt/glibc-2.27(注意绝对不要覆盖系统库) - 编译高版本gcc:下载gcc8.x源码,编译安装到
/opt/gcc-8.3.0,得到对应的libstdc++.so.6 - 运行程序时指定库路径:
也可以把这个路径加到OpenFOAM的环境变量配置文件里,避免每次手动输入。LD_LIBRARY_PATH=/opt/glibc-2.27/lib:/opt/gcc-8.3.0/lib64:$LD_LIBRARY_PATH ./tabulatedCombustionFoam
⚠️ 重要提醒:绝对不要替换系统默认的/lib64/libm.so.6或/lib64/libstdc++.so.6,否则会导致系统大部分命令直接崩溃!
方案三:静态编译TensorFlow(可选)
编译TensorFlow时指定静态链接C/C++标准库,让生成的库不依赖系统动态库:
在bazel编译命令中添加静态链接选项:
bazel build --config=opt --copt=-fPIC --linkopt=-static-libgcc --linkopt=-static-libstdc++ //tensorflow:libtensorflow.so //tensorflow:libtensorflow_framework.so
不过这种方式可能会遇到依赖冲突,部分TensorFlow组件可能不支持静态链接,需要根据实际情况调整。
内容的提问来源于stack exchange,提问作者tre95
相关产品推荐
相关产品推荐

