无法防止名称损坏

时间:2011-11-03 07:09:26

标签: c visual-studio dll name-mangling

我正在尝试构建一个用C语言编写的dll,它将由其他用C语言编写的程序导入。

因此,dll导出的所有函数都是在.dll “没有__declspec(dllexport)”(故意)中定义的。我已经定义了一个.def文件,其中只包含一个导出部分和我要导出的函数的名称(未编码的名称)。

我正在使用vc71 / vs2003来构建这个并且我仍然会受到损坏的名称(如果我在记事本中打开.lib,我可以看到)。同样只是为了澄清,visual studio也会导致C代码中的名称损坏(我发现大多数资源都提到它只是C ++的一个问题)。

如何防止此名称损坏?

更多信息:

错位名称的格式为'functionName @ integer',其中integer表示以字节为单位的参数大小(而不是序数)。例如,

来自.lib: _PrepareSeverResponse @ 8

.h中的函数声明: char * PrepareSeverResponse(unsigned int * size,handshake * ws_handshake);

.DEF: EXPORTS     PrepareSeverResponse

调用约定: __stdcall(/ Gz)

希望这更清楚。

4 个答案:

答案 0 :(得分:5)

将调用约定更改为cdecl对我有用。 extern“C”解决方案对我没什么帮助,因为在我的情况下问题是在编译.C文件时名称错误,好像我正确理解外部“C”解决方案是为了在编译cpp时抑制名称错位文件。

答案 1 :(得分:2)

为了防止名称错位,您需要使用extern C包装标题:

#ifdef __cplusplus
extern "C" {
#endif


//  Headers


#ifdef __cplusplus
}
#endif

这将强制符号为其C风格(未编码)名称。

答案 2 :(得分:2)

你看到的名称错误与C ++无关;它是微软的调用约定name decoration,也适用于C代码。您可以{。{3}}返回.DEF文件:

EXPORTS
  PrepareServerResponse=_PrepareSeverResponse@8
  _PrepareSeverResponse@8

请注意,当您将库链接到另一个程序时,主机程序将查找装饰名称。您可能需要未修饰名称的主要情况是,您希望用户使用LoadLibraryGetProcAddress加载您的DLL。

答案 3 :(得分:0)

如果没有看到你所谓的“名称错误”,我猜你必须将Visual Studio设置为Compile as C Code (/TC)

它在Properties->C/C++->Advanced->Compile As。您可以为整个项目选择此设置,因为这是您的意图。