Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让线程安全的libssh2在Windows下链接?_Windows_Multithreading_Unresolved External_Libssh2 - Fatal编程技术网

如何让线程安全的libssh2在Windows下链接?

如何让线程安全的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下,我现在得到了以下链接错误

我正在开发一个使用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命令以启用这些函数,或者

谢谢,
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