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
相关产品推荐
相关产品推荐

