RHEL7下conda环境gcc8.4编译报clock_gettime@GLIBC_2.17未定义错误
问题解答
1 libstdc++引用高版本glibc符号的原因
- 你当前conda环境安装的是适配CentOS 6(glibc 2.12)的cos6系列编译链,配套的
libstdc++.so.6.0.25本身只依赖glibc 2.12的符号,但环境中实际生效的是更高版本的libstdc++.so.6.0.28。 - 该高版本libstdc是针对glibc >=2.17编译的,内置了对
clock_gettime@GLIBC_2.17、aligned_alloc@GLIBC_2.16等符号的依赖,且libstdc的软链指向错误导致编译时优先加载了这个不兼容的高版本库。 - 该版本冲突通常是后续安装其他conda包时,自动升级
libstdcxx-ng/libgcc-ng包导致的。
2 不破坏conda沙箱的编译解决方案
方案1:修复编译链版本匹配(最推荐)
直接将libstdcxx等依赖回退到和当前cos6编译链配套的版本,全程使用conda源的包,完全保留沙箱隔离特性:
- 执行重装命令:
conda install --force-reinstall libstdcxx-ng=9.3.0 libgcc-ng=9.3.0
- 重装完成后软链会自动修复,使用原编译命令即可正常编译:
${CONDA_PREFIX}/bin/x86_64-conda_cos6-linux-gnu-g++ ./a.cpp -lrt
方案2:切换为适配RHEL7的cos7编译链
你使用的系统是RHEL7,原生glibc版本为2.17,直接切换conda的cos7(CentOS7)系列编译链,可从根源解决版本兼容问题,所有依赖均来自conda环境:
- 执行安装命令:
conda install gcc_linux-64=*_cos7_* gxx_linux-64=*_cos7_* sysroot_linux-64=2.17
- 安装完成后直接调用conda环境内的g++编译即可,无需额外参数。
方案3:临时添加编译兼容参数
如果不能修改现有环境的包版本,可以在编译时添加参数强制兼容glibc 2.12的符号:
${CONDA_PREFIX}/bin/x86_64-conda_cos6-linux-gnu-g++ ./a.cpp -lrt -Wl,--wrap=aligned_alloc -Wl,--wrap=clock_gettime
内容的提问来源于stack exchange,提问作者idzero
相关产品推荐
相关产品推荐

