このページの内容

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プロパティ/変数1、ON 、またはTrue0、OFF 、またはFalse
MCU.Config.platformImageAlignment(デフォルト)

Qul::MonotypeFontEngine

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

Qul::MonotypeShaperEngine

Qul::MonotypeUnicodeEngine

Qul::MonotypeUnicodeEngineShaperDisabled
PNG デコーダ(PNG ファイルを使用する場合にのみライブラリが必要)
CMakeのプロパティ/変数1、ON 、またはTrue0、OFF 、または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 エンジンを初期化および起動してください。

注: `initializeHardware ` を `false` に設定した状態で `qul_run() ` を呼び出した場合、`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ライセンスの下で利用可能です。
詳細はこちら。