G++:"Undefined Reference to" 错误
G++: "Undefined Reference to" error
注意:我知道这里有很多与此类似的问题,但我已经查看了所有问题,但无济于事。
所以,我有一个简单的 单例 GameManager class 分成 .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*
类型的静态变量。现在它驻留在一个头文件中(本身没有编译),它只是一个声明:"a global variable named _instance
of type GameManager*
does exist".
但是分配给_instance
的space在哪里呢?它是一个静态变量,因此它没有附加到对象的特定实例,它必须驻留在最终二进制文件中的某个位置。
为了能够使用 _instance
,您必须在翻译单元中为其提供静态 space。所以你必须在源文件中定义变量(编译的,不像头文件)。
解决方案就是在 .cpp 中加入(可能 GameManager.cpp
):
GameManager* GameManager::_instance = nullptr;
注意:我知道这里有很多与此类似的问题,但我已经查看了所有问题,但无济于事。
所以,我有一个简单的 单例 GameManager class 分成 .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*
类型的静态变量。现在它驻留在一个头文件中(本身没有编译),它只是一个声明:"a global variable named _instance
of type GameManager*
does exist".
但是分配给_instance
的space在哪里呢?它是一个静态变量,因此它没有附加到对象的特定实例,它必须驻留在最终二进制文件中的某个位置。
为了能够使用 _instance
,您必须在翻译单元中为其提供静态 space。所以你必须在源文件中定义变量(编译的,不像头文件)。
解决方案就是在 .cpp 中加入(可能 GameManager.cpp
):
GameManager* GameManager::_instance = nullptr;