Как получить потокобезопасную библиотеку libssh2 для связи под Windows?
Я работаю над многопоточной многоплатформенной программой на основе Qt, которая использует libssh2. Программа иногда зависала в crypt_encrypt() и libssh2_transport_write(), когда несколько потоков, использующих SSH, были активны одновременно, поэтому я погуглил и обнаружил, что некоторые страницы говорят, что для надежной работы многопоточного libssh2 необходимо вызвать CRYPTO_set_locking_callback() и т.д., прежде чем использовать libssh2.
Основываясь на этом совете, я добавил указанные вызовы настройки обратного вызова в начало main() и получил все это для компиляции и запуска без сбоев в MacOS/X... но в Windows я теперь получаю следующие ошибки ссылок, которые я не уверен, как исправить.
Microsoft (R) Windows (R) Resource Compiler Версия 6.1.6723.1 Авторские права (C) Microsoft Corporation. Все права защищены. Связывание... main.obj: ошибка LNK2019: неразрешенный внешний символ _CRYPTO_set_locking_callback, указанный в функции "void __cdecl do_crypto_locks_setup(void)" (?do_crypto_locks_setup(void)" (?do_crypto_locks_setup@@YAXXZ) main.obj: ошибка LNK2019: неразрешенный внешний символ _CRYPTO_num_locks, на который есть ссылка в функции" void __cdecl do_crypto_locks_setup_0_объявления_объявления_объявления_объекта_locks_setup_locked_locks_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup_love_setup.dll) символ _CRYPTO_free, указанный в функции "void __cdecl do_crypto_locks_cleanup(void)" (?do_crypto_locks_cleanup @@ YAXXZ)
У кого-нибудь есть идеи о том, что мне может понадобиться, чтобы связать эти вызовы под Windows? Есть ли какой-нибудь другой файл.lib, на который мне нужно ссылаться, или мне нужно передать определенный флаг команде perl Configure VC-WIN32, чтобы включить эти функции, или???
Спасибо джереми
1 ответ
Я не уверен, может ли это помочь, но эта ссылка: 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 my_exported_function my_other_exported_function
Осталось бы попросить разработчиков MacOSX найти эти функции и сказать, какая конкретная библиотека имеет эти функции, перепроверить код, повторно объявить, если можете, и повторить попытку.
Извините, что я не смог точно определить, в чем ваша проблема.
Также имейте в виду, что Visual Studio является компилятором C++, а не компилятором C, и хотя он почти совместим с C90, библиотеки libssh или другие могут использовать некоторые конструкции C99, которые VS не поддерживает.
Я надеюсь, что это может как-то помочь вам найти свой путь.