無法解析的外部符號int __cdecl test(void const *,int)解決過程

場景

        將DLL模塊代碼整合到已有的調用工程中,鏈接過程中出現如下錯誤:

錯誤 LNK2019 無法解析的外部符號 "int __cdecl Add(void const *,int)" 該符號在函數 "public: __int64 __thiscall Test(struct PARAMS_T,struct RESULT_t &)"
中被引用

原因

        Add函數聲明如下:

 int  Add(void const* p , int timeout = 0);

實現接口如下:

 int  Add(void const* p){}

說明函數聲明跟實現接口不一致,導致的問題

修改如下: int  Add(void const* p, int timeout){}

重點分析:編譯器默認的是__cdecl,所以纔會有Add前面的限定符。

 _cdecl是C和C++程序的缺省調用方式。每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。函數採用從右到左的壓棧方式。VC將函數編譯後會在函數名前面加上下劃線前綴。
    _stdcall是Pascal程序的缺省調用方式,通常用於Win32 Api中,函數採用從右到左的壓棧方式,自己在退出時清空堆棧。VC將函數編譯後會在函數名前面加上下劃線前綴,在函數名後加上"@"和參數的字節數。
    _fastcall方式的函數採用寄存器傳遞參數,VC將函數編譯後會在函數名前面加上"@"前綴,在函數名後加上"@"和參數的字節數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章