このページでは

C

Qt Quick Ultraliteアプリケーションを静的ライブラリとしてビルドする

このトピックでは、Qt Quick Ultraliteアプリケーションを静的ライブラリとしてビルドし、外部プロジェクトに組み込む手順について説明します。

ライブラリとしてビルドする

Qt Quick Ultralite では、CMake のqul_add_target関数を使用して、Qt Quick Ultralite アプリケーションを静的ライブラリとしてビルドできます。この関数は、引数リストに `STATIC_LIBRARY ` オプションが追加されていない限り、デフォルトで実行可能ファイルターゲットをビルドします。以下の例を参照してください。

qul_add_target(example_app
               STATIC_LIBRARY
               source1.cpp
               source2.cpp)

注: 静的ライブラリの設定は Qt Quick UltraliteのFreeRTOS プラットフォーム構成ではコンパイルできませんが、bare metal構成ではビルド可能であり、外部のFreeRTOS 環境と組み合わせて使用できます。この方法は機能しますが、予期しない動作を引き起こす可能性があるため、推奨されません。

qul_add_targetで GENERATE_ENTRYPOINT 使用された場合、qul_run.h ヘッダーファイルが生成され、ライブラリの出力ディレクトリにコピーされます。このヘッダーには、C-Linkageを持つqul_run() 関数が含まれており、Qt Quick Ultraliteアプリケーションへの標準的なエントリポイントを提供します。

注: GENERATE_ENTRYPOINT を使用する場合、mainFile プロパティ必須です。

qul_add_target(example_app STATIC_LIBRARY QML_PROJECT example_app.qmlproject GENERATE_ENTRYPOINT)

Qt Quick Ultralite 静的ライブラリの作成および使用方法の例については、「Qt Quick Ultralite static_library Example」を参照してください。

C-Linkage 関数

Qt Quick Ultralite エンジンの初期化手順やスケジューリングをより細かく制御できるようにするため、アプリケーションを静的ライブラリとしてビルドする際には、以下の C-Linkage 関数が公開されます。

  • void qul_init_hardware(void);
  • void qul_init_platform(void);
  • void qul_init_application(void);
  • QulErrorHandler *qul_set_error_handler(QulErrorHandler *handler);
  • const char *qul_error_code_to_string(enumQulError code);
  • uint64_t qul_update_engine(void);
  • void qul_app_exec(void);

生成されたqul_run.cpp ファイルは、最終的に以下のようになります:

extern "C" {

Qul::Application& _qul_app() {
    static Qul::Application _qul_app;
    return _qul_app;
}

mainScreen& _qul_item() {
    static struct ::mainScreen _qul_item;
    return _qul_item;
}

void qul_init_hardware(void)
{
    Qul::initHardware();
}

void qul_init_platform(void)
{
    Qul::initPlatform();
}

void qul_init_application(void)
{
    _qul_app().setRootItem(&_qul_item());

#ifdef APP_DEFAULT_UILANGUAGE
    _qul_app().settings().uiLanguage.setValue(APP_DEFAULT_UILANGUAGE);
#endif
}

uint64_t qul_update_engine(void)
{
    return _qul_app().update();
}

void qul_app_exec(void)
{
    _qul_app().exec();
}

} // extern "C"

int qul_run(bool initializeHardware)
{
    if (initializeHardware) qul_init_hardware();
    qul_init_platform();
    qul_init_application();
    qul_app_exec();
    return 0;
}

外部プロジェクトへの静的ライブラリの統合

Qt Quick Ultraliteアプリケーションライブラリを外部プロジェクトに統合するには、使用されているすべてのQt Quick Ultraliteライブラリとともに、その外部プロジェクトをこのライブラリに対してリンクします。ライブラリのバージョンの中には、Qt Quick Ultraliteの設定によって異なるものがあります。以下の表は、これらのライブラリのバージョンと、それに対応するQt Quick Ultraliteの設定をまとめたものです:

フォントエンジン
MCU.Config.fontEngine == Static (default)MCU.Config.fontEngine == Spark
Qul::MonotypeUnicodeEngineShaperDisabledCMakeプロパティ/変数1ON 、またはTrue0OFF 、またはFalse
MCU.Config.platformImageAlignment(デフォルト)

Qul::MonotypeFontEngine

Qul::MonotypeFontEngineAligned
MCU.Config.complexTextRendering(デフォルト)

Qul::MonotypeShaperEngine

Qul::MonotypeUnicodeEngine

Qul::MonotypeUnicodeEngineShaperDisabled
PNG デコーダ(PNG ファイルを使用する場合にのみライブラリが必要)
CMakeのプロパティ/変数1ON 、またはTrue0OFF 、またはFalse
ImageFiles.MCU.resourceCompressionQul::PNGDecoderLodePNGQul::PNGDecoderNull(デフォルト)

さらに、Qt Quick Ultraliteのinclude パスを外部プロジェクトのインクルードパスにコピーまたは追加してください。Qt Quick Ultraliteアプリケーションがデフォルトのエントリポイントを提供している場合は、生成されたqul_run.h ヘッダーファイルのパスを外部プロジェクトのインクルードパスにコピーまたは追加してください。

次に、外部プロジェクトで既存のQt Quick Ultralite プラットフォーム抽象化コードを再利用するか、ターゲットボード用に新しいコードを作成します。詳細については、Qt Quick Ultralite プラットフォームの移植ガイドを参照してください。

最後に、「アプリケーションでのQt Quick Ultralite の実行」ガイドに基づいて、外部プロジェクトにエントリポイント関数を作成します。デフォルトのエントリポイントを使用する場合は、qul_run.h ヘッダーファイルをインクルードし、所定の場所でqul_run() 関数を呼び出して、Qt Quick Ultralite エンジンを初期化および起動してください。

注: `qul_run() ` を呼び出す際に `initializeHardware ` が `false` に設定されている場合、`Qul::initHardware()` は呼び出されません。

qul_run() 関数を呼び出した後、制御は各プラットフォーム抽象化に固有のQul::Platform::exec() へジャンプします。Qt for MCUs に同梱されているプラットフォーム抽象化の例におけるこの関数のすべての実装には、無限の while ループが含まれています。これは、UI 以外の残りのコードを、対応するQul::Platform::exec() の実装に移動するか、あるいは割り込みベースにする必要があることを意味します。

外部プロジェクトでRTOSを使用している場合、Qt Quick Ultraliteを別のスレッドで実行することが可能です。その場合、組み込みイベントシステムは他のスレッドから直接更新できないため、ユーザーはQt Quick Ultraliteに対してスレッドセーフなインターフェースを提供する必要があります。

MCU.Config.fontEngineも参照してください

特定のQtライセンスの下で利用可能です。
詳細はこちら。