我正在尝试运行一个使用libssh2库的简单c程序。
对于安装(build + install),我使用cmake-gui(我正在使用Windows 10 x64)打开openSSL选项,并且关闭zlib。

我正在尝试不同的解决方案,以包含具有正确依赖项的库,但是每次出现不同的错误消息时,都将尝试使用该解决方案。喜欢:

当我仅包含ssh2库路径-I "C:\\Program Files (x86)\\libssh2\\include" -L "C:\\Program Files (x86)\\libssh2\\lib" -lssh2

错误信息:


  C:\ Program Files(x86)\ libssh2 \ lib / libssh2.a(openssl.c.obj):openssl.c :(。text + 0x38):对'BN_bn2bin'的未定义引用
  
  C:\ Program Files(x86)\ libssh2 \ lib / libssh2.a(openssl.c.obj):openssl.c :(。rdata $ .refptr.PEM_read_bio_ECPrivateKey [.refptr.PEM_read_bio_ECPrivateKey] + 0x0):对' PEM_read_bio_ECPrivateKey'
  
  C:\ Program Files(x86)\ libssh2 \ lib / libssh2.a(pem.c.obj):pem.c :(。text + 0x6dd):对'EVP_DigestUpdate'的未定义引用
  
  C:\ Program Files(x86)\ libssh2 \ lib / libssh2.a(bcrypt_pbkdf.c.obj):bcrypt_pbkdf.c :(。text + 0x3bb):对'EVP_DigestUpdate'的未定义引用
  
  C:\ Program Files(x86)\ libssh2 \ lib / libssh2.a(crypt.c.obj):crypt.c :(。text + 0x156):对'EVP_CIPHER_CTX_free'的未定义引用


我没有发布所有错误消息,但我注意到“()”中的那些库像crypt和openssl一样混乱。所以我试图通过将openSSL安装目录的路径添加到编译器中来包括它们:-I 'C:\Program Files (x86)\libssh2\include' -I C:\OpenSSL-Win64\include -L 'C:\Program Files (x86)\libssh2\lib' -L C:\OpenSSL-Win64\lib -lssh2 -lws2_32 -lcrypto -lssl
但这没有用,因为他找不到那些库:


  找不到-lcrypto
  
  找不到-lssl
  openSSL安装文件夹具有包含theesheaders文件的include文件夹和具有.lib文件的lib文件夹(我不确定mingw64是否可以使用这些扩展名,否则应为100%,否则应为.a)。


也许之前有人问过这个问题,但经过几天的搜索,我找不到适合我的解决方案。非常抱歉重复帖子。

这是我的任务文件:

{
"version": "2.0.0",
"tasks": [
    {
        "type": "shell",
        "label": "Build active file",
        "command": "C:\\Program Files\\mingw-w64\\x86_64-6.2.0-win32-seh-rt_v5-rev1\\mingw64\\bin\\gcc.exe",
        "args": [
            "-Wall",
            "-Wextra",
            "-g",
            "${file}",
            "-I",
            "C:\\Program Files (x86)\\libssh2\\include",
            "-I",
            "C:\\OpenSSL-Win64\\include",
            "-L",
            "C:\\Program Files (x86)\\libssh2\\lib",
            "-L",
            "C:\\OpenSSL-Win64\\lib",
            "-lssh2",
            "-lws2_32",
            "-lcrypto",
            "-lssl",
            "-o",
            "${fileDirname}\\${fileBasenameNoExtension}.exe"
        ],
        "options": {
            "cwd": "C:\\Program Files\\mingw-w64\\x86_64-6.2.0-win32-seh-rt_v5-rev1\\mingw64\\bin"
        },
        "problemMatcher": [
            "$gcc"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    },
    {
        "type": "shell",
        "label": "Run active file",
        "command":".\\${fileBasenameNoExtension}.exe"
    }
]


}

我不确定是否需要c_cpp_properites文件:

{
"configurations": [
    {
        "name": "Win32",
        "includePath": [
            "${workspaceFolder}/**"
        ],
        "defines": [
            "_DEBUG",
            "UNICODE",
            "_UNICODE"
        ],
        "windowsSdkVersion": "10.0.10586.0",
        "compilerPath": "\"C:/Program Files/mingw-w64/x86_64-6.2.0-win32-seh-rt_v5-rev1/mingw64/bin/gcc.exe\"",
        "cStandard": "c11",
        "cppStandard": "c++17",
        "intelliSenseMode": "gcc-x86"
    }
],
"version": 4


}

最佳答案

您始终需要链接到应用程序或共享库的依赖关系(使用-lssh2进行了关联),但是如果您要进行静态构建,则还需要包括依赖关系的依赖关系。

在Linux上或在Windows上使用MSYS2时,可以使用pkg-config.exe获取实际的链接参数,如下所示:

pkg-config.exe --static --libs libssh2


在我的情况下返回:

-LD:/Prog/winlibs64-9.2.0-7.0.0/custombuilt/lib -lssh2 -lws2_32 -lssl -lcrypto -lws2_32 -lgdi32 -lcrypt32 -lz

关于c - 如何在Visual Studio代码中将libssh2包含到C项目中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59022518/

10-13 06:11