2016-04-07 5 views
0

を持つように(場合にプロジェクトを日食事項である)OutputDataWrapper.hロードDLLからメンバ変数を持つクラス/私は2つのディレクトリを持っているpugg

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; 
    } 
} 

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

とその他のディレクトリ

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

ファイルDriver.hKernel.hPlugin.hplugin.cpphttp://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を削除する場合でも、期待どおりに動作します:

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

減速?機能は以前よりも遅くなっていますか? –

関連する問題