【问题标题】:Struggling with libssh on Windows在 Windows 上使用 libssh 苦苦挣扎
【发布时间】: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
      • 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


【解决方案1】:
  1. 安装vkpkg

  2. ⊞ Win+X 打开powershell

  3. 输入vckpg install libssh:x64-windows

  4. 集成到 Visual Studio:vcpkg 集成安装

然后你可以在 Visual Studio 中包含&lt;libssh.h&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2013-02-20
    • 1970-01-01
    • 2019-01-20
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多