我正在尝试运行一个使用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/