"C++编译器错误的多重定义

Cha*_*had 16 c++ linker

在我的一个课程中,我似乎无法摆脱这些看似随意的编译错误.我得到了4个错误,例如:

multiple definition of `draw_line(float, float, float, float)'
Run Code Online (Sandbox Code Playgroud)

multiple definition of `near_far_clip(float, float, float*, float*, float*, float*, float*, float*)'
Run Code Online (Sandbox Code Playgroud)

在方法中间标记的.

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

我尝试将容易出错的文件分成.h和.cpp文件(最初只是一个.cpp)而且错误没有改变......

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

任何想法可能是什么?

好吧,我得到了代码:

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

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


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

multiple definition of `draw_line(float, float, float, float)'
Run Code Online (Sandbox Code Playgroud)

multiple definition of `near_far_clip(float, float, float*, float*, float*, float*, float*, float*)'
Run Code Online (Sandbox Code Playgroud)

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

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

str*_*ger 34

您可能在头文件中包含函数定义.包含inline关键字,以便它们不会被每个目标文件导出,或者将它们放在自己的.cpp文件中.

对于全局变量,您需要extern在头文件中使用关键字.否则,每个目标文件都会导出它们自己的变量,并且链接器会混淆哪个是正确的变量.


Tho*_*day 14

你为什么在ThreeD.cpp中#include lines.cpp?这很不寻常.

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

在lines.cpp中有一个有趣的注释:

Don't forget to put declarations in your .h files. 
Run Code Online (Sandbox Code Playgroud)

我认为教师希望你将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 *);
Run Code Online (Sandbox Code Playgroud)

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

  • 别客气.现在走出去,给我们画一些很棒的盒子! (3认同)