には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環境で囲まれているだけでなく、この場合のように宣言を生成するためにマクロ展開が使用されている場所で発生します。