我一直在寻找错误的根源,因为几个小时没有成功。我的项目包含两个子项目。第一个是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:虚拟void __thiscall a :: b :: CChild :: blubblub(class a :: b :: Object *)”(?blubblub @ CChild @ b @ a @@ UAEXPAVObject @ 23 @@ Z)application.obj应用程序
错误74错误LNK2019:未解决的外部符号“公共:虚拟__thiscall a :: b :: CChild ::〜CChild(void)”(?? 1CChild @ b @ a @@ UAE @ XZ)在函数“公共:虚拟void中引用” * __thiscall a :: b :: CChild ::`vector删除析构函数'(无符号int)“(?? _ ECChild @ b @ a @@ UAEPAXI @ Z)Application.obj应用程序
错误73错误LNK2019:无法解析的外部符号“ public:__thiscall a :: b :: CChild :: CChild(class a :: b :: SomeDifferentObject *)”(?? 0CChild @ b @ a @@ QAE @ PAVSomeDifferentObject @ 12 @ _main Application.obj应用程序中引用的@Z
错误77错误LNK2001:未解决的外部符号“受保护:虚拟布尔__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应用程序
错误76错误LNK2001:未解决的外部符号“受保护:虚拟布尔__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错误LNK2001:未解决的外部符号“受保护:虚拟void __thiscall a :: b :: CChild :: blub3(class a :: b :: Object *)const“(?blub3 @ CChild @ b @ a @@ MBEXPAVObject @ 23 @@ Z)Application.obj应用程序
我正在使用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项目中,在
AB_DLL_EXPORT
中添加PreprocessorDefinitions
,以便导出类。这样做的方式是,如果在项目中定义了AB_DLL_EXPORT
,则将导出类,否则将导入。