web-dev-qa-db-ja.com

Qtを使用した「クロスプラットフォーム」開発のベストプラクティス

qt.nokia.com によると、Qtは「クロスプラットフォームのアプリケーションとUIフレームワーク」であり、「複数のプラットフォームを対象とするコードを1回書く」ことができます。 Qt SDKは、「1回のインストールでQtを使用してクロスプラットフォームアプリケーションを構築するために必要なツール」を含む「完全な開発環境」です。 Qt Creatorは、「Windows、Linux/X11、およびMac OS Xデスクトップオペレーティングシステムで実行され、開発者が複数のデスクトップおよびモバイルデバイスプラットフォーム用のアプリケーションを作成できるようにする」「クロスプラットフォームIDE」です。

「クロスコンパイル」という魔法の言葉は、それらのウェブサイトの宣伝文句には明示的に言及されていません。それでも、開発に使用しているホストシステムのQt SDK(Qt Creatorを含む)をダウンロードし、プロジェクトを作成し、そこからコードを記述できると推測することは、素朴な読者には許されるかもしれませんeasilyWindows、Linux、Macなどの実行可能ファイルを生成します。「easily」では、ビルド設定ダイアログのチェックボックスをオンにして、[ビルド]ボタンを押すなどのことを考えています。 。

私はまだそれらのチェックボックスを探しています!その間、クロスコンパイラーのインストール、追加のバイナリーのインストール、qmakeファイルの書き換えなどについて、ここや他の場所でさまざまな投稿を見つけました。マーケティングから、クロスコンパイルはすでに完全に直接サポートされていると思いました。 IDEおよびSDKツールの「すぐに使える」インストール。明らかな何かが欠けていますか?

そうでない場合は、3つのオペレーティングシステムすべてで使用できる開発マシンがあります。 3つのプラットフォームすべてにQtCreatorをインストールする必要がありますか?そうすれば、たとえばWindows用にQt Creatorを使用して開発したQtプロジェクト(またはソースコードのみ)を取得して、MacまたはLinuxマシンにコピーしてビルドできると期待できますか?いくつかの大きな問題に遭遇することなく、そのプラットフォーム用のバージョンのQt Creatorを使用していますか?単一の開発ホストにクロスコンパイルツールをインストールするのではなく、Qtを使用して複数のプラットフォーム用の実行可能ファイルを作成するためのベストプラクティスでさえありますか?

32
Jan Hettich

Qtのキャッチフレーズは次のとおりです。

一度書けば、どこでもコンパイルできます。

これを念頭に置いて、Qtは、特定のプラットフォームから他の異なるプラットフォームにQtアプリケーションをクロスコンパイルするためのすぐに使えるソリューションを公式に提供していません。確かに実行可能ですが、多くの作業と時間が費やされている場合、Qtの優れた一般的な方法では、ターゲットプラットフォーム上で直接Qtアプリケーションを構築することをお勧めします。つまり、アプリケーションのWindowsターゲットをWindowsマシンに、MacターゲットをMacマシンに、LinuxターゲットをLinuxマシンに構築します(:-))。

それが「一度書けばどこでもコンパイルできる」という方法で、私の意見では非常によく選ばれた単語の組み合わせです。そうでなければ、キャッチフレーズは「一度書けば、すべてのためにコンパイルする」だったかもしれません。

元の問題に戻ると、対象となるプラットフォームごとに異なる物理マシンは必要ありません。優れた仮想化ソリューションの時代では、いくつかの仮想マシンを簡単にセットアップして、異なるプラットフォームでアプリを構築できるからです。同じ物理マシンから。

あなたの質問から直接答えられていない他の質問について:

3つのプラットフォームすべてにQtCreatorをインストールする必要がありますか?そうすれば、たとえばWindows用にQt Creatorを使用して開発したQtプロジェクト(またはソースコードのみ)を取得して、MacまたはLinuxマシンにコピーしてビルドできると期待できますか?いくつかの大きな問題に遭遇することなく、そのプラットフォーム用のバージョンのQt Creatorを使用していますか?

はい。マイナーな問題は、3つの主要なプラットフォーム(Windows、Linux、Mac)すべてでアプリケーションの実行可能ファイル/バイナリアイコンを正しく取得することや、MacDockの高度な統合またはトレイバーの統合の問題です。これらの問題は、プラットフォーム固有のコードを#defineなどのコンパイラ指令に適切にカプセル化することで、コードのクロスプラットフォーム特性を損なうことなく処理できます。また、アプリケーションが必要とする他のすべてのプラットフォーム固有のコードに対して、またはプラットフォーム固有のコードを広範囲に使用する場合は、関連するプラットフォーム固有のコードのブロック全体を、各プラットフォームに固有のいくつかの動的にロードされたライブラリ(または共有ライブラリ)に分割することをお勧めしますが、同じ抽象汎用インターフェイスをエクスポートし、必要に応じてそれらにロード/リンクします。

