多个源文件中的extern'ed全局变量未解决的链接器错误

时间:2013-08-14 14:03:07

标签: c++ extern

我有一个未解决的外部符号错误,我似乎无法找到源关闭。 我试图通过声明Engine的实例具有外部链接(g_engine)来提供对Engine类的全局访问。我的main.cpp文件是唯一定义此实例的文件(据我所知)。这很好。但是当我在另一个源文件中对g_engine上的方法添加调用时,我收到链接器错误。

engine.hpp:

#include <other_stuff>
#include "Map.hpp"

class Engine
{
public:
  std::shared_ptr<Map> map;
  void run();
  void do_stuff();
  // other methods
};

extern Engine g_engine;  // Declared in header file

main.cpp中:

#include "engine.hpp"

Engine g_engine;  // Defined only here

int main()
{
  g_engine.run();
  return 0;
}

map.hpp:

// Only includes standard headers

class Map
{
  void some_func();
}

编辑:为构造函数添加了评论

map.cpp:

#include "engine.hpp"

Map::Map()
{
  // Calls some_func somewhere.
}

void Map::some_func()
{
  // g_engine.do_stuff()  <--- Uncommenting this line causes a linker error.
}

编辑:添加了Engine.cpp

Engine.cpp:

Engine::Engine()
{
  map = std::make_shared<Map>();
}

void Engine::run()
{
  // unrelated code
}

注释掉该行,没有给出错误,应用程序运行正常。取消注释该行时,编译很好,但会给出链接器错误:

Error   1   error LNK2001: unresolved external symbol "class Engine g_engine" (?g_engine@@3VEngine@1@A) map.obj.

1 个答案:

答案 0 :(得分:3)

未修饰时,?g_engine@@3VEngine@1@Aclass Engine::Engine g_engine。你在某个地方缺少名称空间吗?