C++ 链接Openssl库(调用约定\u cdecl)与dll(调用约定\u stdcall)
我正在将openssl库(openssl.lib)包含到一个dll中。当我构建这个dll时,我发现很少有链接器错误。我调试并发现链接器错误是由于调用dll的约定造成的。我的dll使用_stdcall调用约定,而openssl使用_cdecl调用约定。我无法更改dll的调用约定,因为它是现有解决方案的一部分。因此,我尝试将openssl的调用约定更改为_stdcall。但我做不到,它最终导致了以下构建错误 \crypto\ui\ui\u openssl.c(591):错误C2440:“函数”:无法从“void(u stdcall*)(int)”转换为“void(u cdecl*)(int)” .\crypto\ui\ui\u openssl.c(591):警告C4024:“信号”:不同 形式参数和实际参数2的类型。\crypto\ui\ui\u openssl.c(591) :错误C2440:“=”:无法从“void(uu cdecl*)(int)”转换为 'void(u stdcall*)(int)'。\crypto\ui\ui\u openssl.c(592):错误C2440: “函数”:无法从“void(u stdcall*)(int)”转换为“void” (uu cdecl*)(int)' 导致生成错误的代码行包括:C++ 链接Openssl库(调用约定\u cdecl)与dll(调用约定\u stdcall),c++,windows,dll,openssl,calling-convention,C++,Windows,Dll,Openssl,Calling Convention,我正在将openssl库(openssl.lib)包含到一个dll中。当我构建这个dll时,我发现很少有链接器错误。我调试并发现链接器错误是由于调用dll的约定造成的。我的dll使用_stdcall调用约定,而openssl使用_cdecl调用约定。我无法更改dll的调用约定,因为它是现有解决方案的一部分。因此,我尝试将openssl的调用约定更改为_stdcall。但我做不到,它最终导致了以下构建错误 \crypto\ui\ui\u openssl.c(591):错误C2440:“函数”:无法
static void pushsig(void)
{
#ifndef OPENSSL_SYS_WIN32
int i;
#endif
#ifdef SIGACTION
struct sigaction sa;
memset(&sa,0,sizeof sa);
sa.sa_handler=recsig;
#endif
#ifdef OPENSSL_SYS_WIN32
savsig[SIGABRT]=signal(SIGABRT,recsig); // **line 591**
savsig[SIGFPE]=signal(SIGFPE,recsig); // **line 592**
savsig[SIGILL]=signal(SIGILL,recsig);
如何使用_stdcall(/Gz)调用约定构建openssl库?或者有其他解决办法吗
注意:信号是一个windows API(调用约定为_cdecl)。请参考此链接
谢谢,
Sathish.从命令行更改默认调用约定是一件非常不寻常的事情。我认为你有两个选择:
\uu cdecl
\uu stdcall
将来,当您在项目中引入其他第三方库时,选项2将大大减少您的麻烦。对于dll的使用者来说,在头文件中显式标记函数也将更加可靠,而不是依赖默认调用约定不设置为通常值
\uuu cdecl
混合使用不同调用约定的代码是没有问题的,在尝试更改调用约定之前,最初的链接器错误是什么?以下是将openssl.lib(\u cdecl调用约定)链接到dll(\u stdcall调用约定)时观察到的链接器错误。错误LNK2001:未解析的外部符号_HMAC_CTX_cleanup@4错误LNK2001:未解析的外部符号_HMAC_Final@12错误LNK2001:未解析的外部符号_HMAC_Update@12错误LNK2001:未解析的外部符号_HMAC_Init_ex@20