繁体   English   中英

使用 std::make_shared 创建奇怪的 linker 异常

[英]Using std::make_shared creates strange linker exception

我想让用户能够为绘图对象创建渲染器。 但是,'return std::make_shared(this);' 行创建一个奇怪的 linker 错误。 我没修好。

1>   Creating library ..\..\..\bin\Debug\Invision.lib and object ..\..\..\bin\Debug\Invision.exp
1>VulkanEngine.obj : error LNK2019: unresolved external symbol "public: __cdecl engine_namespace::VulkanRenderer::VulkanRenderer(class engine_namespace::VulkanEngine *)" (??0VulkanRenderer@engine_namespace@@QEAA@PEAVVulkanEngine@1@@Z) referenced in function "public: __cdecl std::_Ref_count_obj<class engine_namespace::VulkanRenderer>::_Ref_count_obj<class engine_namespace::VulkanRenderer><class engine_namespace::VulkanEngine *>(class engine_namespace::VulkanEngine * &&)" (??$?0PEAVVulkanEngine@engine_namespace@@@?$_Ref_count_obj@VVulkanRenderer@engine_namespace@@@std@@QEAA@$$QEAPEAVVulkanEngine@Invision@@@Z)
1>..\..\..\bin\Debug\Invision.dll : fatal error LNK1120: 1 unresolved externals

如果我替换该行 return std::make_shared(this); 返回 nullptr; 出于测试目的,它运行。 所以我最终假设这条线是这个错误的原因。 我试过这样想,删除 ENGINE_API 定义,它将方法导出到 dll。 但这不是这个错误的原因。

VulkanEngine.cpp

#include "precompiled.h"


#include "VulkanEngine.h"
#include "IRenderer.h"
#include "VulkanRenderer.h"


namespace engine_namespace
{


    VulkanEngine::VulkanEngine(CanvasDimensions canvas) :
        IGraphicsEngine(EngineType::Vulkan, "Vulkan", "1.2.137", canvas)
    {
        …
    }

    std::shared_ptr <IRenderer> VulkanEngine::create_renderer()
    {
        return  std::make_shared<VulkanRenderer >(this);
    }

    VulkanEngine::~VulkanEngine()
    {
        …
    }

}

VulkanEngine.h

#ifndef VULKAN_ENGINE_H
#define VULKAN_ENGINE_H

#include <memory>
#include "IGraphicsEngine.h"
#include "renderer\Vulkan\InVulkan.h"
#include "renderer\Vulkan\VulkanException.h"
#include "renderer\Vulkan\VulkanInstance.h"
#include "renderer\Vulkan\VulkanDevice.h"
#include "renderer\Vulkan\VulkanPresentation.h"

#include "Vulkan/Vulkan.h"

namespace engine_namespace
{
    

    class VulkanRenderer;

    …

    class VulkanEngine : public IGraphicsEngine
    {
    private:
        engine_namespace::VulkanInstance vulkanInstance;
        engine_namespace::SVulkan vulkInstance;

    public:
        ENGINE_API VulkanEngine(CanvasDimensions canvas);
        ENGINE_API std::shared_ptr <IRenderer> create_renderer() override;
        ENGINE_API ~VulkanEngine();

    };

}
#endif //VulkanEngine

VulkanRenderer.h

#ifndef VULKAN_RENDERER_H
#define VULKAN_RENDERER_H


#include "IRenderer.h"
namespace engine_namespace
{
    class VulkanEngine;
    class VulkanRenderer : public IRenderer
    {
    public:

        ENGINE_API VulkanRenderer(VulkanEngine* engine);

        ENGINE_API void render() override;
    };

}

#endif // VULKAN_RENDERER_H

VulkanRenderer.cpp

#include "precompiled.h"

#include "VulkanEngine.h"

#include "VulkanRenderer.h"
namespace engine_namespace
{
    VulkanRenderer::VulkanRenderer(VulkanEngine* engine) :
        IRenderer(engine)
    {
    }

    void VulkanRenderer::render()
    {
        
    }
}

有人知道,我该如何解决这个异常?

使用 shared_from_this() 更改后

VulkanEngine.cpp

#include "precompiled.h"


#include "VulkanEngine.h"
#include "IRenderer.h"
#include "VulkanRenderer.h"


namespace engine_namespace
{


    VulkanEngine::VulkanEngine(CanvasDimensions canvas) :
        IGraphicsEngine(EngineType::Vulkan, "Vulkan", "1.2.137", canvas)
    {
        …
    }

    std::shared_ptr <IRenderer> VulkanEngine::create_renderer()
    {
        return  std::make_shared<VulkanRenderer >(shared_from_this());
    }

    VulkanEngine::~VulkanEngine()
    {
        …
    }

}

VulkanEngine.h

#ifndef VULKAN_ENGINE_H
#define VULKAN_ENGINE_H

#include <memory>
#include "IGraphicsEngine.h"
#include "renderer\Vulkan\InVulkan.h"
#include "renderer\Vulkan\VulkanException.h"
#include "renderer\Vulkan\VulkanInstance.h"
#include "renderer\Vulkan\VulkanDevice.h"
#include "renderer\Vulkan\VulkanPresentation.h"

#include "Vulkan/Vulkan.h"

namespace engine_namespace
{
    

    class VulkanRenderer;

    …

    class VulkanEngine : public IGraphicsEngine, std::enable_shared_from_this<VulkanEngine >
    {
    private:
        engine_namespace::VulkanInstance vulkanInstance;
        engine_namespace::SVulkan vulkInstance;

    public:
        ENGINE_API VulkanEngine(CanvasDimensions canvas);
        ENGINE_API std::shared_ptr <IRenderer> create_renderer() override;
        ENGINE_API ~VulkanEngine();

    };

}
#endif //VulkanEngine

VulkanRenderer.h

#ifndef VULKAN_RENDERER_H
#define VULKAN_RENDERER_H


#include "IRenderer.h"
namespace engine_namespace
{
    class VulkanEngine;
    class VulkanRenderer : public IRenderer
    {
    public:

        ENGINE_API VulkanRenderer(std::shared_ptr<VulkanEngine> engine);

        ENGINE_API void render() override;
    };

}

#endif // VULKAN_RENDERER_H

VulkanRenderer.cpp

#include "precompiled.h"

#include "VulkanEngine.h"

#include "VulkanRenderer.h"
namespace engine_namespace
{
    VulkanRenderer::VulkanRenderer(std::shared_ptr<VulkanEngine> engine) :
        IRenderer(engine)
    {
    }

    void VulkanRenderer::render()
    {
        
    }
}

我找到了这个 linker 异常的原因。 我在同一个 dll 中使用了两个同名的类。 我用我的项目的层次结构详细解释它:

-Engine (Project and DLL)
-- Vulkan (Folder)
--- VulkanRenderer.cpp
--- VulkanRenderer.h
- VulkanRenderer.cpp
- VulkanRenderer.h

文件夹 Vulkan 中的文件是使用独特的 Vulkan 功能构建的类。 根文件夹中的 VulkanRenderer 将此函数包装在具有接口的工厂中。 问题是两个cpp文件在编译过程中都有冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM