我正在开发一个使用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”命令来启用这些功能,或者????
谢谢, 杰里米
答案 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结构。
我希望这可以帮助你找到自己的方式。