2

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

main.cpp其中包括a.h a.cwhich 包含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 命令行,我可以将它们一起编译。所有文件都添加到项目中。我错过了什么吗?

4

2 回答 2

7

错误消息是不言自明的:

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

你有 main.cpp 和 ac

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

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

#ifdef __cplusplus
extern "C" {
#endif

// your function declarations

#ifdef __cplusplus
}
#endif

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

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

于 2012-10-27T12:56:51.737 回答
6

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

于 2012-10-27T10:02:07.847 回答