【问题标题】:Clang linking error for C++ static class: undefined symbolsC++ 静态类的 Clang 链接错误:未定义的符号
【发布时间】:2013-12-24 16:42:03
【问题描述】:

我有一个用于状态驱动游戏的静态类,在使用 XCODE 编译时,我收到了这个链接器错误:

Undefined symbols for architecture x86_64:
  "Game::_gameState", referenced from:
      Game::Start() in Game.o
      Game::IsExiting() in Game.o
      Game::GameLoop() in Game.o
  "Game::_mainWindow", referenced from:
      Game::Start() in Game.o
      Game::GameLoop() in Game.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我对 C++ 的理解非常有限,而且每当我尝试使用它时,我总会发现自己遇到了奇怪的怪癖。我不确定如何定义这些符号并将其保留为静态类。我试图在类定义之外定义它们但没有运气,我做错了什么?

来源:

游戏.hpp

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>

class Game
{
public:
    static void Start();

    static bool IsExiting();
    static void GameLoop();

    enum GameState { Uninitialized, ShowingSplash, 
               Paused, ShowingMenu, Playing, Exiting };

    static GameState _gameState;
    static sf::RenderWindow _mainWindow;
};

游戏.cpp

#include "Game.hpp"

void Game::Start()
{
    if(_gameState != Uninitialized)
        return;

    _mainWindow.create(sf::VideoMode(1024, 768, 32), "This game!");
    _mainWindow.setVerticalSyncEnabled(true);
    _gameState = Playing;

    while(!IsExiting())
    {
        GameLoop();
    }

    _mainWindow.close();
}

bool Game::IsExiting()
{
    if(_gameState == Exiting)
        return true;
    else
        return false;
}

void Game::GameLoop()
{
    sf::Event currentEvent;
    while(_mainWindow.pollEvent(currentEvent))
    {
        switch(_gameState)
        {
            case Playing:
            {
                _mainWindow.clear(sf::Color::Black);
                _mainWindow.display();

                if(currentEvent.type == sf::Event::Closed)
                {
                    _gameState = Game::Exiting;
                }
                break;
            }
        }
    }
}

【问题讨论】:

  • 想知道所有成员都是静态和公共的类的意义何在。如果这就是您想要的,那么只需编写全局函数和全局变量。你甚至可以把 Game 变成一个命名空间。
  • 我在实验中删除了 private 子句,试图让它发挥作用。但我把它放回去了。

标签: c++ xcode linker sfml


【解决方案1】:

您需要在class 声明之外定义static 成员:

在 Game.cpp 中:

Game::GameState Game::_gameState;
sf::RenderWindow Game::_mainWindow;

对于所有这些publicstatic 方法,也许Game 不应该是class,而是namespace

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2013-03-20
    • 2022-12-12
    相关资源
    最近更新 更多