我有一个程序,它调用如下一组函数:
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
名称装饰?这是什么标准?
这是Visual c++名称混淆(我不知道MSDN上是否有官方页面来描述编码;我找不到。
c++函数需要的不仅仅是将其名称编码到二进制文件中的符号中:这些符号必须是唯一的,但c++函数的名称不必是唯一的。除其他原因外,c++函数可以重载,可以在不同的命名空间中使用相同名称的函数,并且必须能够处理成员函数。
编译器使用一个紧凑的编码方案,就像这样,这样函数可以被唯一地标识。
James已经说过了:这是一个名字混淆的问题。把
#ifdef __cplusplus
extern "C" {
#endif
和
#ifdef __cplusplus
}
#endif
函数声明后的。这将关闭c++名称混淆。FWIW, __stdcall
与此无关,尽管它是VB, IIRC所需要的。