链接器错误:DLL和继承



几个小时以来,我一直在寻找错误的来源,但没有成功。我的项目由两个子项目组成。第一个是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 __thiscall a::b::CChild::blublub(类a::b::Object*("(?blubblub@CChild@b@a@@UAEXPAVObject@23@@Z( application.obj应用程序错误74错误LNK2019:未解析的外部符号"public:virtual__thiscall a::b::CChild::~CChild(void("(??1CChild@b@a@@UAE@XZ)在函数"public:virtual void*__thiscall a::b::CChild::`向量删除析构函数'(unsigned int("中引用(??_ECChild@b@a@@UAEPAXI@Z)Application.obj应用程序错误73错误LNK2019:未解析的外部符号"public:__thiscall a::b::CChild::CChild(类a::b::SomeDifferentObject*("(??0CChild@b@a@@QAE@PAVSomeDifferentObject@12@@Z(在函数_main Application.obj Application中引用错误77错误LNK2001:未解析的外部符号"protected:virtual bool __thiscall a::b::CChild::blub1(类Object*,类std::map,类std::分配器>>(const"(?blub1@CChild@b@a@@MBE_NPAVObject@23@AAV$map@KIU$less@K@std@@V$allocator@U$成对@$$CBKI@std@@@2@@std@@@Z(应用程序.obj应用程序错误76错误LNK2001:未解析的外部符号"protected:virtual bool __thiscall a::b::CChild::blub2(类Object*,类std::map,类std::分配器>>(const"(?blub2@CChild@b@a@@MBE_NPAVObject@23@AAV$map@KIU$less@K@std@@V$allocator@U$成对@$$CBKI@std@@@2@@std@@@Z(应用程序.obj应用程序错误78错误LNK2001:未解析的外部符号"protected:virtual void __thiscall a::b::CChild::blub3(class a::b::Object*(const"(?blub3@CChild@b@a@@MBEXPAVObject@23@@Z( 应用程序.obj应用程序

我使用的是Visual Studio,所有的cpp文件都在项目中(检查了很多次(。每个功能都实现了,例如。CChild::CChild(SomeDifferentObject*f_object_p(:CBase(f_object_pr({}

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

非常感谢你的帮助!

谨致问候,Bobby

它不起作用,因为类总是导出的。它们需要由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_DLL_EXPORT,以便导出类。这样一来,如果在项目中定义了AB_DLL_EXPORT,那么类将被导出,否则将被导入。

相关内容

  • 没有找到相关文章

最新更新