如何让线程安全的libssh2在Windows下链接?
我正在开发一个使用libssh2的基于多线程多平台Qt的程序。当几个使用SSH的线程同时处于活动状态时,crypt_encrypt和libssh2_transport_write内部的程序偶尔会崩溃,因此我在Google上搜索发现,要使多线程libssh2可靠工作,我需要在使用libssh2之前调用CRYPTO_set_locking_回调等 基于这个建议,我将指定的回调设置调用添加到main的顶部,并使其在MacOS/X下编译和运行而不会崩溃。。。但在Windows下,我现在得到了以下链接错误,我不知道如何修复 Microsoft R Windows R资源编译器版本6.1.6723.1 微软公司版权所有。版权所有。 链接。。。 main.obj:错误LNK2019:函数void中引用的未解析的外部符号\u加密\u设置\u锁定\u回调\u cdecl do\u加密\u锁定\u设置void?do\u加密\u锁定\u设置@@YAXXZ main.obj:错误LNK2019:函数void中引用的未解析外部符号\u CRYPTO\u mallock\u cdecl do\u CRYPTO\u locks\u setupvoid?do\u CRYPTO\u locks\u setup@@YAXXZ main.obj:错误LNK2019:函数void中引用的未解析外部符号\u CRYPTO\u num\u locks\u cdecl do\u CRYPTO\u locks\u setupvoid?do\u CRYPTO\u locks\u setup@@YAXXZ main.obj:错误LNK2019:函数void中引用了未解析的外部符号\u CRYPTO\u free\u cdecl do\u CRYPTO\u locks\u cleanupvoid?do\u CRYPTO\u locks\u cleanup@@YAXXZ 有人知道我需要做什么才能在Windows下链接这些呼叫吗?是否需要链接其他.lib文件,或者是否需要将特定标志传递给perl Configure VC-WIN32命令以启用这些函数,或者 谢谢,如何让线程安全的libssh2在Windows下链接?,windows,multithreading,unresolved-external,libssh2,Windows,Multithreading,Unresolved External,Libssh2,我正在开发一个使用libssh2的基于多线程多平台Qt的程序。当几个使用SSH的线程同时处于活动状态时,crypt_encrypt和libssh2_transport_write内部的程序偶尔会崩溃,因此我在Google上搜索发现,要使多线程libssh2可靠工作,我需要在使用libssh2之前调用CRYPTO_set_locking_回调等 基于这个建议,我将指定的回调设置调用添加到main的顶部,并使其在MacOS/X下编译和运行而不会崩溃。。。但在Windows下,我现在得到了以下链接错误
Jeremy我不确定这是否有帮助,但这个链接: 列出Unix和windows上的链接之间的一些差异 摘录: 两者之间最主要的区别在于符号不是 由Windows库自动导出。在Unix上,所有 链接到共享对象的所有对象文件中的符号 库对库的用户可见。在Windows上 程序员必须明确地选择制作特定的符号 可见-即导出它们 有三种方法可以从Windows DLL和所有 三种方法可以在同一个库中混合使用
In the source code, declare the symbol as `__declspec(dllexport)`, thusly:
__declspecdllexport int my_exported_function int x,double y
“导出”部分,其中包含要导出的符号
EXPORTS
my_exported_function
my_other_exported_function
剩下的就是让MacOSX开发人员搜索这些函数,并告诉您哪个特定库具有这些函数,重新检查代码,如果可以的话重新声明,然后重试
很抱歉,我无法准确指出您的问题所在
也要记住VisualStudio是C++编译器,而不是C编译器,而它几乎符合C90的库,LIPSH库或其他人可以使用一些VS不支持的C99结构。
我希望这能以某种方式帮助您找到自己的方法。也许您应该尝试使用MinGw QT工具链。这些通常更好地使用unix派生的库,如libssh2、zlib、pcre、glib、etcI。我不认为这是一种选择;我正在调试的是其他人的程序,我不能要求他们仅仅为了支持错误修复而更改整个工具链。这很有帮助,谢谢!然而,即使在我将程序链接到link之后,我的回调例程也没有被调用;我不知道为什么,但我怀疑一些问题与OpenSSL如何嵌入到Libssh2中有关,Libssh2然后被我的应用程序链接到。我最终的丑陋解决方案是将CRYPTO_set*调用从我的应用程序移动到libssh2_init函数中,因为它们在那里可以正常工作。由于该应用附带了libssh2.dll的副本,这对我来说已经足够了,尽管它根本不是一个优雅的解决方案。。。。
EXPORTS
my_exported_function
my_other_exported_function