gpt4 book ai didi

c++ - 如何链接一个简单的 libssh 程序

转载 作者:太空宇宙 更新时间:2023-11-04 13:07:00 24 4
gpt4 key购买 nike

问题:让一个使用 libssh 库的简单程序成功编译而不会出现链接器错误。

程序:

#include <iostream>

#define LIBSSH_STATIC 1
#include <libssh/libssh.h>
#include <stdlib.h>

void sftpSession()
{
ssh_session test_session = ssh_new();
if (!test_session) {
throw std::runtime_error("Could not create a session?!");
return;
}
ssh_free(test_session);
std::cout << "Session created & freed successfully." << std::endl;
}

int main(int argc, char **argv)
{
std::cout << "SFTP test program" << std::endl;
try {
sftpSession();
}
catch (const std::runtime_error &e) {
std::cout << "thrown: " << e.what() << std::endl;
}
return EXIT_SUCCESS;
}

机器为 64 位,运行 Windows。使用 MinGW(通过 CodeBlocks)和构建日志(为了便于阅读而略微编辑)将编译器命令显示为:

x86_64-w64-mingw32-g++.exe 
-Wall -fexceptions -O2 -std=c++0x -g -m64 -Dmine_dev=1
-I"C:\Program Files\zlib\zlib-1.2.8-dll\include"
-I"C:\Program Files (x86)\libssh\libssh-0.6.5\include"
-c C:\Users\ ... \SFTP_testing\main.cpp
-o obj\Release\main.o

x86_64-w64-mingw32-g++.exe
-L"C:\Program Files (x86)\Ingres\IngresII\ingres\lib"
-o bin\Release\SFTP_testing.exe
obj\Release\main.o
-s
"C:\Program Files (x86)\libssh\libssh-0.6.5\lib\libssh.dll.a"

obj\Release\main.o: In function `sftpSession()':
C:/Users/ ... /SFTP_testing/main.cpp:9: undefined reference to `ssh_new'
C:/Users/ ... /SFTP_testing/main.cpp:14: undefined reference to `ssh_free'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 2 second(s))
3 error(s), 0 warning(s) (0 minute(s), 2 second(s))

我尝试/调查过的事情

据我所知,undefined reference to 是指链接器能够找到函数的声明,但找不到它们的定义。

  • 编译器确实找到了头文件和函数的定义。

  • 头文件确实有必要的 extern "C" 代码,包括以下内容:

    #ifdef __cplusplus
    extern "C" {
    #endif
    ...
    LIBSSH_API ssh_session ssh_new(void);
    ...
    LIBSSH_API void ssh_free(ssh_session session);
    ...
    #ifdef __cplusplus
    }
    #endif
  • 链接器正在成功找到库。 (通过 ProcessMonitor 程序检查,肯定是在访问 libssh.dll.a 文件。)

  • 使用 nm 实用程序,我检查了 libssh.dll.a 中的目标代码确实包含对 ssh_newssh_free 的引用>

  • 检查 32 位/64 位问题之间是否存在混淆:提供的预编译库有两个版本。一个是 ...\libssh-0.6.5\bin\libssh.dll 另一个是 ...\libssh-0.6.5\lib\libssh.dll.a 和前者给我以下错误:i386 architecture of input file 'C:\Program Files (x86)\libssh\libssh-0.6.5\bin\libssh.dll' is incompatible with i386:x86- 64 输出,但后者没有给出此类错误,因此我假设 libssh.dll.a 文件是要使用的正确库文件。

  • 检查了this very similar question about libssh2中给出的建议关于链接库的顺序,但这里对 g++ 的调用看起来是正确的,因为 libssh.dll.a 参数就在最后。

  • 检查了 more general advice about linker errors也是,但找不到任何似乎适用的东西。

  • 重建前进行清洁以避免“死木”的影响。

  • 尝试了其他旧版本的库。同样的错误信息。

  • 尝试(未成功)编译更新版本的 libssh。

最佳答案

libssh 未链接。执行此操作的正确方法是将 libssh 目录(包含 header )复制到代码块安装的包含目录下。并将 .dll.a 文件复制到 CodeBlocks 安装的 lib 目录下。如果您要这样做,也请删除 #define LIBSSH_STATIC 1 行。

关于c++ - 如何链接一个简单的 libssh 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41763200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com