G++:"Undefined Reference to"错误

G++: "Undefined Reference to" error

本文关键字:to 错误 Reference Undefined G++      更新时间:2023-10-16

注意:我知道这里有很多类似的问题,但我都看了,但都没有用。

因此,我有一个简单的singleton GameManager类,它被拆分为和.h和一个.cpp文件。

GameManager.h

#ifndef _GM_H_
#define _GM_H_
#include <iostream>
/**
 * Singleton GameManager class.
 *
 **/
class GameManager {
    //Private Variables
    private:
        static GameManager* _instance;
        int _gameObjects;
    //Private Methods
    private:
        GameManager();
        ~GameManager();
    //Public Methods and Functions
    public:
        static GameManager* instance()
        {
            if (!_instance) 
                _instance = new GameManager();
            return _instance;
        }
        //Placeholders
        void addObject();
        int getObjects();
};
#endif

GameManager.cpp

#include "GameManager.h"
#include <iostream>

GameManager::GameManager()
{
    _gameObjects = 0 ;
}
void GameManager::addObject()
{
    _gameObjects += 1;
}
int GameManager::getObjects()
{
    return _gameObjects;
}

main.cpp

#include "GameManager.h"
#include <iostream>
#include <string>

int main(int argc, char** argv)
{
    GameManager::instance();
    GameManager::instance()->addObject();
    std::cout << GameManager::instance()->getObjects() << std::endl;
    return 0;
}

当我尝试使用编译这个

g++ main.cpp GameManager.cpp

我得到错误

/tmp/cctNvscU.o: In function `GameManager::instance()':
main.cpp:(.text._ZN11GameManager8instanceEv[_ZN11GameManager8instanceEv]+0x9): undefined reference to `GameManager::_instance'
main.cpp:(.text._ZN11GameManager8instanceEv[_ZN11GameManager8instanceEv]+0x29): undefined reference to `GameManager::_instance'
main.cpp:(.text._ZN11GameManager8instanceEv[_ZN11GameManager8instanceEv]+0x2e): undefined reference to `GameManager::_instance'
collect2: error: ld returned 1 exit status

感谢您的帮助。提前谢谢。

    static GameManager* _instance;

这声明了一个类型为GameManager*的静态变量。现在它驻留在一个头文件中(本身不是编译的(,它只是一个声明:"确实存在一个名为GameManager*类型的_instance的全局变量"。

但分配给_instance的空间在哪里?它是一个静态变量,所以它不附加到对象的特定实例,它必须位于最终二进制文件中的某个位置。

为了能够使用_instance,您必须在翻译单元内为其提供静态空间。因此,您必须在源文件中定义变量(它是经过编译的,而不是像头一样(。

解决方案只是在.cpp中(可能是GameManager.cpp(:

GameManager* GameManager::_instance = nullptr;