linuxdeployqt を使用して Ubuntu で Qt プログラムをパッケージ化する問題を解決する

linuxdeployqt を使用して Ubuntu で Qt プログラムをパッケージ化する問題を解決する

いくつかの Qt インターフェース プログラムを作成しましたが、Qt 環境がインストールされていない他のコンピューターに移植するのが難しいことがわかりました。情報を調べたところ、Windows には windowsdeployqt プログラムがあり、Linux には linuxdeployqt があり、これらを使用してパッケージを迅速に作成できることがわかりました。

1. Qt環境を設定する

まず、Qt 環境を設定し、~/.bashrc に次の行を追加します。

エクスポート PATH=/home/xl/Qt5.9.2/5.9.2/gcc_64/bin:$PATH
LD_LIBRARY_PATH=/home/xl/Qt5.9.2/5.9.2/gcc_64/lib:$LD_LIBRARY_PATH をエクスポートします。
エクスポート QT_PLUGIN_PATH=/home/xl/Qt5.9.2/5.9.2/gcc_64/plugins:$QT_PLUGIN_PATH
エクスポート QML2_IMPORT_PATH=/home/xl/Qt5.9.2/5.9.2/gcc_64/qml:$QML2_IMPORT_PATH

home/xl/Qt5.9.2/5.9.2/ディレクトリは、コンピュータにインストールされている Qt パスに応じて変更する必要があります。

次に、 sourec ~/.bashrcを実行して設定を有効にします。

2. linuxdeployqtをコンパイルする

プロジェクトアドレス: https://github.com/probonopd/linuxdeployqt.git。

コンパイルされたパッケージはリリースされていますが、私は Ubuntu 18 を使用しており、システム バージョンが高すぎるため、コードをコンパイルすることを選択します。

コンパイルされたパッケージがシステム バージョンが高すぎることを検出し、実行を継続しないという問題を回避するために、コンパイルする前にtools/linuxdeployqt/main.cppの次のコードをコメント アウトします。

// openSUSE Leap 15.0 は glibc 2.26 を使用し、OBS で使用されます
    /*if (strverscmp (glcv, "2.27") >= 0) { //コメントバージョンチェック qInfo() << "エラー: ホストシステムが新しすぎます。";
      qInfo() << "最も古いバージョンよりも新しいバージョンの glibc を搭載したシステムで実行してください";
      qInfo() << "現在もサポートされているメインストリームディストリビューション (xenial)、つまり glibc 2.23。";
      qInfo() << "これにより、結果として得られるバンドルは、現在もサポートされているほとんどの Linux ディストリビューションで動作します。";
      qInfo() << "詳細については、以下を参照してください";
      qInfo() << "https://github.com/probonopd/linuxdeployqt/issues/340";
      1 を返します。
    }*/

その後、cmake と make を使用してコンパイルできます。生成された実行可能プログラムはtools/linuxdeployqt/linuxdeployqtです。

最後に、使いやすさのために、生成された実行可能プログラムをシステムの/usr/local/bin/ディレクトリにコピーできます。

3. パッケージ

Qt でコンパイルされたプログラムを別のフォルダーにコピーします。

次に、 linuxdeployqt appname.

通常は問題なく完了します。カレントディレクトリに Apprun がありますので、そのまま実行してください。

しかし、システム内に対応するライブラリが不足しているため、スムーズに動作しないこともあります。たとえば、私が遭遇したエラーは次のとおりです。

エラー: patchelf を起動できませんでした。
エラー: $PATH にインストールされていることを確認してください。
エラー: patchelf "libQt5Widgets.so" で rpath を読み取り中にエラーが発生しました: ""
エラー: patchelf "libQt5Widgets.so" で rpath を読み取り中にエラーが発生しました: ""

このエラーは、必要な pathchelf ツールが見つからないことを示し、直接インストールすることで解決できます。

sudo apt install patchelf

その後、次のエラーが発生しました。

エラー: ldd 出力行: "libjasper.so.1 => が見つかりません"
エラー: バイナリ: "/home/xl/Qt5.9.2/5.9.2/gcc_64/plugins/imageformats/libqjp2.so"
エラー: すべてのライブラリが ldd によって検出されることを確認してください。中止します。

