Qt チュートリアル 3 - Ubuntu (x86_64) での arm64 (aarch64) クロスコンパイル環境と QT コンパイル arm64 アーキテクチャ プロジェクトの構成

前に書く

8年間の苦くて辛くて酸っぱくて甘い時間、春夏秋冬、この人生
Qt の紹介:
Qt (正式な発音 [kju:t]、キュートと同じ発音) はクロスプラットフォームの C++ 開発ライブラリであり、主にグラフィカル ユーザー インターフェイス (Graphical User Interface、GUI) プログラムの開発に使用されます。インターフェイスのないプログラムも開発できます コマンド ライン (コマンド ユーザー インターフェイス、CUI) プログラム。
Qt は、一般的なオペレーティング システムの Windows、Linux、Unix、スマートフォン システムの Android、iOS、WinPhone、組み込みシステムの QNX、VxWorks など、多くのオペレーティング システムをサポートしています。
Qt はグラフィカル インターフェイス アプリケーションを開発するための GUI ライブラリとみなされることが多いですが、これが Qt のすべてではなく、美しいインターフェイス (コントロール、レイアウト、インタラクションなど) を描画するだけでなく、マルチスレッドなどの他の多くの機能も備えています。 、データベース アクセス、画像処理、オーディオおよびビデオ処理、ネットワーク通信、ファイル操作など、これらはすべて Qt に組み込まれています。
インストールプロセスの探索の初期段階では、いくつかの不明なエラーも発生し、暗闇の中で道を探索し、何度も寄り道をしました。
最近、プロジェクトを国内のシステムに適合させる必要があるため、ソフトウェアをさまざまなアーキテクチャの CPU に適合させる必要があります。これに基づいて、この記事で私の経験を共有したいと思います。より多くの同じ志を持った友人が、この探求の道で寄り道を避け、テーマの範囲内にとどまることを願っています。
環境:
PC システム: Ubutu20.04 (x86_64 アーキテクチャ) <本机>
Qt バージョン: Qt5.12.8 (GCC 9.3.0, 64bit) <本机>
Qt Creator バージョン: 4.11.0<本机>
クロスコンパイラー: gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu<本机>
国内システム: Kylin Linux Advanced Server リリース V10 (4.19.90-25.10.v2101.ky10.aarch64) 部署环境<即arm64架构>
GCC: v8.3.0部署环境<即arm64架构>

1. システムアーキテクチャに関連する手順を表示します。

くすみ本机

uname
uname -a
uname -i
uname -r
lsb_release -a
lsb_release -i
lsb_release -r

ここに画像の説明を挿入します
私の村の Linux部署环境<即arm64架构>

uname
uname -a
uname -i
uname -r
nkvers

ここに画像の説明を挿入しますCPU コアの数を確認すると、論理コアの数が表示されます。

lscpu
nproc

2. ARM64クロスコンパイラ環境構築

1) コンパイル ツールを選択します: gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu <可选其他版本>
2) ソース コード インストール クロスコンパイル ツール:
ソース コード インストールの指定されたバージョンは、展開された環境 v8.3.0 に適応します。作成者は指定されたバージョン version をインストールしました。特別な必要がない場合は参照できます。3) クロスコンパイルツールのインストール手順
①ダウンロード: arm Developer
注1:から指定されたバージョンのコンパイラをダウンロードします。
ここに画像の説明を挿入します

注2:Baidu Netdiskを通じてv8.3.0 をダウンロードすることもできます
。 ② インストール:
解压:

tar -xvf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz

重命名:

mv  gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu aarch64-linux-gnu-8.3.0 

将目标复制到指定目录下:<通常は次の場所にコピーします/オプトディレクトリにコピーしました~/パス/行くカタログ>

sudo cp -rf aarch64-linux-gnu-8.3.0/ /opt 

or

mkdir -p ~/path/go
cp -rf aarch64-linux-gnu-8.3.0/ ~/path/go 

次に、環境変数で/etc/プロファイル<このファイルに追加された作成者> または~/.bashrcグローバル変数を追加します <作成者は以前に名前を変更していないため、独自の正しいパスを追加するように注意してください>
$PATH: 次のパスは、gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin の解凍パスです。

sudo vim /etc/profile

#borrieguo アーム aarch64
エクスポートを追加 PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin

ここに画像の説明を挿入します

次に、環境変数をロードします <ファイルに追加してソースします>

source /etc/profile

or

source ~/.bashrc

