我正在尝试构建一个用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)
希望这更清楚。
答案 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
请注意,当您将库链接到另一个程序时,主机程序将查找装饰名称。您可能需要未修饰名称的主要情况是,您希望用户使用LoadLibrary
和GetProcAddress
加载您的DLL。
答案 3 :(得分:0)
如果没有看到你所谓的“名称错误”,我猜你必须将Visual Studio设置为Compile as C Code (/TC)
。
它在Properties->C/C++->Advanced->Compile As
。您可以为整个项目选择此设置,因为这是您的意图。