Как связать мой проект MS Visual Studio со статическими библиотеками OpenSSL? - PullRequest
2 голосов
/ 23 декабря 2011

Перед тем, как начать этот проект, у меня сложилось ложное впечатление, что я был опытным в кодировании и в использовании Visual Studio 2010. Теперь я понимаю, что я был полностью погружен в себя.

Моя платформа для разработки - это 64-битная Windows 7, но мне нужно собрать как для 64, так и для 32-битных платформ. Я использую VS 2010 и OpenSSL 1.0.0e, хотя при необходимости могу использовать другой. Я пытаюсь создать статическую библиотеку (* .lib), которая будет включена в более крупный проект другими разработчиками. * .Lib, кажется, компилируется, но очевидно, что не все хорошо, так как тестовая программа прерывается.

Я не могу использовать * .dll с моей программой, это произошло с высоты, поэтому я пытался статически связать свою библиотеку с libeay32.lib и ssleay32.lib. Я только начал и хотел начать медленно при использовании чего-то нового, поэтому единственными двумя функциями, которые я пытаюсь вызвать из SSL, являются HMAC и EVP_sha512:

HMAC(EVP_sha512(), key, keyLen, lpBufferAddr, dwCurBufSize, hashOut, &len);

Я признаю, что, возможно, я делаю это совершенно неправильно, но у вас это есть. Честно говоря, единственное, что мне нужно, это криптографические функции и функции HMAC. Я мог бы использовать что-то еще, но мне сказали использовать OpenSSL. Во всяком случае, двигаться дальше ....

При создании тестовой программы, которая ссылается на мой библиотечный проект (который, в свою очередь, ссылается на две библиотеки OpenSSL), я получаю следующие ошибки компоновки:

error LINK2019: unresolved external symbol _HMAC@28 referenced in function "public: int _thiscall etc"
error LINK2019: unresolved external symbol _EVP_sha512@28 referenced in function "public: int _thiscall etc"

Я включил обе библиотеки в «Дополнительные зависимости» и включил их каталог в «Дополнительные зависимости библиотек».

Может кто-нибудь помочь мне с этим? Я обливался этим и пришел к печальному выводу, что я тупица. Я признаю, что создание статических библиотек из OpenSSL было достаточно сложным делом, и я даже не уверен, что у меня получилось с x64. Буду признателен за любую помощь и совет.

1 Ответ

0 голосов
/ 31 марта 2013

OpenSSL - это библиотека на основе C, которая компилируется с параметром / Gd. Все функции с соглашением о вызовах __cdecl.

Добавьте __cdecl перед функциями, которые вы используете. (Обратите внимание, что нет необходимости перекомпилировать библиотеку после добавления __cdecl, поскольку библиотека компилируется с этой опцией).

например. если вы используете SSL_connect

 int __cdecl SSL_connect(SSL * ssl);

Я думаю, это решит вашу проблему.

В некоторых случаях вам нужно заключить объявление функции в extern "C". Но, насколько я знаю, в этом случае вам не нужно этого делать.

...