“多重定义”C编译器错误

新手上路,请多包涵

我似乎无法在我的一门课程中摆脱这些看似随机的编译错误。我收到大约 4 个错误,例如:

 multiple definition of `draw_line(float, float, float, float)'

multiple definition of `near_far_clip(float, float, float*, float*, float*, float*, float*, float*)'

在方法中间标记的。

我也一直在另一种方法的中间得到 multiple definition of `stack'stack 是完全不同文件中的全局变量。我收到错误的文件中甚至都没有提到它。

我尝试将容易出错的文件分成 .h 和 .cpp 文件(最初只是一个 .cpp),但没有任何关于错误的改变……

我没有重复的方法。我只有一个 #include 的lines.h,并且开头有一个 #ifndef 子句。所有这些错误都出现在 .cpp 文件中。

有什么想法吗?

好吧,我得到了代码:

lines.cpp 是我从导师那里收到的转换后的 .c 文件。我包含了 makefile 以防万一,因为我总是遇到问题。我还准确地注释了文件中错误标记的位置,但它们看起来很随机,所以我不知道它是否特别重要。我放弃了 .h 文件,因为它没有解决任何问题或提供帮助。我相信没有它会更容易找到错误。

这是请求的 main.cpp 文件(没有 .h)。


我重新制作了lines.h文件,因为我仍然收到:

 multiple definition of `draw_line(float, float, float, float)'

multiple definition of `near_far_clip(float, float, float*, float*, float*, float*, float*, float*)'

lines.cpp 文件中的错误,但 multiple definition of `stack' 错误现在位于 ThreeD.cpp 文件中的随机位置(并且现在由注释标记)。 更新: 此错误已得到修复,文件已修改为显示:

我搞砸了一些全局变量 extern 的标签,但它似乎没有影响任何东西。

原文由 Chad 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 705
2 个回答

为什么要在 ThreeD.cpp 中 #includelines.cpp?这是非常不寻常的。

你的makefile 需要lines.o,所以你要编译lines.cpp。在lines.cpp 中定义的任何内容都将在lines.o 和ThreeD.o 中。

在lines.cpp 中有一个有趣的评论:

 Don't forget to put declarations in your .h files.

我认为讲师希望您将lines.cpp 分解为.h 和.cpp。

摘自lines.cpp:

 /* These go in your .h file or in lines.h */
/*

Line drawing header.

*/

void draw_line(float, float, float, float);
int near_far_clip(float, float, float *, float *, float *, float *,
                  float *, float *);

我怀疑这两个声明是应该在lines.h 中的唯一内容。

原文由 Thomas L Holaday 发布,翻译遵循 CC BY-SA 2.5 许可协议

#ifndef THREED_H_
#define THREED_H_
#endif /* THREED_H_ */

删除或评论这些行,这对我有用

原文由 Gaurav Maan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题