我有一个程序调用一组函数,如下所示:
int _stdcall VB_Create(char*);
int _stdcall VB_Open(unsigned int, unsigned int, unsigned int, unsigned int);
...
...
如果名称修饰不匹配,链接器会显示如下错误:
error LNK2019: unresolved external symbol "int __stdcall VB_Create(char *)" (?VB_Create@@YGHPAD@Z) .....
我的理解是_stdcall
语法是'_' + 'name of the function' + '@' + 'number of arguments * 4'
。
那么,为什么链接器要求?VB_Create@@YGHPAD@Z
名称装饰?这是什么标准?
答案 0 :(得分:2)
这是Visual C++ name mangling(我不知道MSDN上有一个官方页面来描述编码;我找不到一个。)
C ++函数不仅需要将其名称编码到最终存在于二进制文件中的符号中:这些符号必须是唯一的,但C ++函数名称不必是唯一的。除了其他原因,C ++函数可以重载,您可以在不同的命名空间中使用相同名称的函数,并且您必须能够处理成员函数。
编译器使用紧凑的编码方案,就像这样,可以唯一地识别函数。
答案 1 :(得分:2)
詹姆斯已经说过了:这是一个名字错误的问题。放一个
#ifdef __cplusplus
extern "C" {
#endif
之前和之后
#ifdef __cplusplus
}
#endif
函数声明后。这将关闭C ++名称修改。 FWIW,__stdcall
与此无关,尽管它是VB,IIRC所必需的。