从源码构建GDAL时出现与OpenSSL相关的链接错误
解决Redhat UBI8.6 Conda环境下GDAL源码构建时libssh与OpenSSL链接错误
问题场景
在Redhat UBI8.6的Conda Python3.8环境中,搭配proj8.2.1源码构建GDAL(3.4.1及其他版本)时,出现libssh.so.4找不到OpenSSL特定符号的链接错误,核心错误信息如下:
/usr/lib64/libssh.so.4: undefined reference to `EVP_KDF_ctrl@OPENSSL_1_1_1b' /usr/lib64/libssh.so.4: undefined reference to `EVP_KDF_CTX_free@OPENSSL_1_1_1b' collect2: error: ld returned 1 exit status
解决方案
1. 禁用GDAL的libssh支持(最快绕开)
直接在configure阶段关闭ssh模块,避免链接系统libssh:
./configure --prefix=$CONDA_PREFIX --with-netcdf=$CONDA_PREFIX --with-proj=$CONDA_PREFIX --with-curl=no --with-libssh=no make -j24 make install
2. 指定使用系统OpenSSL构建
强制GDAL链接系统的OpenSSL,匹配系统libssh的依赖:
./configure --prefix=$CONDA_PREFIX --with-netcdf=$CONDA_PREFIX --with-proj=$CONDA_PREFIX --with-curl=no --with-openssl=/usr make -j24 make install
3. 调整环境变量确保库路径正确
临时重置LD_LIBRARY_PATH,让系统库和conda库的顺序正确,避免链接混乱:
export LD_LIBRARY_PATH=/usr/lib64:$CONDA_PREFIX/lib # 重新执行配置和构建 ./configure --prefix=$CONDA_PREFIX --with-netcdf=$CONDA_PREFIX --with-proj=$CONDA_PREFIX --with-curl=no make -j24 make install
4. 使用Conda提供的libssh替代系统库
在conda环境中安装兼容的libssh,让GDAL链接conda版本的库,避免系统库冲突:
conda install -c conda-forge libssh # 重新配置构建,此时会自动识别conda环境中的libssh ./configure --prefix=$CONDA_PREFIX --with-netcdf=$CONDA_PREFIX --with-proj=$CONDA_PREFIX --with-curl=no make -j24 make install
问题原因
错误本质是库依赖版本/路径不匹配:
- 系统的
libssh.so.4依赖OpenSSL 1.1.1b引入的特定符号,但构建GDAL时可能链接到了conda环境中的OpenSSL,或者库路径顺序导致找不到正确的符号; - 虽然系统OpenSSL版本是1.1.1k(理论上包含1.1.1b的符号),但链接路径错误导致符号无法被解析。
内容的提问来源于stack exchange,提问作者Shejo284
相关产品推荐
相关产品推荐

