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的主要内容,如果未能解决你的问题,请参考以下文章

EVC4.0编译错误:LNK2005

LNK2005 错误,因为我有两个并行运行的 c++ 窗口

关于LNK2005的错误

c++链接器错误LNK2005已经在SDL中定义

带有矢量的 LNK2005 错误

error:LNK2005 已经在*.obj中定义