0

我正在开发一个使用 libssh2 的多线程多平台基于 Qt 的程序。当几个使用 SSH 的线程同时处于活动状态时,该程序偶尔会在 crypt_encrypt() 和 libssh2_transport_write() 内部崩溃,所以我四处搜索,发现一些页面说要使多线程 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)”(?do_crypto_locks_setup@@YAXXZ)中引用的未解析的外部符号_CRYPTO_set_locking_callback main.obj:错误LNK2019:函数“void __cdecl”中引用的未解析的外部符号_CRYPTO_malloc do_crypto_locks_setup(void)" (?do_crypto_locks_setup@@YAXXZ) main.obj:错误 LNK2019:未解析的外部符号 _CRYPTO_num_locks 在函数“void __cdecl do_crypto_locks_setup(void)”中引用(?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”命令以启用这些功能,或者???

谢谢,杰里米

4

1 回答 1

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 结构。

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

于 2011-12-08T23:05:59.380 回答