微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RHEL 7 上的 gcc linux-64 编译器版本 8.4 - 未定义符号 clock_gettime@GLIBC_2.17

如何解决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!

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

  • 为什么 libstdc++ 在没有 2.17 libc 的 conda 环境中引用该库中的符号?
  • 如何在此环境中构建?

我想补充一点,如果我使用系统库路径 /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 提供的沙箱环境。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。