簡體   English   中英

鏈接Openssl庫(調用約定_cdecl)和dll(調用約定_stdcall)

[英]Linking Openssl library(calling convention _cdecl) with a dll(calling convention _stdcall)

我將openssl庫(openssl.lib)包含到dll中。 生成此dll時,發現很少的鏈接器錯誤。 我調試發現鏈接器錯誤是由於dll的調用約定引起的。 我的dll使用_stdcall調用約定,而openssl使用_cdecl調用約定。 由於它是現有解決方案的一部分,因此無法更改dll的調用約定。 因此,我嘗試將openssl的調用約定更改為_stdcall。 但是我做不到,最終導致了以下構建錯誤。

\\ crypto \\ ui \\ ui_openssl.c(591):錯誤C2440:'function':無法從'void(__stdcall *)(int)'轉換為'void(__cdecl *)(int)'。\\ crypto \\ ui \\ ui_openssl .c(591):警告C4024:'信號':形式參數和實際參數2的不同類型。\\ crypto \\ ui \\ ui_openssl.c(591):錯誤C2440:'=':無法從'void(__cdecl *)轉換(int)'到'void(__stdcall *)(int)'。\\ crypto \\ ui \\ ui_openssl.c(592):錯誤C2440:'function':無法從'void(__stdcall *)(int)'轉換為'無效(__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庫? 還是對此有其他解決方案?

注意: signal是Windows API(調用約定是_cdecl)。 請參考此鏈接https://msdn.microsoft.com/en-us/library/xdkz3x12.aspx

謝謝,Sathish。

從命令行更改默認調用約定是一件很不尋常的事情。 我認為您有2種選擇:

  1. 瀏覽openssl頭文件,並將所有功能明確標記為__cdecl
  2. 刪除調用約定命令行選項,並使用__stdcall明確標記項目中需要stdcall的函數

當您在項目中引入其他第三方庫時,選擇2將使您以后的麻煩減少很多。 對於dll的使用者,在標頭中顯式標記函數也將更加可靠,而不是依賴於默認的調用約定未設置為__cdecl的通常值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM