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

Ubuntu下gcc编译含libssh的C代码出现未定义引用错误求助

解决libssh编译时的未定义引用问题

看起来你遇到的是gcc链接器的顺序问题——这在使用第三方库编译代码时是个很常见的小坑!

直接修复:调整编译命令的顺序

你当前的编译命令gcc -lssh ssh_client.c把库参数-lssh放在了源文件前面,而gcc的链接器是从左到右处理输入的:当它先遇到-lssh时,还没看到你的代码里需要的那些libssh函数符号,所以不会把库中的相关符号纳入链接;等到处理你的源文件时,发现了未定义的符号,却已经没有库可以查找了。

只需要把源文件放在库参数前面就行:

gcc ssh_client.c -lssh

这样链接器会先处理你的代码,找到所有需要的libssh函数符号,再去-lssh库中匹配这些符号,就能成功链接了。

更省心的方式:用pkg-config自动处理参数

为了避免手动处理库路径、链接参数的麻烦,推荐使用pkg-config工具,它会自动帮你获取libssh的编译和链接所需的所有参数:

gcc ssh_client.c $(pkg-config --libs --cflags libssh)
  • --cflags会输出编译时需要的头文件路径(虽然你已经确认头文件位置正常,但这个参数能让命令更通用,适配不同的安装路径)
  • --libs会输出链接时需要的库参数,包括-lssh以及它的依赖库,确保链接完全正确

额外排查(如果上述方法仍有问题)

  • 确认系统中确实存在libssh的共享库:执行ldconfig -p | grep libssh,如果能输出类似libssh.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libssh.so.4的内容,说明库安装正常
  • 如果你打算静态链接(代码里定义了LIBSSH_STATIC 1),可以用pkg-config --libs --static libssh来获取静态链接所需的完整参数

你的代码本身没有问题,只是编译命令的链接顺序不对导致了符号未找到的错误~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:00:36