0

MyLib次の構造を持つライブラリ(と呼びましょう)があります。

  • mylib_global.h -ライブラリを使用するアプリケーションを作成するときに、ライブラリの特定のシンボルを公開するために使用されるプレフィックスの後ろにQ_DECL_IMPORTorがあるかどうかを決定します。Q_DECL_EXPORTMYLIBSHARED_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。プレフィックスを持たないすべてのクラスが定義されている場合にのみ、プレフィックスが取得されます。それ以外の場合は公開されません。この解決策はトリックを行う可能性が非常に高いですが、可能であれば避けたいコードの混乱を引き起こします。

4

1 に答える 1

0

多くの機能がエクスポートされていないため、最終成果物をテストしないことに既に設定しています。最終製品を取得してテスト ハーネスを実行することはできません。

次に、最も簡単な解決策は、すべてのヘッダー/ソースをテスト ハーネス自体に含めることです。

ソースとヘッダーのリストを別のファイルに分割して、成果物とテスト ハーネスのプロジェクト ファイルに含めることができます。これは、cmake と qmake の両方で簡単に実行できます。

于 2016-11-03T13:38:04.137 に答える