c++ - 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 提供的沙箱环境。
解决方案
推荐阅读
- c# - CS1729 'MyNavigationPage' 不包含带有 1 个参数的构造函数 --> 在 Visual Studio 2019 社区版中
- django - Django 频道测试奇怪的数据库行为
- sql - 使用多个表的 SQL 选择命令问题
- pyspark - 在 (py)spark 上创建一个复杂的数据框
- c# - 如何使用 C# 检查 Google Cloud Storage 中是否存在对象?
- python-3.x - Systemd 脚本未使用 config.ini 运行 python 脚本
- r - 使用 tidyr 转换为在变量中生成子变量的长表
- javascript - 使用 Websockets 在 Python 中连续流式输出程序
- c# - 根据字符串参数从实体框架返回一个列表
- c# - 我有一个 asp 文本框,表示为 ASP 文字的文本属性。如何获取 TextBox 的 Text 值?