【问题标题】:Unresolved external symbol in DLL projectDLL 项目中未解析的外部符号
【发布时间】: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


【解决方案1】:

在我看来,您必须在 Engine.h 中声明“extern Game* CreateGamePtr()”并将全局变量添加到 Engine.cpp,如“Game* CreateGamePtr()”。

引擎.h

#pragma once

#include "Core.h"

namespace Honey
{
    extern Game* CreateGamePtr();

    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
{
    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;
    }
}

我希望这能帮到您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多