Неразрешенный внешний символ для переменных в пространстве имен

У меня проблема с LNK2001: неразрешенная ошибка внешнего символа. Он отображается только тогда, когда все мои классы находятся в моем пространстве имен, и ссылается на глобальные переменные, которые я использую в нескольких файлах. Вот пример кода, как выглядят мои коды:

Engine.h

#pragma once
namespace Engine{
    #include "Core.h"
    #include "Display.h"
    #include "Box.h"
    // ... some code...
}
using namespace Engine;

Core.cpp

#include "Engine.h"
// ...some code...

Core.h

extern Matrix matrix;

// ... some code...

Display.cpp

#include "Engine.h"
Matrix matrix;

// ... some code...

Display.h

// ... some code...

Box.cpp

void Box::draw(PxShape *shape){
    // matrix=.. some code...
}

Box.h

// ... some code...

Сообщение об ошибке

1> Box.obj: ошибка LNK2001: неразрешенный внешний символ "struct Engine::Matrix Engine::matrix" (?matrix@Engine@@3UMatrix@1@A)

Когда я комментирую пространство имен, все работает как надо. Это первый раз, когда я хочу использовать пространства имен, и я понятия не имею, что с этим делать.


person Harry    schedule 06.07.2013    source источник
comment
Нет абсолютно никакой причины определять пространство имен Engine, если в том же заголовочном файле, который определяет это пространство имен, вы вводите все элементы пространства имен Engine в глобальное пространство имен.   -  person Oswald    schedule 06.07.2013
comment
Перед определением пространства имен я также включил некоторые сторонние библиотеки и стандартные заголовки C++, и я хотел указать, что эти классы предоставлены мной.   -  person Harry    schedule 06.07.2013


Ответы (1)


Ваши директивы #include (и, следовательно, определения вашего интерфейса) находятся внутри namespace Engine, но, похоже, ваши реализации - нет. Это дает вам ошибку ссылки.

Вам также нужно обернуть тело кода в каждый из этих файлов .cpp в namespace Engine.

ie:

 #include "engine.h"
 namespace Engine
 {
     // implementation goes here
 }
person Joe Z    schedule 06.07.2013
comment
Спасибо, я думал, что файлы .cpp автоматически включаются в пространство имен заголовков. - person Harry; 06.07.2013
comment
Спасибо! Это решило мою проблему. сэкономил кучу моего времени. - person Richa Aggarwal; 14.02.2017