MyLib
次の構造を持つライブラリ(と呼びましょう)があります。
mylib_global.h -ライブラリを使用するアプリケーションを作成するときに、ライブラリの特定のシンボルを公開するために使用されるプレフィックスの後ろに
Q_DECL_IMPORT
orがあるかどうかを決定します。Q_DECL_EXPORT
MYLIBSHARED_EXPORT
#ifndef MYLIB_GLOBAL_H #define MYLIB_GLOBAL_H #include <QtCore/qglobal.h> #if defined(MYLIB_LIBRARY) // Set using DEFINES inside MyLib.pro # define MYLIBSHARED_EXPORT Q_DECL_EXPORT #else # define MYLIBSHARED_EXPORT Q_DECL_IMPORT #endif #endif // MYLIB_GLOBAL_H
MyLib.h - 他のさまざまなクラスも含むメイン クラスが含まれています。
#include "mylib_global.h" #include "MyLibOtherClass1.h" #include "MyLibOtherClass2.h" // Symbol will be exposed to the application that links against MyLib // and can be directly interacted with from the application's code class MYLIBSHARED_EXPORT MyLibMainClass { public: ... private: MyLibOtherClassA ocA; MyLibOtherClass1 oc1; MyLibOtherClass2 oc2; ... } // Symbol will not be exposed to the application that links against MyLib // however it is indirectly used through the `MyLibMainClass` class MyLibOtherClassA { ... }
ソース ファイルとその他のクラス (ヘッダー + ソース) - の基になるロジックの宣言と定義が含まれてい
MyLib
ます。
ご覧のとおり、クラスが混在しています。ライブラリのメイン クラス (他のすべてのクラス インスタンスを制御する) と同じヘッダー ファイルで定義されているクラスもあれば、別のヘッダー ファイルで定義されているクラスもあります。MYLIBSHARED_EXPORT
ライブラリに対してリンクするときにライブラリの機能にアクセスできるようにするために公開する必要があるクラスはごくわずかです。
これは、通常のアプリケーションを作成する場合にはまったく問題ありません。ただし、コードを頻繁に変更するため (Qt テスト フレームワークを使用して) いくつかのテストを作成することにしました (今のところ:))。そこには多くの複雑な依存関係があり、すべてのテストを変更するたびに、書かれていることはカバーされており、機能は意図したものと同じままです。
テストを作成するときは、すべてのクラスにアクセスして、すべての歯車が正しい方向に回転していることを確認する必要があります (たとえ外部に公開されていなくても)。どうすればこれに対処できますか? すべてのクラスの前に追加できMYLIBSHARED_EXPORT
ますが、これにより、通常のユーザーが間接的に使用することのみを目的としたものを見ることもできます。これは、プロジェクトの設定で設定できる別のものを使用してより正確に調整できます#define
。プレフィックスを持たないすべてのクラスが定義されている場合にのみ、プレフィックスが取得されます。それ以外の場合は公開されません。この解決策はトリックを行う可能性が非常に高いですが、可能であれば避けたいコードの混乱を引き起こします。