我正在 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'
我已经做过的是:
验证了GLIBC版本(我系统的GLIBC版本是2.17),并且我还验证了Conda
libc.so.6
位于$CONDA_PREFIX/x86_64-conda-linux-gnu/sysroot/lib64/libc.so.6
。
已在 Conda 环境中安装
libcurl (8.2.1)
。
尝试手动将
-lrt
添加到链接器标志,但收到相同的错误。
使用Conda环境
ld (2.43)
版本对比系统的/usr/bin/ld (version 2.27)
。
什么可能导致这些带有
GLIBC
符号(如 __fdelt_chk@GLIBC_2.15
)的未定义引用错误,以及如何在 Conda 环境中解决这些错误?
我头痛三天后今晚刚刚解决了这个问题,哈哈!问题是所使用的链接器
ld
位于 /usr/bin
而不是 $CONDA_PREFIX/bin
。为了避免任何依赖关系混淆,我意识到我需要从头开始重新安装所有内容。
这就是我所做的:
my_env
创建一个名为
python=3.9
conda install -y hdf5=*=mpi* gcc gxx openmpi cmake -c conda-forge
。这应该安装 HDF5、OpenMPI 和 MPICXX 并行版本的依赖项。注意,conda lis
中的HDF5应该指的是openmpi
或mpi
。这还应该为所述软件包下载适当的 GLIBC
。$CONDA_PREFIX/lib
和 $CONDA_PREFIX/include
目录分别包含 libmpi.so
和 libhdf5.so
。具体文件路径可以参考CMakeLists.txt
进行验证。附注我上次尝试了类似的方法,但安装顺序不同(即将
hdf5=*=mpi*
放在最后或单独安装 gcc/gxx
)。为了将来参考,我建议一起下载所有依赖项并使用相同的通道以避免任何库混淆。