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 つの実装

推薦する

Apache FlinkCEP でタイムアウトステータス監視を実装するための詳細な手順

CEP - 複合イベント処理。ご注文後、一定期間内にお支払いの確認が取れませんでした。タクシーの配...

Ubuntu 16.04 mysql5.7.17 リモートポート 3306 を開く

MySQLへのリモートアクセスを有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...

docker のインストールが完了し、bridge-nf-call-iptables が無効であると報告される問題を解決します

Centos マシンで docker のインストールが完了したら、docker info コマンドを...

MySQL5.6.31 winx64.zip インストールと設定のチュートリアル

#1. ダウンロード # #2. ローカルに解凍し、必要な構成のmy*.iniを変更します。 #3....

js 配列 fill() 充填メソッド

目次1. fill() 構文2. fill() の使用3. まとめ序文:配列の初期化方法についてはよ...

Docker Compose を使用して Confluence を構築するチュートリアル

この記事は「Attribution 4.0 International (CC BY 4.0)」ライ...

Docker Toolboxを完全にアンインストールする方法

Docker Toolbox は、Windows 10 Professional より前のバージョン...

Docker ポート マッピングと外部アクセス不可の問題

Docker コンテナはサービスを提供し、ポート 8888 をリッスンします。外部からアクセスできる...

MySQL (8 および 5.7) の Docker インストール

この記事では、Dockerを使用してMySQLデータベースとリモートアクセス構成をデプロイする方法を...

base target="" はフレームを開くためのベースリンクのターゲットを指定します

<base target=_blank> は、基本リンクのターゲット フレームを新しいペ...

リンク内の href=# はどういう意味ですか?

現在のページへのリンク。 -------------------一般的な使用法は次のとおりです。 &...

Docker を使用してフロントエンド アプリケーションをデプロイする方法

Dockerはますます普及しています。環境を軽量かつ柔軟に分離し、容量を拡張し、運用保守管理を容易に...

nginx httpモジュールのデータ保存構造の概要

このセクションから、http モジュールの実装原理について説明します。http モジュールで非常に重...

知らないかもしれない奇妙で興味深いDockerコマンド

はじめに使えるかもしれないが、あまり使われていない、シンプルで実用的なDockerコマンドをいくつか...

nginx 503 サービスが一時的に利用できない問題を解決する方法

最近、ウェブサイトを更新すると、503 Service Temporarily Unavailabl...