16

クロスプラットフォームの Qt アプリケーションを開発しています。オープンソースではありませんが、フリーウェアです。したがって、コンパイル済みのバイナリとして配布したいと考えています。

Windowsでは問題ありません。コンパイルexeしたものをMinGWおよびQtのDLLと一緒にパックすると、すべてがうまくいきます。

しかし、Linux では問題があります。これは、ユーザーが私のシステムとは非常に異なるシステムでライブラリを共有している可能性があるためです。

Qt デプロイメント ガイドでは、静的リンクと共有ライブラリの使用という 2 つの方法が提案されています。最初のものは巨大な実行可能ファイルを生成し、Qt が依存する多くのライブラリの静的バージョンも必要とします。つまり、それらすべてをゼロから再構築する必要があります。2 番目の方法は、アプリケーションの起動直前にダイナミック リンカを再構成することに基づいており、少しトリッキーに思えます。

Linux で Qt アプリケーションを配布した経験を共有できますか? どのような方法を使用すればよいですか? どのような問題に直面する可能性がありますか? この仕事を成し遂げる他の方法はありますか?

4

8 に答える 8

15

LD_LIBRARY_PATH共有ライブラリを使用する方法がありますが、(ランチャー シェル スクリプトなどを使用してアプリケーションを実行することを含む)使用を避けることができ、-rpathコンパイラ フラグを使用してバイナリをビルドし、ライブラリを保存する場所を指定します。

たとえば、ライブラリをバイナリの隣に保存するか、バイナリの隣にある "mylib" というディレクトリに保存します。これを QMake ファイルで使用するには、.proファイルに次の行を追加します。

QMAKE_LFLAGS += -Wl,-rpath,\\$\$ORIGIN/lib/:\\$\$ORIGIN/../mylib/

また、システム ライブラリをオーバーライドするローカル ライブラリを使用してバイナリを実行でき、ランチャー スクリプトは必要ありません。

于 2012-11-20T17:34:52.800 に答える
13

Linux で Qt 共有ライブラリを配布することもできます。次に、システムのデフォルトのものの代わりにそれらをロードするようにソフトウェアを取得します。共有ライブラリは、LD_LIBRARY_PATH環境変数を使用してオーバーライドできます。これはおそらく最も簡単な解決策です。これは、実行可能ファイルのラッパー スクリプトでいつでも変更できます。

または、ユーザーがシステムにインストールする必要があるライブラリの最小バージョンを指定するだけです。

于 2009-06-01T14:08:40.823 に答える
4

Linux で Qt アプリ (または実際には共有ライブラリを使用するすべてのアプリ) を配布する場合、実際の実行可能ファイルと関連するラッパー スクリプトを含むディレクトリ ツリーを出荷し、共有ライブラリとその他の必要なリソースを含むサブディレクトリを一番上に配置します。リンクしたくない。

これを行う利点は、ユーザーが環境変数を設定したり、特定の場所にインストールしたりすることを心配することなく、アプリケーションの実行に必要なすべてをラッパー スクリプトでセットアップできることです。アプリケーションはいつでもリソースを見つけることができるため、どこからアプリケーションを呼び出しているかを気にする必要はありません。

実際には、すべての実行可能ライブラリと共有ライブラリを platform/architecture サブディレクトリに配置することで、このツリー構造をさらに進めて、ラッパー スクリプトがローカル アーキテクチャを決定し、そのプラットフォームに適した実行可能ファイルを呼び出し、環境変数を設定して適切なものを見つけることができるようにします。共有ライブラリ。このセットアップは、共通のファイル システムを共有する複数の異なる Linux バージョンを配布する場合に特に役立つことがわかりました。

とはいえ、可能であれば静的にビルドすることを私たちは依然として好んでおり、Qt アプリも例外ではありません。Qt を使用して静的にビルドすることは間違いなく可能であり、krbyrd が応答で指摘したように、多くの追加の依存関係をビルドする必要はありません。

于 2009-06-01T14:42:49.927 に答える
4

sybreonの答えはまさに私がやったことです。ライブラリを常にLD_LIBRARY_PATHに追加するか、もう少し凝ったことを行うことができます。

出荷された Qt ライブラリをディレクトリごとに 1 つセットアップします。シェル スクリプトを作成し、実行可能ファイルでldd実行し、'not found' に対して grep を実行します。これらのライブラリごとに、適切なディレクトリをリストに追加します ($LDD と呼びましょう)。それらをすべて取得したら、 LD_LIBRARY_PATHを以前の値と $LDD に設定してバイナリを実行します。

最後に「全部一から作り直さなきゃ」とのコメント。いいえ、その必要はありません。これらのライブラリの開発パッケージがある場合は、.aファイルが必要です。これらに対して静的にリンクできます。

于 2009-06-01T14:43:16.620 に答える
3

それ自体は答えではありませんが (sybreon はそれをカバーしています)、バイナリが Qt に対して静的にリンクされている場合、商用ライセンスを購入していない限り、バイナリを配布することは許可されていないことに注意してください。 Qt のライセンスに違反しています。)

商用ライセンスをお持ちの場合は、気にしないでください。

商用ライセンスがない場合は、次の 2 つのオプションがあります。

  1. Qt v4.5.0 以降 (LGPL バージョン - オープン ソース アプリ以外で以前のバージョンを使用することはできません) に対して動的にリンクする、または

  2. ソース コードを開きます。

于 2009-06-01T14:42:25.763 に答える
-1

この記事には、トピックに関する情報があります。自分で試してみます: http://labs.trolltech.com/blogs/2009/06/02/deploying-a-browser-on-gnulinux/

一言で言えば:

  • -platform linux-lsb-g++ で Qt を構成する
  • リンクは –lsb-use-default-linker で行う必要があります
  • すべてをパッケージ化してデプロイします (ここでいくつか調整が必要ですが、まだ試していません)
于 2009-06-03T18:03:09.143 に答える