【问题标题】:ld: duplicate symbols for architecture x86_64 when defining a global var in a headerld:在标头中定义全局变量时架构 x86_64 的重复符号
【发布时间】:2015-08-01 21:21:56
【问题描述】:

如何解决这个问题?

刚刚收到以下错误:

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

【问题讨论】:

  • 您是否在其他文件中包含.cpp 文件?你的.h 有标题保护吗?我们不能仅凭这些错误就知道。
  • 不,我们不包括任何 .cpp 文件。
  • 你是否在头文件中定义一个函数,而不是仅仅声明它?
  • 不,我们只是声明它们。它们在 .cpp 文件中定义

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


【解决方案1】:

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

常见情况/陷阱:

  • 全局变量前缺少extern
  • 具有功能实现(即具有void foo(Bar& b) {} 而不是void foo(Bar& b);

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

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

编辑

更多细节

class Game
{
   (zip)
}game;

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

使用

class Game
{
   (zip)
};

在头文件和cpp中的Game game;

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

【讨论】:

  • addnewtile 是一个类而不是一个函数
  • 我们不使用全局变量,头文件中没有函数实现
【解决方案2】:

您已经在头文件“Game.h”中实例化了一个Game 实例,并且由于它包含在多个文件中,因此您最终会在链接时获得多个game 实例。变化:

class Game
{
  public:

  ...

}game;

到:

class Game
{
  public:

  ...

};

extern Game game;

然后添加:

Game game;

在您的 一个 .cpp 文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    相关资源
    最近更新 更多