C/C++ 混合程序中的错误 LNK2005 和错误 LNK2019
Posted
技术标签:
【中文标题】C/C++ 混合程序中的错误 LNK2005 和错误 LNK2019【英文标题】:error LNK2005 and error LNK2019 in C/C++ mix program 【发布时间】:2013-12-03 19:26:40 【问题描述】:一个程序有:raw_mouse.h、raw_mouse.c RawInputRegistry.h RawInputRegistry.cpp和main.cpp
在raw_mouse.h中,
我定义了:
typedef WINUSERAPI INT (WINAPI *pGetRawInputDeviceList)(OUT PRAWINPUTDEVICELIST pRawInputDeviceList, IN OUT PINT puiNumDevices, IN UINT cbSize);
void testme();
在 raw_mouse.c 我有:
_RRID = (pRegisterRawInputDevices)GetProcAddress(user32,"RegisterRawInputDevices");
void testme()
int a =10;
我在raw_mouse.c中加入了raw_mouse.h,在RawInputRegistry.h中也加入了raw_mouse.h,最后在main.cpp中加入了RawInputRegistry.h
但是,我收到了以下错误:
RawInputRegistry.obj : error LNK2005: "int (__stdcall* _GRID)(struct HRAWINPUT__ *,unsigned int,void *,int *,unsigned int)" (?_GRID@@3P6GHPAUHRAWINPUT__@@IPAXPAHI@ZA) already defined in main.obj
RawInputRegistry.obj : error LNK2019: unresolved external symbol "void __cdecl testme(void)" (?testme@@YAXXZ) referenced in function "protected: __thiscall RawInputEventRegistry::RawInputEventRegistry(void)" (??0RawInputEventRegistry@@IAE@XZ)
不确定是否应该使用 extern "C" 来包含 raw_mouse.c 中的所有代码?
【问题讨论】:
【参考方案1】:不确定我是否应该使用 extern "C" 来包含 raw_mouse.c 中的所有代码?
你必须说些话。将以下内容添加到您的raw_mouse.h
文件中,使其同时符合c++ 和c #include
:
#ifndef RAW_MOUSE_H__
#define RAW_MOUSE_H__
#ifdef __cplusplus
extern "C"
#endif
/* Your C function declarations go here ... */
#ifdef __cplusplus
#endif
#endif /* RAW_MOUSE_H__ */
【讨论】:
我认为添加你的代码后大部分问题都已经解决了。但是,第一个错误似乎仍然存在:RawInputRegistry.obj : error LNK2005: __GRID already defined in main.obj @lightrek 不知道专门针对 VS2010,但通常有一些链接器选项允许多个符号定义(覆盖链接库中的弱符号)。另一种可能性是您真的有一个不需要的多重定义。抱歉,我无法从您在问题中显示的代码中分辨出?_GRID@@3P6GHPAUHRAWINPUT__@@IPAXPAHI@ZA
是什么。
在将 typedef WINUSERAPI INT (WINAPI *pGetRawInputDeviceList)(OUT PRAWINPUTDEVICELIST pRawInputDeviceList, IN OUT PINT puiNumDevices, IN UINT cbSize);
从 raw_mouse.h 移动到 raw_mouse.c 后,错误消失了。但是还是不知道为什么会这样?
@lightrek 原因是一些愚蠢的 M$ 编译器预处理废话很可能...以上是关于C/C++ 混合程序中的错误 LNK2005 和错误 LNK2019的主要内容,如果未能解决你的问题,请参考以下文章