【发布时间】:2022-08-03 17:03:04
【问题描述】:
我已经开始为我的游戏制作引擎,但我遇到了一个无法修复的错误。 这些是我拥有的文件:
游戏.h
#pragma once
#include \"Core.h\"
namespace Honey
{
class HONEY_API Game
{
public:
virtual void OnExecute() { }
virtual void OnClose() { }
};
Game* CreateGamePtr();
#define IMPLEMENT_BASIC_GAME() \\
Honey::Game* Honey::CreateGamePtr() \\
{\\
return new Honey::Game(); \\
}
#define IMPLEMENT_GAME(GameClass) \\
Honey::Game* Honey::CreateGamePtr() \\
{\\
return new GameClass(); \\
}
}
引擎.h
#pragma once
#include \"Core.h\"
namespace Honey
{
class Game;
class HONEY_API Engine
{
public:
static bool Init();
void Update() const;
bool Shutdown();
inline static Engine* Get() { return s_Engine; }
inline Game* GetGame() const { return m_Game; }
private:
inline static Engine* s_Engine = nullptr;
Game* m_Game;
};
}
引擎.cpp
#include \"Engine.h\"
#include \"Game/Game.h\"
namespace Honey
{
extern Game* CreateGamePtr();
bool Engine::Init()
{
if (Get() || !(s_Engine = new Engine()) || !(s_Engine->m_Game = CreateGamePtr()))
return false;
Get()->GetGame()->OnExecute();
return true;
}
void Engine::Update() const
{
}
bool Engine::Shutdown()
{
if (!Engine::Get() || !GetGame())
return false;
GetGame()->OnClose();
delete this;
return true;
}
}
项目类型为 DLL。当尝试编译它时,它给了我这个链接错误:LNK2019:未解析的外部符号\"class Honey::Game__cdecl Honey::CreateGamePtr(void)\" (?CreateGamePtr@Honey@@YAPEAVGame@1@XZ) 在函数 \"public: static bool __cdecl Honey::Engine::Init(void)\" (?Init@Engine @亲爱的@@SA_NXZ)*
和,LNK1120:1 个未解决的外部因素
CreateGamePtr() 应该在游戏项目中声明,所以我正在外部化它,但它没有链接。我已经尝试修复它很长时间了,到目前为止没有任何效果。
-
这可能是关于微软特定导入/导出的stackoverflow.com/questions/12573816/… 部分。
-
s_Engine->m_Game = CreateGamePtr()你在这里调用了这个函数,但是当你只是在构建 dll 时链接器找不到它。也许更改函数,以便调用者需要将Game *传递给它,而不是调用CreateGamePtr()。 -
DLL 必须是完整的。您不能只是将缺少的函数声明为 extern 并期望 DLL 进行链接。
-
例如,您可以更改
init函数,使其接收指向 Game 对象的指针。 -
接受游戏指针修复它。 main(在 \"EntryPoint.h\" 中定义)调用实际的 CreateGamePtr() 并将其作为参数提供。该文件包含在游戏项目中,现在一切正常。
标签: c++ visual-c++ dll linker c++17