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

时间:2011-12-08 18:48:06

标签: windows multithreading unresolved-external libssh2

我正在开发一个使用libssh2的多线程多平台基于Qt的程序。当多个使用SSH的线程同时处于活动状态时,程序偶尔会在crypt_encrypt()和libssh2_transport_write()内部崩溃,所以我搜索了some pages,说多线程libssh2可靠地工作,我需要调用CRYPTO_set_locking_callback ()等,在使用libssh2之前。

根据这个建议,我将指定的回调设置调用添加到main()的顶部并将其全部编译并运行而不会在MacOS / X下崩溃...但是在Windows下我现在得到以下链接错误我不确定如何解决。

Microsoft(R)Windows(R)资源编译器版本6.1.6723.1 版权所有(C)Microsoft Corporation。版权所有。 链接... main.obj:错误LNK2019:函数“void __cdecl do_crypto_locks_setup(void)”中引用了未解析的外部符号_CRYPTO_set_locking_callback(?do_crypto_locks_setup @@ YAXXZ) main.obj:错误LNK2019:函数“void __cdecl do_crypto_locks_setup(void)”中引用了未解析的外部符号_CRYPTO_malloc(?do_crypto_locks_setup @@ YAXXZ) main.obj:错误LNK2019:函数“void __cdecl do_crypto_locks_setup(void)”中引用的未解析的外部符号_CRYPTO_num_locks(?do_crypto_locks_setup @@ YAXXZ) main.obj:错误LNK2019:函数“void __cdecl do_crypto_locks_cleanup(void)”中引用了未解析的外部符号_CRYPTO_free(?do_crypto_locks_cleanup @@ YAXXZ)

有没有人知道在Windows下链接这些调用可能需要做些什么?是否需要链接其他一些.lib文件,或者我是否需要将特定标志传递给“perl Configure VC-WIN32”命令来启用这些功能,或者????

谢谢, 杰里米

1 个答案:

答案 0 :(得分:0)

我不确定这是否有帮助,但是这个链接: http://www.lurklurk.org/linkers/linkers.html

列出了在unix和windows上链接之间的一些差异

摘录:

  

两者之间最主要的区别是符号不是   由Windows库自动导出。在Unix上,所有的   来自链接到共享的所有目标文件中的符号   库的用户可以看到库。在Windows上,   程序员必须明确选择制作特定的符号   可见,即。出口它们。

     

从Windows DLL(以及所有版本)导出符号有三种方法   三种方式可以在同一个库中混合在一起。)

In the source code, declare the symbol as `__declspec(dllexport)`, thusly:

__ declspec(dllexport)int my_exported_function(int x,double y);

On the invocation of the linker, use the /export:symbol_to_export option to LINK.EXE.

    LINK.EXE /dll /export:my_exported_function

Get the linker to pull in a module definition (.DEF) file (by using the /DEF:def_file linker option), and in that file include an
     

包含您要导出的符号的EXPORTS部分。

    EXPORTS
      my_exported_function
      my_other_exported_function

还剩下的是要求MacOSX开发人员搜索这些功能并告诉您哪个特定的库具有这些功能,重新检查代码,重新声明是否可以,然后重试。

很抱歉,我无法准确指出您的问题是什么。

另外请记住,Visual Studio是一个C ++编译器,而不是C编译器,虽然它几乎符合C90,但libssh库或其他人可以使用VS不支持的一些C99结构。

我希望这可以帮助你找到自己的方式。