- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
问题:让一个使用 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_new
和 ssh_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/
我试图将我的程序与 libssh 静态库链接。 以下是我从 libssh 教程中复制的简单代码: //sshtest.c #define LIBSSH_STATIC 1 #include #incl
我想知道在使用 ARM 的 Sourcery 工具链进行交叉编译时是否可以将我的应用程序链接到 libssh。我的主机系统是Ubuntu x86_64 :~/c/ssh$ arm-none-linux
我想知道在使用 ARM 的 Sourcery 工具链进行交叉编译时是否可以将我的应用程序链接到 libssh。我的主机系统是 Ubuntu x86_64 :~/c/ssh$ arm-none-linu
我正在使用 libssh。 调用ssh_channel_write后,我必须知道是否有数据要读取。 ( 但我不想检索数据。 ) 如果没有数据要读取(例如10s后),我会调用ssh_channel_wr
我正在使用 libssh 向计算机发送远程命令。该命令是实时的,因此我试图在生成数据时获取数据。基本上,我正在对鼠标事件进行十六进制转储,并且我想要该数据。如何从我的命令中返回实时结果? #inclu
已阅读相关内容docs和 tutorials并找到了similar问题,我仍然无法继续。如果这是一个常见问题,我提前表示歉意。我进行了搜索,但我不太确定我在寻找什么...... 我正在 Debian
我不知道为什么我的 libssh 程序无法连接到本地主机,但它对远程主机运行良好。 ssh_session my_ssh_session = ssh_new(); ssh_options_set(my
我正在尝试编写一个简单的程序(玩具示例),将文件从远程主机复制到本地计算机。 当我尝试复制一个 txt 文件时它有效,但不适用于 mp4 等文件。 这是我的代码,基本上是教程中的部分拼接而成:http
我正在尝试将一个库包含到我的代码 (libssh) 中,但没有任何效果...在这一点上,我不确定该怎么做,因为搜索引擎中没有针对我收到的错误弹出任何结果。 我在这里下载了 libssh: https:
我正在尝试一个非常简单的 libssh 实现,但 valgrind 显示内存泄漏。 代码是: #include #include #include #include #include int
我正在尝试在我的应用程序中使用 libssh,但我不断收到内存泄漏。我正在尝试的最简单的代码是: #include #define SSH_NO_CPP_EXCEPTIONS assert(0 ==
我的 SSH 服务器使用双重身份验证。我不知道它是如何实现的。但最初它要求输入密码,然后再次要求输入另一个密码才能登录到与通常控制不同的单独控制台。 我的代码与文档中显示的示例代码类似, #inclu
我按照教程尝试使用 libssh 打开和验证 SSH 连接,但在 ssh_connect 之后,无论我尝试密码验证、公钥验证还是不验证,应用程序都会崩溃并出现核心转储。 t@1 (l@1)
问题:让一个使用 libssh 库的简单程序成功编译而不会出现链接器错误。 程序: #include #define LIBSSH_STATIC 1 #include #include void
即使我可以在我的服务器上使用各种方法进行身份验证,使用 libssh 库,也没有检测到任何身份验证方法。这是一个代码示例: #include #include int main(int,ch
我正在使用 libssh 库并尝试创建一个新的 SFTP session 。我不断收到错误消息 ssh_packet_unimplemented: Received SSH_MSG_UNIMPLEME
在 ssh cli 中,我可以: ssh root@localhost -t aria2c https://github.com/JetBrains/intellij-community/archiv
我试图使用 libssh 0.7.0 将 SSH 通信包含到我的程序中。我按照教程创建了到远程计算机的简单连接,但遇到了这个错误: [2016/10/26 16:38:56.280261, 1] ss
我正在我的应用程序中为 xen VM 实现 VNC 连接。为了连接,我必须转发端口,因为 XenServer 只接受本地连接。我是这样做的: ssh -L 5903:localhost:5903 ro
我已经按照说明安装了 libssh,尽管一切似乎都正常,但我的编译器仍然在“#include”行中返回错误“找不到文件”。我猜它与目录或链接有关(我在下载它的同一个文件夹中有“make install
我是一名优秀的程序员,十分优秀!