構成が成功したかどうかを確認します。 aarch64 +TAB を入力して、プロンプトが表示されるかどうかを確認します (対応するバージョンは、構成が成功したことを意味します)。
ここに画像の説明を挿入します
インストール パスを確認します。

which aarch64-linux-gnu-gcc-8.3.0

ここに画像の説明を挿入します

3) 命令インストール クロスコンパイル ツール: 源码安装交叉编译工具和指令安装交叉编译工具选其中一个操作即可
命令インストールは、マシンの適切なバージョンに自動的に適応するため、指定しなくてもより便利です。

sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

インストール後、問題ないか確認し、「aarch64-」と直接入力してTabキーを押し、「aarch64-linux-gnu-gcc」が自動完了できれば問題ありません。
バージョン情報を表示します。

aarch64-linux-gnu-gcc -v

下図のように表示されていればインストールは完了です。
ここに画像の説明を挿入します
インストール パスを確認します。

which aarch64-linux-gnu-gcc

ここに画像の説明を挿入します

4) ソース コードのコンパイル テスト:
クロスコンパイラー環境が正常に確立されているかどうかをさらに検証するために、検証テスト用のソース コードをコンパイルできます。 (省略可)
著者が検証しているのはC++プログラムです。main.cpp内容は以下の通りです。

#include <iostream>

using namespace std;

int main()
{
    
    
    cout << "Hello World!" << endl;
    return 0;
}

意思main.cppソース コードは、次の指示に従って arm64 実行可能ファイルにコンパイルされます。

aarch64-linux-gnu-g++ -o main main.cpp

コンパイルが完了したら、fileコマンドを使用してファイル タイプが であるかどうかを確認しますELF:64bit LSB shared object,ARM aarch64...。その場合は、ソース コードのコンパイルを完了します。

file main

ここに画像の説明を挿入します
readelf -hこのコマンドを使用して、ファイル システム アーキテクチャが であるかどうかを確認することもできますAArch64。その場合は、ソース コードのコンパイルを完了します。

readelf -h main

ここに画像の説明を挿入します

3. Qtコンパイル arm64環境構築

1) Qt バージョンを選択します: 5.12.8 <可选其他版本>
2) Qt ソース コードのダウンロード:
後で開発ボードで Qt プログラムを実行するため、Qt ソース コード パッケージをダウンロードし、クロスコンパイル ツールでコンパイルして、ターゲット プラットフォーム Qt SDK 上で実行できるプログラム。私のマシンの Qt バージョンは Qt5.12.8 (GCC 9.3.0, 64bit) なので、マシン上に 2 つの Qt 環境 (x86_64 と arm64) を構築するために Qt5.12.8 のソース コードをダウンロードしました。ローカル PC で ARM64 コンパイル環境を構成します。ローカル PC でコンパイルが完了したら、Qt クロスコンパイル環境を構成し、Qt を使用して作成したコードをコンパイルし、最後にコピーしてデプロイして ARM プラットフォームで実行します。 。
注1:Qt公式サイトのダウンロードアドレス
ここに画像の説明を挿入します

注2:Baidu ネットワーク ディスクダウンロード v5.12.8

3) Qt ソースコードのインストール:
① 解凍:
qt-everywhere-src-5.12.8.tar.xz をダウンロードし、xz コマンドを使用して qt-everywhere-src-5.12.8.tar ファイルを解凍し、 tar コマンドを使用して qt -everywhere-src-5.12.8.tar ファイルを解凍し、フォルダー qt-everywhere-src-5.12.8 を取得します。

xz -d qt-everywhere-src-5.12.8.tar.xz
tar -xvf qt-everywhere-src-5.12.8.tar

or

tar -xvf qt-everywhere-src-5.12.8.tar.xz

ここに画像の説明を挿入します
② SDK のインストール パスを定義し
强烈不建议在Qt源码的目录下直接进行编译,那样会污染源码所在目录。建议在Qt源码所在的同级目录下,新建一个文件夹用来存放编译过程中产生的临时文件。一定要注意源码路径不能含有中文!
、コンパイル プロセスのパスを作成します。

mkdir Qt-5.12.8-build

最終的なインストール パスを作成します。

mkdir Qt-5.12.8-arm64

③インストール
安装准备1)
オープンqt-everywhere-src-5.12.8/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf設定ファイルを編集し、以下の内容に変更します。この内容は後で使用するため、最初にここのコンパイラを変更する必要があります。
ご自身のクロスコンパイラに合わせてコンパイル、修正を行ってください 本機のクロスコンパイラは以下の通りですaarch64-linux-gnu-

