x86linux サーバー上の CMake に基づく C++ コードのクロスコンパイルと例外位置のメソッド

1. arm アーキテクチャのバイナリ ファイルをコンパイルします

1. ndk をダウンロードします。サーバーは Linux 環境に基づいているため、android-ndk-r21e-linux-x86_64.zip をダウンロードし、対応するディレクトリに解凍します。

注: ndk のバージョンは一致する必要があります。バージョンが一致しない場合、コンパイル時にエラーが報告される可能性があります。

2. Android CMake、公式 Web サイトから直接任意のバージョンをダウンロードしてインストールし、インストールが成功したかどうかを確認します。コマンド cmake -version で確認できます。バージョンを確認できた場合は、インストールが成功したことを意味します。

3. C/C++ コードをコンパイルするための CMakeList ファイルを作成し、動的ライブラリ、静的ライブラリ、および実行可能ファイルをコンパイルするように構成できます。ニーズに応じて、通常どおりに構成できます。

4. シェル スクリプトを記述し、新しい run.sh スクリプトを作成します。シェル スクリプトでは、ndk 環境のパス、コンパイルするターゲット アーキテクチャ DANDROID_ABI、および Android ターゲット バージョン DANDROID_NATIVE_API_LEVEL を指定します。スクリプトは自動的に CMakeList を見つけます。ステップ 3 でファイルをコンパイルし、ファイルを実行すると、run.sh コードは次のようになります。

mkdir -p build

cd build
rm -rf *

cmake .. \
-DCMAKE_TOOLCHAIN_FILE=/xxxxx/android-ndk-r21e/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_NATIVE_API_LEVEL=android-29
make -j4
echo "编译时间:"  $(date +%T)

#DCMAKE_TOOLCHAIN_FILE为自己的ndk路径
#DANDROID_AB 可根据需要去配置不同的ABI,即cpu架构

5. CMakeList ファイルを作成した後、run.sh を実行して、必要な ABI 実行可能ファイルをコンパイルします。

2.異常な位置検出方法

ndk 環境でのクロスコンパイルのもう 1 つの利点は、プログラム例外を特定できることです。C/C++ でコンパイルされたバイナリ ファイルにプログラム例外またはエラーがある場合、通常は 0000000000084b6c のようなメモリ アドレスのみが表示され、明確に表示されません。特定のアドレス。コードの 1 行でエラーが報告されるため、問題の特定が困難になります。ndk ツール チェーンの addr2line に従って、特定のコード エラーの場所を特定できます。例は次のとおりです。 1 は自分用の ndk 環境 addr2line を構成するためのパス、2 はバイナリ ファイルへのパスです。

コマンド:android-ndk-r21e/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line -f -C -e xxxx/bin/AC_card_agent 0000000000084b6c  

3. いくつかの質問への回答

1. サーバーが x86 アーキテクチャまたは arm64 アーキテクチャに属しているかどうかを確認する方法

uname -a コマンドで表示できます。

X86 サーバーは次のとおりです。

 armサーバーは次のとおりです。

 2. コンパイルされたバイナリ実行可能ファイルが x86 か arm64 かを確認する方法

ファイル + 実行ファイル名コマンドで表示できます。例は次のとおりです。

 3. コンパイルされた実行可能ファイルが実行できないのはなぜですか?

この状況は通常、実行ファイルのアーキテクチャと動作環境のアーキテクチャが一致していないことが原因で発生します。上記の 2 つの手順で一致しているかどうかを確認できます。

おすすめ

転載: blog.csdn.net/banzhuantuqiang/article/details/131420493