Как получить потокобезопасный libssh2 для связи под Windows? - PullRequest
0 голосов
/ 08 декабря 2011

Я работаю над многопоточной многоплатформенной программой на основе Qt, которая использует libssh2.Программа иногда зависала в crypt_encrypt () и libssh2_transport_write (), когда несколько потоков, использующих SSH, были активны одновременно, поэтому я гуглил и обнаружил некоторые страницы , которые говорят, что для многопоточной libssh2 работает надежно, мне нужновызывать CRYPTO_set_locking_callback () и т. д. перед использованием libssh2.

Основываясь на этом совете, я добавил указанные вызовы call-setup в начало main () и получил все это для компиляции и запуска без сбоев в MacOS /X ... но под Windows я теперь получаю следующие ошибки ссылки, которые я не знаю, как исправить.

Microsoft (R) Windows (R) Resource Compiler Версия 6.1.6723.1 Copyright (C) Microsoft Corporation,Все права защищены.Связывание ... main.obj: ошибка LNK2019: неразрешенный внешний символ _CRYPTO_set_locking_callback, на который ссылается функция «void __cdecl do_crypto_locks_setup (void)» (?do_crypto_locks_setup (пустоты)»main.obj (do_crypto_locks_setup @@ YAXXZ?): LNK2019 ошибки: неразрешенный внешний символ _CRYPTO_num_locks, указанный в функции "недействительный __cdecl do_crypto_locks_setup (пустоты)" main.obj (do_crypto_locks_setup @@ YAXXZ?): ошибки LNK2019: неразрешенный внешнийна символ _CRYPTO_free, на который ссылается функция «void __cdecl do_crypto_locks_cleanup (void)» (? do_crypto_locks_cleanup @@ YAXXZ)

Кто-нибудь знает, что мне нужно сделать, чтобы связать эти вызовы в Windows?Есть ли какой-нибудь другой файл .lib, с которым мне нужно связаться, или мне нужно передать определенный флаг команде "perl Configure VC-WIN32", чтобы включить эти функции, или ???

Спасибо, Джереми

1 Ответ

0 голосов
/ 09 декабря 2011

Я не уверен, может ли это помочь, но эта ссылка: 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 не поддерживает.

Надеюсь, это поможет вам найти свой путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...