ここに画像の説明を挿入します
注: 上記の qmake.conf ファイルで、Ubuntu に複数のクロスコンパイラーがある場合は、必ずクロスコンパイラーの前に絶対パスを追加してください。そうしないと、最初の作成時に「見つかりません」などのエラーが表示されます。または、次のようなエラーが表示されます。エラーが発生する

Makefile:51: ターゲット 'sub-corelib-make_first' のレシピが失敗しました
make[2]: *** [sub-corelib-make_first] エラー 2
make[2]: ディレクトリ '~/path/qt/qt-everywhere- を離れますopensource-src-5.12.8/qtbase/src'
Makefile:46: ターゲット 'sub-src-make_first' のレシピが失敗しました
make[1]: *** [sub-src-make_first] エラー 2
make[1]: 終了しますディレクトリ '~/path/qt/qt-everywhere-opensource-src-5.12.8/qtbase'
Makefile:77: ターゲット 'module-qtbase-make_first' のレシピが
make に失敗しました: *** [module-qtbase-make_first] エラー2

安装准备2)
Qt-5.12.8-build フォルダーに入り、configure を実行します。

./../qt-everywhere-src-5.12.8/configure -prefix /home/airobot/path/qt/Qt-5.12.8-arm64 -make libs -xplatform linux-aarch64-gnu-g++  -skip qtdeclarative -no-opengl

注:
-prefix は、インストール フォルダを表します。これは、上で定義した最終的なインストール パスです。ディレクトリは対応している必要があることに注意してください。
-xplatform は、指定したコンパイラを表します。
-no-opengl -no は、モジュールをコンパイルしないことを意味します。openGL のコンパイルをスキップします ( Qt はすでにインストールされているため、インターフェイスは必要ありません);
-skip qtdeclarative qtdeclarative のコンパイルをスキップします;
その他のパラメーター:
-opensource オープン ソース バージョンをコンパイルします -commercial 商用バージョンをコンパイルします (オプションのパラメーター);
-static 静的ライブラリを生成します.a ファイル - 共有は動的ライブラリ so files を生成します (オプションのパラメータ、デフォルトは共有です) 注:静态库与动态库区别是在生成目标文件的链接方式上,静态库采用静态链接,在生成的目标文件(如执行文件)中会包含库文件代码,而动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。
-force-debug-info はデバッグ情報の生成を強制します (オプションのパラメータ) 这个参数是让Qt release版本也生成.pdb文件。这个文件有什么作用呢?它就是我们在release版本下设置了异常捕获信息函数,打印出错堆栈信息所必须的文件。如果程序没用开启异常捕获选项,是不需要开启这个参数的。
-opengl 動的は opengl ライブラリを指定します (オプションのパラメータ)
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。 OpenGL™ 是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。 OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
-skip はmodule
-nomake はモジュール
-mp をコンパイルしてマルチコアのコンパイルを開始しません
注: -skip と -nomake はどちらも省略できますが、-skip qtdeclarative パラメータは省略できません。qtdeclarative モジュールには依存するライブラリがあります。ここでコンパイルをスキップしないと失敗します。
他に必要な場合は、./configure -help を使用して特定のコマンドを表示できます。

ここに画像の説明を挿入します

「vim autoconfigure.sh」コマンドを使用して新しい「autoconfigure.sh」スクリプトを作成することもできます。その後、configure を使用して Makefile を生成する必要があります。コマンドは比較的長いため、通常はスクリプトを作成して実行します。 Makefile を生成するスクリプト。
autoconfigure.shは次のとおりです。

#!/bin/sh
#export PATH=$PATH:~/path/go/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin
./../qt-everywhere-src-5.12.8/configure -prefix ~/path/qt/Qt-5.12.8-arm64 \
#-static \
#-release \
-opensource \
-make libs \
-xplatform linux-aarch64-gnu-g++ \
#-optimized-qmake \
#-pch \
#-qt-libjpeg \
#-qt-zlib \
-no-opengl \
#-skip qt3d \
#-skip qtcanvas3d \
#-skip qtpurchasing \
#-no-sse2 \
#-no-sse3 \
#-no-ssse3  \
#-no-sse4.1 \
#-no-sse4.2  \
#-no-avx \
#-no-avx2 \
#-no-mips_dsp \
#-no-mips_dspr2 \
#-qt-zlib \
#-no-openssl \
#-no-xcb 	\
#-no-cups \
#-no-iconv \
#-no-evdev  \
#-no-icu  \
#-no-fontconfig \
#-nomake examples \
#-nomake tools \
#-skip qtvirtualkeyboard \
#-qpa linuxfb	\
#-no-opengl \
#-no-libinput \
#-no-gstreamer \
#-no-system-proxies \
#-no-slog2  \
#-no-lgmon \
#-linuxfb \
#-v \
#-qt-libjpeg \
#-qt-libpng 	\
#-no-libproxy \
#-no-dbus	\
#-no-glib	\
#-no-compile-examples \
-skip qtdeclarative \

