5

私は、Android OS に展開される Qt/QML アプリに取り組んでいます。さて、モジュールが必要ですが、次のようにファイル内androidextrasに入れるとandroidextras.pro

QT += qml quick widgets sql core bluetooth printsupport androidextras

を再実行qmakeすると、次のエラーが表示されます。

プロジェクト エラー: QT の不明なモジュール: androidextras

また、サンプル プロジェクトQt Notifierを開いて実行しようとしましたが、同じエラーが発生するため、アプリまたはサンプルをビルドできません。

コンパイラとQt バージョンで使用KUbuntu 15.04しています。このモジュールをビルドするにはどうすればよいですか? メンテナンス ツールのスクリーンショットからわかるように、キットがインストールされています。gcc version 4.9.2 (Ubuntu 4.9.2-10ubuntu13)Desktop Qt 5.5.0 GCC 64bitandroidextrasAndroid arm v7

ここに画像の説明を入力

Qt 全体を で再コンパイルしclear && ./configure -opensource -confirm-license -verbose -cups -plugin-sql-mysql -android-sdk /opt/android-sdk-linux -android-ndk /opt/android-ndk-r10d && make && make install、Qt バージョンと Qt キットを QtCreator にセットアップし、ビルド キットを変更しても、同じエラーがポップアップします。なんで?

4

1 に答える 1

6

Extras モジュールは、特定のプラットフォームに固有の追加機能を提供するためのものであり、そのプラットフォームでのみ使用できます。iOS アプリのバッジ番号のサポート、Windows ジャンプ リストのサポート、または型から対応するプラットフォーム ネイティブ型 (たとえば、Mac エクストラの ) に変換するためのいくつかのユーティリティ関数のサポートなどがありQPixmapますCGImageRef

WinMac/iOSX11Androidの4 つの追加モジュールがあり、特定のキットに対して特定の選択したプラットフォーム用にコンパイルする限り、すべて問題ありません。また、デスクトップ環境では自動的に実行されます。ホスト マシンは常にターゲット マシンです。

代わりに、モバイル キットを使用して、特定の (デスクトップ) ホスト マシンから別の (モバイル) ターゲット マシンにクロスコンパイルします。この設定では、プラットフォーム固有のコードを間違ったキットで簡単に (そして誤って) コンパイルできます。

一般的に言えば、プラットフォーム固有のモジュール/コードを条件内に配置して、それらが利用可能な特定のキットに対してのみコンパイルされるようにする必要があります。これは、デスクトップ プラットフォームとモバイル プラットフォームの両方、または異なるデスクトップ プラットフォーム間でコンパイルする必要があるソフトウェアに特に当てはまります。ファイル内の条件は次の.proようになります。

android: QT += androidextras
mac: QT += macextras
// ...other platform specific and platform independent  settings

マニフェスト固有の設定も含むAndroidサンプル ファイルについては、この回答を参照してください。.pro

コードでも同じアプローチに従う必要があります。つまり、OS をチェックし、プラットフォーム コードを条件付きでコンパイルします。たとえば、関数のマルチプラットフォーム実装は次のようになります。

if defined(Q_OS_ANDROID)
#include <QtAndroid>
#include <QAndroidJniObject>
#endif

// other code...

void YourClass::function()
{
#if defined(Q_OS_ANDROID)
// platform code
#elif defined(Q_OS_WIN)

#endif
}        

たとえば、完全な Android の例についてはこの回答を参照してください。iOS 固有の便利なキーワードについては、この他の回答を参照してください。

于 2015-09-27T11:58:26.923 に答える