Почему символ функции SHA512 в libeay32 не имеет начального подчеркивания? - PullRequest
1 голос
/ 05 марта 2011

Я пытаюсь использовать функцию OpenSSL SHA512 в моем проекте на C ++. Для этого я включаю openssl/sha.h в мои исходные файлы, которые вызывают SHA512 и связывается с библиотекой libeay32.lib.

SHA512 объявлено в openssl/sha.h как:

extern "C" {
//...
unsigned char *SHA512(const unsigned char *d, size_t n,unsigned char *md);
//...
}

При ссылке, однако, символ не найден:

mysql_sha.obj : error LNK2019: unresolved external symbol _SHA512 referenced in function _sha512

Проблема, по-видимому, заключается в том, что в libeay32.lib символ для функции фактически SHA512 (без начального подчеркивания), и я также вижу __imp_SHA512, когда обычно это будет __imp__SHA512.

Я использую сборку Win64 OpenSSL 1.0.0d от Shining Light Productions.

Почему символ функции SHA512 не имеет начального подчеркивания? Как мне обойти эту проблему?

1 Ответ

12 голосов
/ 06 марта 2011

Существует только одно соглашение о вызовах для 64-битного кода. Никакой ерунды __cdecl, __stdcall, __fastcall и так далее. Кто бы ни придумал другое соглашение о вызовах x64, чтобы сэкономить долю наносекунды, будет казнен. Соответственно, экспорт DLL больше не должен быть украшен начальным подчеркиванием и символами @. Экспортируемое имя просто SHA512.

К сожалению, это не объясняет, почему ваш компилятор все еще ставит префикс подчеркивания. Похоже, вы на самом деле используете 32-битный компилятор.

...