【发布时间】:2022-01-03 12:50:44
【问题描述】:
我正在尝试使用我在 CMake 中的项目在 Win10 上编译 libcurl。目前这是我的设置(的 libcurl 部分):
link_directories("C:/Program Files/OpenSSL-Win64-1_1_1/lib")
link_directories("C:/Program Files/OpenSSL-Win64-1_1_1")
list(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/out/build/x64-Debug/libssh2-1.10.0/src)
add_subdirectory(curl-7.80.0)
这样做时会出现以下错误:
创建库 C:/PATH/build/curl-7.80.0/lib/Debug/libcurl-d_imp.lib 和对象 C:/PATH/build/curl-7.80.0/lib/Debug/libcurl-d_imp。经验
libssh2.obj:错误 LNK2019:函数 Curl_ssh_init [C:\PATH\curl-7.80.0\build\lib\libcurl.vcxproj] 中引用的未解析外部符号 libssh2_init
libssh2.obj:错误 LNK2019:函数 Curl_ssh_cleanup 中引用的未解析外部符号 libssh2_exit [C:\PATH\curl-7.80.0\build\lib\libcurl.vcxproj]
libssh2.obj:错误 LNK2019:函数 ssh_force_kno 中引用的未解析外部符号 libssh2_session_init_ex wnhost_key_type [C:\PATH\curl-7.80.0\build\lib\libcurl.vcxproj]
libssh2.obj:错误 LNK2019:函数 sftp_perform 中引用的未解析的外部符号 libssh2_session_abstract [C:\PATH\curl-7.80.0\build\lib\libcurl.vcxproj]
OpenSSL 是通过此安装程序安装的:https://slproweb.com/products/Win32OpenSSL.html
我对 CMake 了解不多,通常足以构建我自己的项目,但这有点超出我的想象。我很高兴感谢您给我的每一个帮助。
编辑 1:CMake 给出的实际链接命令:
链接:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64\link.exe /ERRORREPORT:QUEUE /OUT:"C:\ PATH\bin\64bit_\Debug\libcurl-d.dll" /INCREMENTAL /ILK:"libcurl.dir
Debug\libcurl-d.ilk" /NOLOGO /LIBPATH:"C:/Program Files/OpenSSL-Win64-1_1_1/lib" /LIBPATH:"C:/Program Files/OpenSS L-Win64-1_1_1/lib/Debug" /LIBPATH:"C:/Program Files/OpenSSL-Win64-1_1_1" /LIBPATH:"C:/Program Files/OpenSSL-Win64- 1_1_1/Debug" /LIBPATH:"C:/PATH/out/build/x64-Debug/libssh2-1.10.0/src" /LIBPATH:"C:/PATH/out/build/x64-Debug/libssh2-1.10. 0/src/Debug" /LIBPATH:"C:/PATH/out/build/x64-Debug/libssh2 -1.10.0" /LIBPATH:"C:/PATH/out/build/x64-Debug/libssh2-1.10.0/Debug" wldap32.lib winmm.lib ws2_32。 lib "......\out\build\x64-Debug\libssh2-1.10.0\src\libssh2.lib" advapi32.lib crypt32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTU AC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:/PATH/bin/64bit_/Debug/libc url-d.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/PATH/build/curl-7.80.0/l ib/Debug/libcurl-d_imp.lib" /MACHINE:X64 /machine:x64 /DLL libcurl.dir\Debug\libcurl.res
编辑 2:libssh2_exit 的转储文件
00C 00000050 SECT4 notype () 外部 | libssh2_exit
01B 00000008 SECT5 notype 静态 | $unwind$libssh2_exit
01C 0000000C SECT6 notype 静态 | $pdata$libssh2_exit
【问题讨论】:
-
请注意,ssh 与 ssl 不同。也许在 curl 中关闭 ssh/scp 支持就足够了?或者,使用 conan/vcpkg。开心点。
-
@Botje 我添加了 link_directories(${CMAKE_CURRENT_SOURCE_DIR}/out/build/x64-Debug/libssh2-1.10.0/src) link_directories(${CMAKE_CURRENT_SOURCE_DIR}/out/build/x64-Debug/ libssh2-1.10.0) 但这并没有改变任何东西。我不想使用包管理器使 libcurl 成为我项目的一部分
-
link_directories只告诉链接器 在哪里 查找。您实际上还需要告诉它与 libssh2 链接。 -
@Botje 我将如何从外部执行此操作? libcurl 告诉我它找到了 libssh2 库(分别没有告诉我它没有找到它们)
-
啊。如果这是您的问题,那将很方便。 curl 构建路径中缺少
x64让我想知道您是否真的在构建 32 位模式。