権限を変更します。

sudo chmod +x autoconfigure.sh 

スクリプトを実行します。

./autoconfigure.sh

ここに画像の説明を挿入します

バージョンを選択するように求められたら、「o」と入力して Enter キーを押します。
ここに画像の説明を挿入します

契約に同意するかどうかを尋ねるメッセージが表示されるので、「y」を入力して Enter キーを押します。
ここに画像の説明を挿入します

安装准备3)
コンパイルしてインストールする

コンパイルには10分ほどかかります

make -j4 2>&1 | tee build.log

ここに画像の説明を挿入します

make install

ここに画像の説明を挿入します

完了したら、~/path/qt/Qt-5.12.8-arm64/lib パスを入力してファイルのプロパティを表示します。システムアーキテクチャはAArch64です

readelf -h libQt5DBus.so

システムアーキテクチャはAArch64です

これが必要なものです。時間が来たら開発ボードにコピーします。ここに画像の説明を挿入しますここに画像の説明を挿入します

4. Qt のネイティブ aarch64 クロスコンパイラーを構成する

1) コンパイラ (コンパイラ) の構成:

ここに画像の説明を挿入しますここに画像の説明を挿入します
コンパイラ (コンパイラ) クロスコンパイル ツールをインストールすると、システムは自動的にそれを見つけます。見つからない場合は、[追加] ボタンを使用して自分で追加する必要があります。

which aarch64-linux-gnu-gcc
which aarch64-linux-gnu-g++

添加步骤:
C++コンパイラ
ここに画像の説明を挿入しますここに画像の説明を挿入します
設定が完了したら、「適用」ボタンをクリックして設定を適用します。
Cコンパイラ
ここに画像の説明を挿入しますここに画像の説明を挿入します
設定が完了したら、「適用」ボタンをクリックして設定を適用します。

2) Qt バージョンの設定:

Qt バージョンにはカスタマイズされたバージョンを追加する必要があり、qmake には新しくコンパイルしてインストールされた qmake が必要です

ここに画像の説明を挿入します

設定が完了したら、「適用」ボタンをクリックして設定を適用します。

3) ビルド キット (Kit) 構成:
キットは、新しく追加された Qt バージョンとコンパイラーを選択する必要があります。
ここに画像の説明を挿入します
設定が完了したら、「適用」ボタンを押して適用して有効にし、「OK」ボタンを押して設定を完了します。

5. プロジェクトの確立と完了の検証

新しいプロジェクトを作成し、上で構成したビルド キット (Kit) を選択します。
ここに画像の説明を挿入します

コンパイル後、実行可能ファイルを取得します。

ここに画像の説明を挿入します
実行可能ファイルは ARM aarch64 アーキテクチャであり、検証は成功しました。

この時点で、おめでとうございます! Qt のクロスコンパイル環境が正常にインストールされ、使用を開始できるようになりました。 ! !
次のチュートリアルでは次の内容について説明します。Qt チュートリアル 4 - QEMU を使用して Ubuntu (x86_64) 上に arm64 (aarch64) シミュレーション開発環境を構築し、コンパイルされた ARM aarch64 アーキテクチャ プログラムをこのマシン上で実行して検証できるようにします。
後続のチュートリアルでは以下についても説明します。Qt チュートリアル 5 - Ubuntu (x86_64) 上の SSH クロスコンパイルされた QT プログラムは、リモートの国内システム (ARM aarch64 アーキテクチャ) に直接デプロイされ、 Qt によって開発された ARM aarch64 アーキテクチャ プログラムをコンピュータ上で構成できるようになります。 Qt SSH aarch64 クロスコンパイラーを構成してローカル マシンにデプロイされる環境を共有し、ネイティブ Qt で直接実行検証を実装します。

読んでいただきありがとうございます。私の名前は Huichuang Huiwan です。この記事があなたの問題を解決できることを願っています。
何事も極限までやらなければなりません!

おすすめ

転載: blog.csdn.net/limuyuanrs/article/details/135174144