Visual C ++错误LNK2019

时间:2012-10-27 09:57:47

标签: c++ c visual-studio-2010

好的,所以我一直使用gcc编译器。这是我用这个IDE的第一个项目。我的项目组织如下:

main.cpp其中包含a.h a.c,其中包含a.h并实现a.h

中声明的方法

当我编译它时,我得到以下内容:

1>main.obj : error LNK2019: unresolved external symbol "void __cdecl destroyPlayer(struct player *)" (?destroyPlayer@@YAXPAUplayer@@@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "void __cdecl drawPlayer(struct player *)" (?drawPlayer@@YAXPAUplayer@@@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "void __cdecl movePlayer(struct player *,int *)" (?movePlayer@@YAXPAUplayer@@PAH@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "struct player * __cdecl createPlayer(int,int)" (?createPlayer@@YAPAUplayer@@HH@Z) referenced in function _main

这些是a.h中的所有功能。使用GCC命令行,我可以将它们编译在一起。所有文件都添加到项目中。我错过了什么吗?

2 个答案:

答案 0 :(得分:7)

错误消息不言自明:

未解析的外部符号“void __ cdecl destroyPlayer ...

你有main.cpp和a.c。

对于main.cpp链接器,期望在a.h中声明的所有函数都使用C ++名称修改和C ++调用约定,而对于a.c链接器,则期望在a.h中声明的所有函数都使用C命名和__cdecl调用约定。

如果您在a.c中的代码没有使用C ++功能,并且您想从使用C ++功能的main.cpp中调用它,那么在a.h中您需要添加以下内容:

#ifdef __cplusplus
extern "C" {
#endif

// your function declarations

#ifdef __cplusplus
}
#endif

或者,如果您不需要混合使用C和C ++,请将所有文件重命名为.c或.cpp。

最后,确保文件实际上已重命名,因为Visual Studio支持“虚拟”重命名(仅在项目中,而不重命名实际文件)。

答案 1 :(得分:4)

我相信Visual Studio会自动将.c个文件编译为C文件,因此名称修改可以在其中起作用。尝试将a.c重命名为a.cpp,看看是否有帮助。