You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译带libssh2的curl时出现`libssh2_scp_recv2`未定义引用错误

解决办法

1. 版本兼容性问题

libssh2_scp_recv2是libssh2特定版本引入的函数,若curl依赖的libssh2版本高于你当前编译的版本,就会触发该错误。

  • 查看curl源码目录下的INSTALL或README文档,确认其要求的libssh2最低版本。
  • 下载对应版本的libssh2重新编译安装,确保版本匹配curl的依赖需求。

2. libssh2编译时禁用了SCP功能

部分编译参数会关闭libssh2的SCP模块,导致libssh2_scp_recv2未被编译进库中。

  • 重新编译libssh2时,不要添加--disable-scp这类禁用参数(默认SCP/SFTP功能是启用的)。
  • 编译完成后,用nm -D $libssh2path/lib/libssh2.so | grep libssh2_scp_recv2检查该函数是否存在于库文件中,若输出为空则说明函数未被编译。

3. configure未正确识别libssh2库路径

即使指定了--with-libssh2="$libssh2path",configure可能仍优先链接系统默认的旧版本libssh2。

  • 在configure前添加LDFLAGS明确指定库路径,确保优先使用你编译的版本:
    CFLAGS="-I$opensslpath/include/ -I$libssh2path/include/" \
    LDFLAGS="-L$libssh2path/lib/" \
    ./configure \
    --prefix="$curlpath" \
    --without-zlib \
    --without-ldap \
    --without-lber \
    --without-libidn \
    --with-nghttp2 \
    --with-ssl="$opensslpath" \
    --with-libssh2="$libssh2path" \
    && make
    
  • 查看configure生成的config.log,搜索libssh2相关日志,确认是否正确加载了你编译的libssh2库和头文件。

4. 动态库缓存干扰

系统中若存在旧版本libssh2,链接时可能优先加载缓存中的旧库而非你编译的新版本。

  • 临时设置环境变量指定库路径优先级:
    export LD_LIBRARY_PATH="$libssh2path/lib:$LD_LIBRARY_PATH"
    
    之后重新执行make。

5. 跨组件依赖版本不一致

libssh2和curl均依赖OpenSSL,若两者编译时使用的OpenSSL版本不同,会导致链接冲突。

  • 编译libssh2时指定与curl相同的OpenSSL路径:
    ./configure --prefix="$libssh2path" --with-ssl="$opensslpath" && make && make install
    
    之后重新编译curl。

内容的提问来源于stack exchange,提问作者Jim Rasmussen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:57:53