无法解析的外部符号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将函数编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数。

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