【发布时间】:2018-02-06 04:37:13
【问题描述】:
问题
我正在尝试在 Win10 上的 Visual Studio 2015 中构建一个使用 libssh 的项目,但我没有运气让它工作。我觉得我在这里失去了理智。我要么完全空白,要么遗漏了一些非常明显的东西。
我尝试使用 https://red.libssh.org/projects/libssh/files 文件部分中的安装程序 libssh-0.7.2-msvc.exe。然后我将它链接到 VS2015 中的一个测试 C++ 项目。使用示例代码我可以编译它:
#include <iostream>
#define LIBSSH_STATIC
#include <libssh/libssh.h>
int main() {
std::cout << "Starting libssh test" << std::endl;
ssh_session my_ssh_session = ssh_new();
if (my_ssh_session == NULL) {
std::cout << "Failed to initialize" << std::endl;
}
ssh_free(my_ssh_session);
return 0;
}
(注意:我已经尝试过#define LIBSSH_STATIC 和#define LIBSSH_STATIC 1,基于我最初搜索答案时看到的帖子。我什至尝试将它添加到预处理器定义中在项目属性中。)
如果我的项目设置为 32 位,我只能编译它,但我无法运行生成的可执行文件。这样做会导致错误:“无法继续执行代码,因为找不到 ssh.dll。重新安装程序可能会解决此问题。”不过,我正在静态链接 ssh.lib,所以我不确定为什么会出现该错误。
所以我尝试将 libssh 自己编译为 64 位。它比我预期的需要更多的修补(我在 zlib 上遇到了一些问题,最终我只是省略了,因为它是可选的)。我可以成功地将我的项目编译为 64 位可执行文件,但我又一次无法真正运行它。我收到关于 ssh.dll 丢失的相同错误。
为了尝试,我删除了 LIBSSH_STATIC 定义并尝试仅链接到 DLL。将 ssh.dll 从 libssh 分发包复制到我的程序文件夹并尝试运行它,我收到错误消息:“应用程序无法正确启动 (0xc000007b)。单击确定关闭应用程序。”
我不确定我在这里遗漏了什么,但我确定它很愚蠢而且我想多了。
项目设置(所有配置,所有平台)
libssh 安装到我机器上的G:\Libraries\libssh_0.7.2。
配置属性 > VC++ 目录 > 包含目录
G:\Libraries\libssh_0.7.2\include;$(IncludePath)
配置属性 > VC++ 目录 > 库目录
G:\Libraries\libssh_0.7.2\lib;$(LibraryPath)
配置属性>链接器>输入>附加依赖
ssh.lib;%(AdditionalDependencies)
libssh 路径汇总
- libssh_0.7.2
- 斌
- ssh.dll
- 包括
- libssh
- callbacks.h
- legacy.h
- libssh.h
- libsshpp.hpp
- server.h
- sftp.h
- ssh2.h
- libssh
- 库
- ssh.lib
- 斌
【问题讨论】:
-
你需要把ssh.dll放在你的程序可以找到的地方。 %PATH% 中的某处是一种选择。在同一个目录中,你的 progrsm 是另一个。
-
我试过了。这就是我最后提到的:当 DLL 对程序可见时,它无法加载并出现“应用程序无法正确启动(0xc000007b)”错误。
-
0xc000007b 通常意味着您的程序正在尝试加载错误的 dll。不是正确的体系结构(32 位和 64 位),或者是损坏的或与其链接的版本不兼容。
-
两种架构我都试过了。使用 libssh 提供的 lib/dll,它不会在 64 位上编译。它在 32 位上编译,但会引发该错误。但是我使用的 dll 和 lib 来自同一个安装,所以我看不出它们会如何不匹配。同样,如果我自己构建 libssh,我会使用来自同一构建的生成的 dll 和 lib 得到该错误。这就是为什么它让我发疯的原因,因为我似乎找不到明显的原因。 :(
-
LastError 123 is
The filename, directory name, or volume label syntax is incorrect.尝试将 DLL 放入 Dependency Walker。另外,尝试只构建一个小 C 程序,不引用 shh,并使用`LoadLibrary`,查看 DLL 是否“可加载”。
标签: c++ visual-studio dll libssh