当前位置: 首页 > 知识库问答 >
问题:

链接器错误:DLL和继承

能可人
2023-03-14

我正在寻找错误的来源,因为几个小时没有成功。我的项目由两个子项目组成。第一个是dll,第二个是应用程序(exe)。我简化了原始代码,它是dll的一部分:

#ifndef blub_base
#define blub_base

#include "SomeInterface.hpp"
#include "Object.hpp"
#include <map>

namespace a
{
    namespace b
    {       
        class __declspec(dllexport) CBase : public CSomeInterface
        {
        protected:
            CBase() {}


        public:

            CBase(SomeDifferentObject* f_object_p) { /* concrete implementation in cpp */ }
            ~CBase() { /* concrete implementation in cpp */ }

            bool initialize() { /* concrete implementation in cpp */ }
            bool shutdown() { /* concrete implementation in cpp */ }

            void foo() { /* concrete implementation in cpp */ }
            virtual void blubblub(Object* f_object_p) { /* concrete implementation in cpp */ }
        protected:
            bool blub1(Object* f_object_p, std::map<uint32_t, Object*>& f_something_rmap) const { /* concrete implementation in cpp */ }
            bool blub2(Object* f_object_p, std::map<uint32_t, Object*>& f_something_rmap) const { /* concrete implementation in cpp */ }
            void blub3(Object* f_object_p) const  { /* concrete implementation in cpp */ }
        };
    }
}
#endif




#ifndef blub
#define blub

#include "Base.hpp"

namespace a
{
    namespace b
    {
        class __declspec(dllexport) CChild : public CBase
        {
        private:
            CChild() {}

        public:
            CChild(SomeDifferentObject* f_object_p) { /* concrete implementation in cpp */ }
            /// deconstructor
            ~CChild() { /* concrete implementation in cpp */ }

            void blubblub(Object* f_object_p) override { /* concrete implementation in cpp */ }

        protected:
            bool blub1(Object* f_object_p, std::map<uint32_t, Object*>& f_something_rmap) const override { /* concrete implementation in cpp */ }
            bool blub2(Object* f_object_p, std::map<uint32_t, Object*>& f_something_rmap) const override { /* concrete implementation in cpp */ }
            void blub3(Object* f_object_p) const override { /* concrete implementation in cpp */ }
        };
    }
}
#endif

如果我试图在我的应用程序中实例化CChild对象,我会得到CChild类所有函数的链接器错误:

错误75错误LNK2001:未解析的外部符号“public:virtual void\uu thiscall a::b::CChild::blubblublub(类a::b::Object*)”(?blubblub@CChild@b@a@@UAEXPAVObject@23@@Z) 应用程序。obj应用程序错误74错误LNK2019:未解析的外部符号“public:virtual\u thiscall a::b::CChild::~CChild(void)”(?)??1CChild@b@a@@UAE@XZ)函数“public:virtual void*u thiscall a::b::CChild::`vector deleting destructor'(unsigned int)”(?)_ECChild@b@a@@UAEPAXI@Z)应用程序。obj应用程序错误73错误LNK2019:未解析的外部符号“public:u thiscall a::b::CChild::CChild(类a::b::SomeDifferentObject*)”(??)??0CChild@b@a@@QAE@PAVSomeDifferentObject@12@@Z)在函数\u主应用程序中引用。obj应用程序错误77错误LNK2001:未解析的外部符号“受保护:虚拟布尔值调用a::b::CChild::blub1(类对象*,类std::映射,类std::分配器

我使用的是Visual Studio,所有cpp文件都在项目中(已检查多次)。每个函数都是实现的,例如CChild::CChild(somedifferentitobject*f_object_p):CBase(f_object_p){

似乎找不到相关的cpp文件?!

非常感谢你的帮助!

亲切的问候,鲍比

共有1个答案

韩羽
2023-03-14

它不起作用,因为类总是导出的。它们需要由dll项目导出,并由使用该dll的项目导入。

要解决这个问题,添加头文件,例如ab_dll. h和那里:

#ifdef AB_DLL_EXPORT 
    #define AB_DLL_API __declspec(dllexport)
#else
    #define AB_DLL_API __declspec(dllimport)
#endif

然后在类中使用该宏:

class AB_DLL_API CBase : public CSomeInterface
{
//...
};

class AB_DLL_API CChild : public CBase
{
//...
};

另外,在VS dll项目中,在PreprocessorDefinitions中添加AB\u dll\u EXPORT,以便导出类。这样,如果在项目中定义了AB\u DLL\u EXPORT,则将导出类,否则将导入类。

 类似资料:
  • 我认为我的模板使用不当,但我不知道我做错了什么。这就像模板链表无法确定它需要使用我的术语类一样。 名单- 以下是Visual Studio 2012的确切错误: > 错误LNK1120:1未解决的外部C:\用户\迈克尔\文档\魔术公文包\尚普兰\课程工作\数据结构\pa2\调试\pa2.exe 标题。H 功能。cpp 链接列表。H 术语h

  • 我是c语言新手,我有以下问题: 文件:-main。cpp-实用程序。h-实用程序.cpp 当我在做: g-c-std=c 11实用程序。cpp(编译)g-c-std=c11main。cpp(编译) 当我尝试链接时: g -o main.o utils.o /usr/lib/gcc/i686 redhat-linux/4.8.3/../../../crt1.o:在函数main'utils的引用。o:

  • 我试图实现一个协议栈使用协议层设计模式:http://www.eventhelix.com/realtimemantra/patterncatalog/protocol_layer.htm 在我们的项目中,我将所有层作为单独的DLL。我有以下几层: > LLC层dll MAC层dll 物理层dll 我在同一个解决方案中还有另一个项目,它实现了设计模式,并实现了协议层的一般功能。我的所有层都继承自协

  • 我正在使用React路由器与链接,以改变URL和导航通过应用程序。在阅读列表中,我使用以下代码导航用户阅读edit: 我定义了以下路由: 我怎样才能解决那个问题?

  • 我是C语言的新手,我和SFML一起建立了一个项目,运行良好,根据Visual Studio,我没有代码问题,但是当我调试时,我得到这些错误消息: 错误1错误LNK2019:未解决的外部符号"__declspec(dllimport)public:__thiscallsf::String::String(char const*, class std::locale const 错误2错误LNK201

  • 嘿,伙计们,我在安装了react native payola包装后制作了一个react native应用程序,我面临这个问题 如何解决这些错误......