単一の開発ホストにクロスコンパイルツールをインストールするのではなく、Qtを使用して複数のプラットフォーム用の実行可能ファイルを作成するためのベストプラクティスでさえありますか?

QmakeなどのツールはMakefileで.mocファイルを手動で処理する負担を負うため、可能な限りアプリケーションのビルドにはQt SDK(Qt Creatorまたはコマンドラインツール)を使用する必要があります。しかし、それがいくつかの理由で不可能になった場合、例えば。あなたの会社がVisualStudio開発を課しているように(クロスプラットフォームですね?)、MS Visual Studio、GNU autotoolsまたはCMakeなどのビルドシステムを使用してQtベースのビルドを処理する方法に関するチュートリアルがたくさんあります。プラットフォーム固有のハッキングに適したビルドシステムを使用するのではなく、優れた「make makefile」ジェネレーターであり、アプリケーションを正しくビルドするために必要なプラットフォーム固有のハックに簡単に適応できるqmakeを使用することをお勧めします。次に、これらのビルドシステムに対するQtのニーズに対応しようとします。結局のところ、クロスプラットフォームの理由でQtでアプリケーションを開発する場合は、プラットフォーム固有のapi/codeやサードパーティのライブラリではなく、Qtをアプリケーションのプライマリフレームワークにする必要があります。使用する可能性があります。

私は十分に明確で役に立ったことを願っています。

PS:コメントに書いたことに関する提案や修正/追加も歓迎します。

22
Shinnok

MinGW を使用して、Linux forWindowsでクロスコンパイルできます。技術的な問題により、Macへのクロスコンパイルはできません。 GUIからこれを行う簡単な方法はありませんが、 ここ はWindows用のQtWebKitをクロスコンパイルするための優れたハウツーです。これは、どのQtプロジェクトにも適用できます。

6
ismail

クロスコンパイル構成はないと思います。

プロジェクト全体の移植性については、いくつかの厄介な不具合を見つけたので、「ほぼ」と言います。それでも、ソースコードは100%移植可能であり、別のプラットフォームで再コンパイルするには、.proでいくつかのトリックが必要になります。

私がしていることは、たった1つのプラットフォーム(Linux)で作業し、WindowsマシンとMacMiniを使用してコンパイルすることです。私が通常戦うことになるのは、外部ライブラリを見つける場所やファイルを含める場所についてのいくつかの指示です。また、Macで作業しているときは、プログラムがそれらを見つけられるように、アプリバンドル内の外部ファイルをコピーする必要があります。

3
6502

前回Qtを使用していたとき、それは何年も前のことでしたが、バイナリが必要なすべてのプラットフォームでコンパイルする必要がありました。もちろんクロスコンパイルすることもできますが、そういうものを設定するのはあなた次第だと思います。

他の誰かがもっと良い質問をするかもしれませんが、あなたが何かを逃しているとは思いません。

2
pupeno

Linuxシステムについては知りません。ただし、Mac OS XとWindowsを対象としたQtアプリを開発するには、それぞれに開発マシンが必要です。 2つのクロスコンパイルはありません。

Qtは、同じソースファイルが異なるプラットフォーム用のアプリを構築できるという意味でクロスプラットフォームです。すべてのVMが利用可能であれば、複数のターゲットを開発および構築するための1つの(物理)マシンのセットアップはそれほど問題にはなりません。実際、それはまさに私がMacとWindowsの両方を対象とする現在のプロジェクトに取り組んでいる方法です。

2
Stephen Chu

クロスコンパイルは通常、ホストLinuxシステムでソフトウェアを開発し、ターゲットLinuxシステム用にコンパイルするために使用されます。何年もの間、X11(KDE)を搭載したx86で実行されているLinuxシステムを使用して、組み込みのQtアプリケーションをクロスコンパイルしましたARM Qt Embeddedを実行しているシステム。モバイルアプリを使用している場合は、クロスコンパイル。もちろん、Windowsシステムでクロスコンパイルできます。本当に必要なのはクロスコンパイラだけです。gccはソースコードで利用できるため、gccクロスコンパイラは非常に一般的です。Qtでクロスコンパイルを実行するには、使用するコンパイラーを指定するqmakeのmkspec。

最後の段落は、おそらくこの種のクロスコンパイルを実行できないことを示しています。Linux用またはMac用のWindowsマシンで実行でき、Windows用のLinuxで実行できる可能性があります。 WindowsでmingwバージョンのQtを再使用しますが、LinuxまたはMac forWindowsでMicrosoftコンパイラベースのアプリケーションをコンパイルすることは決してありません。

結論-あなたが示したことをしなさい。各ターゲットプラットフォームでソースを取得し、そこでコンパイルします。

1
Scott