在开始这个项目之前,我有一个错误的印象,我精通编码和使用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。任何帮助和建议将不胜感激。
答案 0 :(得分:0)
OpenSSL是基于C的库,使用/ Gd选项进行编译。所有函数都使用__cdecl调用约定。
在您使用的功能之前添加__cdecl。 (请注意,添加__cdecl后无需重新编译库,因为使用此选项编译库)。
e.g。如果您使用的是SSL_connect
int __cdecl SSL_connect(SSL * ssl);
我想,它会解决你的问题。
在少数情况下,您需要在extern“C”下包装函数声明。但据我所知,在这种情况下,你不应该这样做。