Conda 环境编译期间出现 libcurl.so.4 未定义引用 __fdelt_chk@GLIBC_2.15 的错误

问题描述 投票:0回答:1

我正在 Conda 环境中编译 C++/MPICXX 软件程序,其中包括以下要求(我当前拥有的版本):

cmake (3.26.3)
openmpi (4.1.6)
h5pcc [mpi_openmpi_h457a7a6_3] (1.14.0) 
GCC and g++ compilers (14.2.0)

我的计算节点有以下操作系统:

Operating System: CentOS Linux 7 (Core)
Kernel: Linux 3.10.0-x.x.x.x86_64
Architecture: x86-64

我专门使用以下CMake命令进行编译:

cmake ../ -DCMAKE_C_COMPILER=$CONDA_PREFIX/bin/mpicc \
          -DCMAKE_CXX_COMPILER=$CONDA_PREFIX/bin/mpicxx \
          -DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
          -DCMAKE_INCLUDE_PATH=$CONDA_PREFIX/include \
          -DCMAKE_LIBRARY_PATH=$CONDA_PREFIX/lib \
          -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX \

但是,我在编译/链接过程中收到以下错误:

$CONDA_PREFIX/bin/../lib/gcc/x86_64-conda-linux-gnu/14.2.0/../../../../x86_64-conda-linux-gnu/bin/ld: $CONDA_PREFIX/lib/./
libcurl.so.4: undefined reference to `__fdelt_chk@GLIBC_2.15'
libcurl.so.4: undefined reference to `memcpy@GLIBC_2.14'
libcurl.so.4: undefined reference to `clock_gettime@GLIBC_2.17'

我已经做过的是:

  1. 验证了GLIBC版本(我系统的GLIBC版本是2.17),并且我还验证了Conda

    libc.so.6
    位于
    $CONDA_PREFIX/x86_64-conda-linux-gnu/sysroot/lib64/libc.so.6

  2. 已在 Conda 环境中安装

    libcurl (8.2.1)

  3. 尝试手动将

    -lrt
    添加到链接器标志,但收到相同的错误。

  4. 使用Conda环境

    ld (2.43)
    版本对比系统的
    /usr/bin/ld (version 2.27)

什么可能导致这些带有

GLIBC
符号(如
__fdelt_chk@GLIBC_2.15
)的未定义引用错误,以及如何在 Conda 环境中解决这些错误?

c++ cmake anaconda conda libcurl
1个回答
0
投票

我头痛三天后今晚刚刚解决了这个问题,哈哈!问题是所使用的链接器

ld
位于
/usr/bin
而不是
$CONDA_PREFIX/bin
。为了避免任何依赖关系混淆,我意识到我需要从头开始重新安装所有内容。

这就是我所做的:

  1. 使用
    my_env
     创建一个名为 
    python=3.9
  2. 的新 conda 环境
  3. 安装该程序的必要先决条件:
    conda install -y hdf5=*=mpi* gcc gxx openmpi cmake -c conda-forge
    。这应该安装 HDF5、OpenMPI 和 MPICXX 并行版本的依赖项。注意,
    conda lis
    中的HDF5应该指的是
    openmpi
    mpi
    。这还应该为所述软件包下载适当的
    GLIBC
  4. 验证
    $CONDA_PREFIX/lib
    $CONDA_PREFIX/include
    目录分别包含
    libmpi.so
    libhdf5.so
    。具体文件路径可以参考
    CMakeLists.txt
    进行验证。

附注我上次尝试了类似的方法,但安装顺序不同(即将

hdf5=*=mpi*
放在最后或单独安装
gcc/gxx
)。为了将来参考,我建议一起下载所有依赖项并使用相同的通道以避免任何库混淆。

© www.soinside.com 2019 - 2024. All rights reserved.