ld:体系结构x86_64的重复符号

时间:2015-05-20 14:38:52

标签: c++ macos duplicates x86-64 symbols

如何解决这个问题?

只是出现以下错误:

g ++输出:

duplicate symbol _game in:
    /var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/main-62666f.o
    /var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/Game-a5a31d.o
duplicate symbol _game in:
    /var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/main-62666f.o
    /var/folders/w6/yqp0s0t92hl5g842hg8tztfr0000gn/T/Write-83f8ee.o

似乎问题不在头文件中。

编辑:标题文件如下所示:

#ifndef GAME_H
#define GAME_H
#include "Color.h"
#include "Tile.h"

class Game
{
  public:

    Game();
    ~Game();
    Color getActivePlayer();
    void setStarttile(Tile Firststarttile);
    Color togglePlayer();
    void setRunning(bool run);
    char newActiveplayer;
    void run();
    void runsecondmethod();

  private:
    Game(const Game &);
    Color Activeplayer;
    Tile *Starttile;
    bool Running;
}game;

#endif

2 个答案:

答案 0 :(得分:2)

您已在头文件" Game.h"中实例化了Game个实例,并且由于这个实例包含在多个文件中,因此最终会有game个多个实例链接时间。变化:

class Game
{
  public:

  ...

}game;

为:

class Game
{
  public:

  ...

};

extern Game game;

然后添加:

Game game;

一个的.cpp文件中。

答案 1 :(得分:0)

在你的头文件(Write.cpp和GameBoard.cpp中包含的头文件)中,你可能会有一个实例而不是一个声明。

常见案例/陷阱:

  • 在全局变量之前缺少extern
  • 具有功能实现(即void foo(Bar& b) {}代替void foo(Bar& b);

没有更多细节,很难帮助......

查找定义addnewtile函数的位置,例如......

修改

了解更多详情

class Game
{
   (zip)
}game;

这是在每次包含头文件时声明类游戏并创建游戏对象。

使用

class Game
{
   (zip)
};

在头文件中和cpp中的Game game;

或使用单例模式/静态实例。