2016-04-07 2 views
0

У меня есть два каталога (затмение проектов в случае, если это имеет значение)нагрузки с переменной-члена из DLL/так с pugg

PuggMain/ 
├── OutputDataWrapper.h 
└── PuggMain.cpp 

OutputDataWrapper.h с

class OutputDataWrapper { 
public: 

    OutputDataWrapper(); 
    virtual ~OutputDataWrapper(); 
}; 

и PuggMain.cpp

#include <iostream> 
#include <Kernel.h> 
#include <Animal.h> 
#include <iostream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    cout << "Loading plugins..." << endl; 
    pugg::Kernel kernel; 
    kernel.add_server(Animal::server_name(), Animal::version); 

    kernel.load_plugin("libPuggSharedLib.so"); 

    vector<AnimalDriver*> drivers =kernel.get_all_drivers<AnimalDriver>(Animal::server_name()); 
    vector<Animal*> animals; 
    for (vector<AnimalDriver*>::iterator iter = drivers.begin(); iter != drivers.end(); ++iter) { 
    AnimalDriver& driver = *(*iter); 
    animals.push_back(driver.create()); 
    cout << "loded plugin from kernel" << endl; 
    } 

    for(vector<Animal*>::iterator iter = animals.begin(); iter != animals.end(); ++iter) { 
    Animal& animal = *(*iter); 
    cout << "Animal kind = " << animal.kind() << endl; 
    cout << "Can Animal Swim = " << animal.can_swim() << endl; 
    } 

    for(vector<Animal*>::iterator iter = animals.begin(); iter != animals.end(); ++iter) { 
    delete *iter; 
    } 
} 

и другая директория со следующими файлами

PuggSharedLib/ 
├── Animal.h 
├── Cat.h 
├── Driver.h 
├── Kernel.h 
├── plugin.cpp 
└── Plugin.h 

Файлы Driver.h, Kernel.h, Plugin.h и plugin.cpp взяты прямо из http://pugg.sourceforge.net/.

Animal.h:

#include <string> 

class Animal { 
public: 
    Animal() {} 
    virtual ~Animal() {} 

    virtual std::string kind() = 0; 
    virtual bool can_swim() = 0; 
    static const int version = 1; 
    static const std::string server_name() {return "AnimalServer";} 
}; 

class AnimalDriver : public pugg::Driver { 
public: 
    AnimalDriver(std::string name, int version) : pugg::Driver(Animal::server_name(),name,version) {} 
    virtual Animal* create() = 0; 
}; 

Cat.h:

#include "Animal.h" 
#include "OutputDataWrapper.h" 

class Cat : public Animal { 
public: 
    std::string kind() {return "Cat";} 
    bool can_swim() { return false; } 
private: 
    OutputDataWrapper m_wrapper; 
}; 

class CatDriver : public AnimalDriver { 
public: 
    CatDriver() : AnimalDriver("CatDriver", Cat::version) {} 
    Animal* create() {return new Cat();} 
}; 

Выход из работы PuggMain является:

Loading plugins... 
dlopen: Success 

откуда следует, что вектор драйверов не содержит ничего. Но когда я удалить переменную m_wrapper члена от Cat, он работает, как ожидалось:

Loading plugins... 
loded plugin from kernel 
Animal kind = Cat 
Can Animal Swim = 0 

Это работа с другими переменными-членами любит Int и строку, однако.
Вопрос в том, почему? Мне явно не хватает чего-то, скорее всего, из-за недостатка понимания, но я не уверен, как справиться с этим.

Если вы сделали это, то через вопрос, танки уже для чтения. Буду признателен за любой вклад.

ответ

0

Я думаю, что проблема заключается в объявлении функций OutputDataWrapper() и ~ OutputDataWrapper(). Ваш плагин зависит от этих функций, но не может загрузить их, потому что они определены в основном приложении.

Если все члены OutputDataWrapper объявлены в заголовке, программа работает нормально, в противном случае она терпит неудачу.

Я думаю, что следующая структура будет лучше соответствовать вашим потребностям:

PuggMain/ 
└── PuggMain.cpp 

PuggMainLibrary/ 
├── OutputDataWrapper.h 
└── Animal.h 

PuggPlugin/ 
├── Cat.h 
└── Plugin.cpp 

Как плагин и главное приложение будет зависеть от PuggMainLibrary но быть независимыми друг от друга.

+0

Торможение? Функции идут медленнее, чем раньше? –

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