[英]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種選擇:
__cdecl
__stdcall
明確標記項目中需要stdcall的函數 當您在項目中引入其他第三方庫時,選擇2將使您以后的麻煩減少很多。 對於dll的使用者,在標頭中顯式標記函數也將更加可靠,而不是依賴於默認的調用約定未設置為__cdecl
的通常值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.