2010-10-29 235 views
2

在学习了关于类和指针的更多信息之后,我重构了一个程序并清除了> 200行代码,并创建了另外两个类LocationPiece。问题是,让一切来编译后,链接器抱怨说,为Piece的构造函数定义多次,错误的负载:多重定义错误

In function 'Piece':           board.o 
multiple definition of 'Piece::Piece(int)`     char_traits.h 
In function 'Piece':           board.o 
multiple definition of 'Piece::Piece(int)`     piece.cpp 
In function 'Piece':           player.o 
multiple definition of 'Piece::Piece(int)`     piece.cpp 
In function 'Piece':           player.o 
multiple definition of 'Piece::Piece(int)`     piece.cpp (yes, same exact error!) 
In function 'Piece':           refereee.o 
multiple definition of 'Piece::Piece(int)`     char_traits.h 
In function 'Piece':           referee.o 
multiple definition of 'Piece::Piece(int)`     piece.cpp 
... 

当我点击了错误char_traits.h,它带给我这个:

static size_t 
length(const char_type* __s) //error points here to line 262 
{ return __builtin_strlen(__s); } 

另一个char_traits.h使我

static int 
    compare(const char_type* __s1, const char_type* __s2, size_t __n) //line 258, error points here too 
    { return __builtin_memcmp(__s1, __s2, __n); } 

而只是让你知道,location.h是唯一个(包括piece.h在内的其他文件间接包含piece.h),board.h是唯一包含location.h的类,并且一堆类包含board.h

我尝试将头文件后卫更改为_OTHELLO_PIECE_H,并尝试将该类重命名为OPiece(通过IDE)。没有解决问题。

有趣的是,其中一个错误有一个“in function'OPiece':”,之后我的IDE放入chatter.o,即使chatter.h和chatter.cpp都没有包含任何包含OPiece的东西。

任何想法可能会导致此重新定义错误?

+0

您是否尝试重建整个项目?有关OPiece的错误消息可能是由过时的预编译头引起的。 – Vlad 2010-10-29 17:34:13

回答

4
  1. 重建一切
  2. 查找片::片,并删除所有例如来自头文件 2b。从来没有的#include .cpp文件
  3. 查找的#define解析拼凑
+0

#2解决了它!我意外地在“location.h”中包含了“piece.cpp”。谢谢! – wrongusername 2010-10-30 02:58:27

+0

哦,等待......编译输出中仍然存在重定义错误,只是qt创建者不再在构建问题中显示它。我想我会问一个新的问题 – wrongusername 2010-10-30 03:02:42

2

多功能定义错误的最常见原因是将函数定义放在头文件中,并忘记使其成为inline

我不会担心太多char_traits.h - 这可能意味着由于某些模板绕行,链接程序找不到一个更好的地方来声明该特定对象文件中发生的定义。

1

您应该将构造函数的执行置于piece.cpp中,而不是直接存储在piece.h中。

0

只是一个猜测:你使用#include还是你使用#import意外 - 这发生在我身上一次:-)

1

有两个地方在一个典型的构建来实现Piece::Piece(int)

1)的接口(在声明)

class Piece { 
    int d_a; 
public: 
    Piece(int a) : d_a(a) { 
    } 
    /* ... */ 
}; 

2)在专用的cpp文件中

in Piece。HPP

class Piece { 
    int d_a; 
public: 
    Piece(int a); 
    /* ... */ 
}; 

在Piece.cpp

Piece::Piece(int a) : d_a(a) { 
} 

但是,模板的定义不同。

该错误通常表示Piece::Piece(int a) : d_a(a) {}包含在多个cpp文件中。

生成的每个目标文件都将符号Piece::Piece(int)添加到可见的位置。

在构建结束时,所有对象被合并/链接以创建最终的二进制文件或可执行文件。那么链接程序就会发现有这个定义的副本并产生错误。

一个快速的方法来诊断,这是(假设你的版本不会需要很长时间):

#warning Piece::Piece(int) is visible here 
Piece::Piece(int a) : d_a(a) { 
} 

只有一个警告拉高。如果发布更多,则编译器可能会提供一些信息(如包含订单)。