首页 > 解决方案 > RHEL 7 上的 gcc linux-64 编译器版本 8.4 - 未定义符号 clock_gettime@GLIBC_2.17

问题描述

我在 RHEL 上有一个 conda 环境,其中包含:

# platform: linux-64
_sysroot_linux-64_curr_repodata_hack=3=haa98f57_10
binutils_impl_linux-64=2.35.1=h27ae35d_9
binutils_linux-64=2.35.1=h454624a_30
gcc_impl_linux-64=8.4.0=he7ac559_17
gcc_linux-64=8.4.0=he201b7d_30
gxx_impl_linux-64=8.4.0=h9ce2e92_17
gxx_linux-64=8.4.0=h85ed34b_30
kernel-headers_linux-64=2.6.32=h77966d4_13
ld_impl_linux-64=2.35.1=h7274673_9
libgcc-devel_linux-64=8.4.0=hd257e2f_17
libstdcxx-devel_linux-64=8.4.0=hf0c5c8d_17
sysroot_linux-64=2.12=h77966d4_13
libgcc-ng=9.3.0=h2828fa1_19

我正在尝试编译一个简单的 c++ 程序,其中包含:

#include <iostream>
#include <ctime>

int main()
{
   timespec ts;
   (void)clock_gettime(CLOCK_REALTIME, &ts);
   return 0;
}

但是我不断收到未定义的符号错误:

/home/idzero/condaenvs/npy37/CondaInstall/envs/npy37/bin/../lib/gcc/x86_64-conda-linux-gnu/8.4.0/../../../../x86_64-conda-linux-gnu/bin/ld: /home/idzero/condaenvs/npy37/CondaInstall/envs/npy37/bin/../lib/gcc/x86_64-conda-linux-gnu/8.4.0/../../../../x86_64-conda-linux-gnu/lib/../lib/libstdc++.so: undefined reference to `clock_gettime@GLIBC_2.17'
/home/idzero/condaenvs/npy37/CondaInstall/envs/npy37/bin/../lib/gcc/x86_64-conda-linux-gnu/8.4.0/../../../../x86_64-conda-linux-gnu/bin/ld: /home/idzero/condaenvs/npy37/CondaInstall/envs/npy37/bin/../lib/gcc/x86_64-conda-linux-gnu/8.4.0/../../../../x86_64-conda-linux-gnu/lib/../lib/libstdc++.so: undefined reference to `aligned_alloc@GLIBC_2.16'
collect2: error: ld returned 1 exit status

我的编译命令行是:

${CONDA_PREFIX}/bin/x86_64-conda_cos6-linux-gnu-g++ ./a.cpp -lrt

这个 gcc 编译器元包包含以下库(其中包括 - 所有 v2.12)

libc-2.12.so
ld-2.12.so
librt-2.12.so
libstdc++.so.6.0.25

有趣的是 libstdc++.so.6.0.25 指向不存在的 ../../../lib/libstdc++.so.6.0.25 。取而代之的是../../../lib/libstdc++.so.6.0.28!

有人可以帮我解决我的两个问题吗?

我想补充一点,如果我使用系统库路径 /lib64 并明确链接到 libc-2.17,我就能够成功编译。所以

${CONDA_PREFIX}/bin/x86_64-conda_cos6-linux-gnu-g++ ./a.cpp -L/lib64 -lc-2.17

作品。但必须明确链接到 libc-2.17 似乎并不正确。

将 sysroot 设置为 / through

g++ -Wl,--sysroot=/ a.cpp

作品。但随后它链接到系统提供的 libc,这当然会破坏 conda 提供的沙箱环境。

标签: c++linuxgcccondarhel7

解决方案


推荐阅读