Неразрешенная ошибка компоновщика с внешней переменной extern'ed в нескольких исходных файлах

У меня есть нерешенная ошибка внешнего символа, которая, похоже, не может найти источник. Я пытаюсь дать глобальный доступ к классу Engine, объявив экземпляр Engine для внешней привязки (g_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();
}

EDIT: добавлен комментарий к конструктору

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.
}

EDIT: Добавлен 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" ([email protected]@[email protected]@A) map.obj.
+1
источник поделиться

Посмотрите другие вопросы по меткам или Задайте вопрос