2012-02-17 6 views
1

にはQtベースの動的ライブラリのバイナリを最適化するために、私はしようとしてる選択QObjectから継承するクラスから関連するメソッドの数をエクスポートmocを使用して、カスタム信号とスロットを完全に(すべてのメンバーを)エクスポートするのではなく、定義します。いくつかのサンプルコードは以下の通りです。選択的にエクスポートクラスメンバのQtベースのライブラリ

#ifdef LIB_BUILD 
    #define LIB_SHARED Q_DECL_EXPORT 
#else 
    #define LIB_SHARED Q_DECL_IMPORT 
#endif 

class C: public QObject { 
    Q_OBJECT 

public: 
    LIB_SHARED void f(); 
    /* ... */ 

public slots: 
    LIB_SHARED void g(); 

private: 
    void h(); 

private slots: 
    void i(); 
}; 

アイデア:(そして、インライン方式は、これらの機能のいずれかを呼び出していない)、それらを単独でライブラリで使用されるので、これらのシンボルをエクスポートする必要は、ありませんプライベートなh()のでi()。一方、f()g()は、エクスポートに適格なメンバーなので、明示的にマークされています。

問題:Q_OBJECTマクロQObjectにメソッドの仮想メソッドのオーバーライドのカップルを宣言し、(マクロLIB_SHARED又はQ_DECL_EXPORTを含有しない宣言に拡大するため)これらの方法は、エクスポートないです。したがって、仮想テーブルはクライアントコードで不完全になります。

(UN)ソリューション:それは一般的に提案されたようは、クラス全体にLIB_SHAREDを適用します。

class LIB_SHARED C: public QObject { /* ... */ }; 

これは、問題を結ぶ解決するが、(不必要なエクスポートテーブルエントリを排除する)第一の目標ではありません少なくともQObjectベースのクラスには達しませんでした。

質問:希望の結果を得るための方法はありますか?私はQ_OBJECTマクロの周りをちょっと乱暴にしてみましたが、成功しませんでした。

Linuxシステムでも動作するソリューションが期待されます(デフォルトでは隠しシンボルの可視性を前提としています)。.defファイルは該当しません。ハックは歓迎です:)

何か助けていただければ幸いです。

PS:この問題は、Qt環境で囲まれているだけでなく、この場合のように宣言を生成するためにマクロ展開が使用されている場所で発生します。

答えて

1

pimplイディオムを使用し、パブリック部分のみをエクスポートしてみます。

class CPrivate; 
class LIB_SHARED C: public QObject { 
    Q_OBJECT 
private: 
    CPrivate* m_private; 
public: 
    ... 
}; 

そして作成するプライベートクラスのすべてのプライベート(非エクスポート可能)のものを置い:たとえば

class CPrivate : public QObject { 
    Q_OBJECT 
public: 
    void h(); 

public slots: 
    void i(); 
} 

は、次に初期化して、パブリッククラスからプライベート実装を呼び出します。

関連する問題