3

ソースを見つけられないように見える未解決の外部シンボル エラーがあります。Engine のインスタンスが外部リンケージ ( ) を持つように宣言することにより、Engine クラスへのグローバル アクセスを許可しようとしていますg_engine。私の main.cpp ファイルは、このインスタンスを定義する唯一のファイルです (私が見つけた限り)。そして、それはうまくいきます。しかしg_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 : コンストラクターにコメントを追加

マップ.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 を追加

エンジン.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.
4

1 に答える 1

5

飾らない場合?g_engine@@3VEngine@1@Aは ですclass Engine::Engine g_engine。どこかに名前空間がありませんか?

于 2013-08-14T14:35:24.643 に答える