場景
將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將函數編譯後會在函數名前面加上"@"前綴,在函數名後加上"@"和參數的字節數。