これは、システムに libqjp2.so ライブラリが存在しないことを示しています。実は非常に奇妙です。ローカル バージョンは明らかに実行できるのに、なぜこのライブラリ ファイルが欠落しているのでしょうか?しかし、解決策は非常に簡単で、不足しているものをインストールするだけです。

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo aptアップデート
sudo apt インストール libjasper1 libjasper-dev

設置完了後はスムーズに梱包されます。

要約する

上記は、linuxdeployqt を使用して Ubuntu で Qt プログラムをパッケージ化する方法について紹介したものです。お役に立てば幸いです。ご質問がある場合は、メッセージを残してください。すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • Ubuntu Linux で Go 言語の Qt 開発環境を構成する方法
  • pyqt を使用して Linux コマンド プログラムをリモートでバッチ実行する方法
  • 組み込み Linux で QT アプリケーションを再起動する簡単な方法 (QT4.8 qws ベース)
  • Ubuntu Linux で Qt を使用して MySQL データベースに接続する方法
  • Linux 環境 (CentOS 6.7 64 ビット) に Subversion 1.9.5 をインストールする方法
  • Linux QT Kit が見つからない、バージョンが空の問題の解決策

<<:  Mysql でよく使用される時間、日付、変換関数の概要

>>:  vue-router からのフロントエンドルーティングの 2 つの実装

推薦する

この構成ファイルの排他ロックに失敗したという VMware 仮想マシンのプロンプトの解決方法

VMware が異常シャットダウンした後、再起動すると「この構成ファイルを排他的にロックできませんで...

202 無料の高品質 XHTML テンプレート (2)

前回の記事「202 個の無料高品質 XHTML テンプレート (1)」に続き、123WORDPRES...

VMware マルチノード環境を構成する方法

このチュートリアルでは CentOS 7 64 ビットを使用します。各仮想マシンに 2GB のメモリ...

Linuxサーバーのファイアウォールを変更してポートへのリモートアクセスを許可する方法

1. 問題の説明セキュリティ上の理由から、新しく構築されたサーバー クラスターでは、指定されたポート...

Linux ディレクトリ切り替え実装コード例

ファイルの切り替えは Linux でよく行われる操作です。Linux を初めて学ぶときに最初に触れる...

MySQL パーティション関数の詳細な説明と例の分析

まず、データベース パーティショニングとは何でしょうか?以前、MySQL のテーブル パーティショニ...

MySQL のレイテンシ問題とデータフラッシュ戦略プロセスの分析

目次1. MySQLレプリケーションプロセス2. MySQLの遅延問題の分析3. プロモーション期間...

MySQL シリーズ: redo ログ、undo ログ、binlog の詳細な説明

取引の実施REDO ログはトランザクションの永続性を保証し、UNDO ログはトランザクションのロール...

LinuxでのDockerのインストールチュートリアル

Docker パッケージは、デフォルトの CentOS-Extras リポジトリにすでに含まれていま...

MySQL ストアドプロシージャとストアドファンクションの詳細な説明

1 ストアドプロシージャ1.1 ストアドプロシージャとは何かストアド プロシージャは、特定の機能を実...

HTML の META タグの使用に関するヒントの例

HTML メタタグHTML メタタグは、Web ページのコンテンツに関する情報をブラウザや検索エンジ...

MySQL の冗長インデックスと重複インデックスの詳細な説明

MySQL では、同じ列に複数のインデックスを作成できます。意図的であるかどうかにかかわらず、MyS...

Echatsチャートの大画面適応を実装する方法

目次説明する成し遂げるプロジェクトのディレクトリ構造は次のとおりです。効果図は以下のとおりです要約す...

JavaScriptは双方向リンクリストプロセス分析を実装します

目次1. 二重連結リストとは何か2. 双方向リンクリストのカプセル化3. 双方向リンクリストの一般的...

CSS3 オーバーフロープロパティの説明

1. オーバーフローOverflow はオーバーフロー(コンテナ)です。コンテンツがコンテナを越える...