Я искал источник ошибки с нескольких часов без успеха. Мой проект состоит из двух подпроектов. Первая - это dll, а вторая - приложение (exe). я упростил свой исходный код, который является частью библиотеки DLL:ошибки компоновщика: 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 :: blubblub (класс 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 :: `vector d (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 Приложение Ошибка 77 ошибка LNK2001: неразрешенный внешний символ" protected: virtual bool __thiscall a :: b :: CChild :: blub1 (класс Object *, класс 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 Application Ошибка 76 ошибка LNK2001: неразрешенный внешний символ "protected: virtual bool __thiscall a :: b :: CChild :: blub2 (класс Object *, класс std :: map, class std :: allocator>> &) const" (? Blub2 @ CChild @ b @ @@ MBE_NPAVObje ct @ 23 @ AAV? $ map @ KIU? $ less @ K @ std @@ V? $ allocator @ U? $ pair @ $$ CBKI @ std @@@ 2 @@ std @@@ Z) Application.obj Application Ошибка 78 ошибка LNK2001: неразрешенный внешний символ "protected: virtual void __thiscall a :: b :: CChild :: blub3 (класс 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 файлы не найдены ?!
Большое вам спасибо за помощь!
С наилучшими пожеланиями, Бобби
Благодарим вас за ответ. Я внедрил ваше предложение, но это не привело к решению :(После поиска в MyDll.vcxproj Я узнал, что Child.hpp и Child.cpp не были включены в ItemGroup. Как ни странно, они были перечислены в MyDll.vcxproj.filters. После ручного добавления этих двух файлов ошибки компоновщика исчезли. Кажется, что это ошибка VS. – bobby