2015-07-17 3 views
0

Я искал источник ошибки с нескольких часов без успеха. Мой проект состоит из двух подпроектов. Первая - это 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 файлы не найдены ?!

Большое вам спасибо за помощь!

С наилучшими пожеланиями, Бобби

ответ

2

Это не работает, потому что классы всегда экспортируются. Им нужно экспортировать проект 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 добавить AB_DLL_EXPORT в PreprocessorDefinitions, чтобы классы экспортировались. Это работает таким образом, что если в проекте определено значение AB_DLL_EXPORT, тогда классы будут экспортироваться, иначе они будут импортированы.

+0

Благодарим вас за ответ. Я внедрил ваше предложение, но это не привело к решению :(После поиска в MyDll.vcxproj Я узнал, что Child.hpp и Child.cpp не были включены в ItemGroup. Как ни странно, они были перечислены в MyDll.vcxproj.filters. После ручного добавления этих двух файлов ошибки компоновщика исчезли. Кажется, что это ошибка VS. – bobby

Смежные вопросы