链接器错误:DLL 和继承
linker errors: DLL and inheritance
我正在寻找错误的来源,因为几个小时没有成功。我的项目由两个子项目组成。第一个是 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 所有函数的链接器错误 class:
错误 75 error LNK2001: 未解析的外部符号 "public: virtual void __thiscall a::b::CChild::blubblub(class a::b::Object *)" (?blubblub@CChild@b@a@@UAEXPAVObject@23@@Z) application.obj 应用程序
错误74 error LNK2019: unresolved external symbol "public: virtual __thiscall a::b::CChild::~CChild(void)" (??1CChild@b@a@@UAE@XZ) referenced in function "public: virtual void * __thiscall a::b::CChild::`vector deleting destructor'(unsigned int)" (??_ECChild@b@a@@UAEPAXI@Z) Application.obj申请
错误73 error LNK2019: unresolved external symbol "public: __thiscall a::b::CChild::CChild(class a::b::SomeDifferentObject *)" (??0CChild@b@a@@QAE@PAVSomeDifferentObject@12@@Z) 在函数_main Application.obj Application中引用
Error 77 error LNK2001: 未解析的外部符号"protected: virtual bool __thiscall a::b::CChild::blub1(class Object *,class std::map,class std::allocator > > &)const " (?blub1@CChild@b@a@@MBE_NPAVObject@23@AAV?$map@KIU?$less@K@std@@V?$ allocator@U?$pair@$$CBKI@std@@@2@@std@@@Z) Application.obj 应用程序
Error 76 error LNK2001: 未解析的外部符号"protected: virtual bool __thiscall a::b::CChild::blub2(class Object *,class std::map,class std::allocator > > &)const " (?blub2@CChild@b@a@@MBE_NPAVObject@23@AAV?$map@KIU?$less@K@std@@V?$ allocator@U?$pair@$$CBKI@std@@@2@@std@@@Z) Application.obj 应用程序
错误 78 error LNK2001: 未解析的外部符号 "protected: virtual void __thiscall a::b::CChild::blub3(class a::b::Object *)const " (?blub3@CChild@b@a@@MBEXPAVObject@23@@Z) Application.obj Application
我正在使用 Visual Studio 并且所有 cpp 文件都在项目中(检查了很多次)。每个功能都已实现,例如
CChild::CChild(SomeDifferentObject* f_object_p) : CBase(f_object_p)
{
}
好像没有找到相关的cpp文件?!
非常感谢您的帮助!
亲切的问候,
鲍比
它不起作用,因为 类 总是被导出。它们需要由 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
,则将导出 类,否则将导入。
我正在寻找错误的来源,因为几个小时没有成功。我的项目由两个子项目组成。第一个是 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 所有函数的链接器错误 class:
错误 75 error LNK2001: 未解析的外部符号 "public: virtual void __thiscall a::b::CChild::blubblub(class a::b::Object *)" (?blubblub@CChild@b@a@@UAEXPAVObject@23@@Z) application.obj 应用程序 错误74 error LNK2019: unresolved external symbol "public: virtual __thiscall a::b::CChild::~CChild(void)" (??1CChild@b@a@@UAE@XZ) referenced in function "public: virtual void * __thiscall a::b::CChild::`vector deleting destructor'(unsigned int)" (??_ECChild@b@a@@UAEPAXI@Z) Application.obj申请 错误73 error LNK2019: unresolved external symbol "public: __thiscall a::b::CChild::CChild(class a::b::SomeDifferentObject *)" (??0CChild@b@a@@QAE@PAVSomeDifferentObject@12@@Z) 在函数_main Application.obj Application中引用 Error 77 error LNK2001: 未解析的外部符号"protected: virtual bool __thiscall a::b::CChild::blub1(class Object *,class std::map,class std::allocator > > &)const " (?blub1@CChild@b@a@@MBE_NPAVObject@23@AAV?$map@KIU?$less@K@std@@V?$ allocator@U?$pair@$$CBKI@std@@@2@@std@@@Z) Application.obj 应用程序 Error 76 error LNK2001: 未解析的外部符号"protected: virtual bool __thiscall a::b::CChild::blub2(class Object *,class std::map,class std::allocator > > &)const " (?blub2@CChild@b@a@@MBE_NPAVObject@23@AAV?$map@KIU?$less@K@std@@V?$ allocator@U?$pair@$$CBKI@std@@@2@@std@@@Z) Application.obj 应用程序 错误 78 error LNK2001: 未解析的外部符号 "protected: virtual void __thiscall a::b::CChild::blub3(class a::b::Object *)const " (?blub3@CChild@b@a@@MBEXPAVObject@23@@Z) Application.obj Application
我正在使用 Visual Studio 并且所有 cpp 文件都在项目中(检查了很多次)。每个功能都已实现,例如 CChild::CChild(SomeDifferentObject* f_object_p) : CBase(f_object_p) { }
好像没有找到相关的cpp文件?!
非常感谢您的帮助!
亲切的问候, 鲍比
它不起作用,因为 类 总是被导出。它们需要由 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
,则将导出 类,否则将导入。