Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接Openssl库(调用约定\u cdecl)与dll(调用约定\u stdcall)_C++_Windows_Dll_Openssl_Calling Convention - Fatal编程技术网

C++ 链接Openssl库(调用约定\u cdecl)与dll(调用约定\u stdcall)

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:“函数”:无法

我正在将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)'

导致生成错误的代码行包括:

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.

从命令行更改默认调用约定是一件非常不寻常的事情。我认为你有两个选择:

  • 浏览openssl头文件,并将所有函数明确标记为
    \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