🎉

aws-sdk-cppのクロスコンパイル

2023/06/27に公開

概要

aarch64向けのクロスコンパイル手順です。Dockerfileのベースイメージを変えれば他のCPUアーキテクチャでも同一手順で対応可能なはずです。

ソフト環境

名前 バージョン
OS Ubuntu 20.04
docker 24.0.2, build cb74dfc
docker compose v2.18.1
cuda 11.6
nvidia-docker 2.13.0
(重要!)qemu-user-static 1:4.2-3ubuntu6.27

ハード環境

名前 バージョン
CPU AMD Ryzen 9 3900XT 12-Core
GPU RTX3080
RAM 76GB

手順

以下をgit clone
https://github.com/yosukeueda33/cross_env/tree/main

mntに新しめのaws-sdk-cppをダウンロードして解凍する。この記事では以下とした。
https://github.com/aws/aws-sdk-cpp/archive/refs/tags/1.11.104.tar.gz
cloneしたフォルダ内で以下の手順でコンテナに入る。

sudo docker compose build
sudo docker compose up -d
sudo docker exec -it bash [docker psなどで調べたコンテナID]  

以降はコンテナ内での操作。

/apt/mntにて解凍済みのaws-sdk-cpp-1.11.104ディレクトリに入る。

以下を実行。

./prefetch_crt_dependency.sh

以下を実行。ここにあるように、cmakeは-DBUILD_ONLYオプションで生成するライブラリを選定する。オプションなしの場合makeが長時間になる。
make -j後の数字は並列コンパイル数であり作業環境のスレッド数に合わせる。私の場合は24スレッドだったのでとりあえず-1した23とした。低い値でもコンパイル時間が長くなるだけなので特に問題はない。
私の環境では10分かかった。

cmake -DBUILD_ONLY="s3"
make -j 23

以下の通り、soファイルが生成された。
必要なファイルはlibaws-cpp-sdk-s3.soとlibaws-cpp-sdk-core.soである。

root@90c8a5727855:/app/mnt/aws-sdk-cpp-1.11.104# find . -name *.so | xargs ls -l
-rwxr-xr-x 1 root root 2080624 Jun 22 19:27 ./generated/src/aws-cpp-sdk-s3/libaws-cpp-sdk-s3.so
-rwxr-xr-x 1 root root 4725080 Jun 22 19:23 ./src/aws-cpp-sdk-core/libaws-cpp-sdk-core.so
-rwxr-xr-x 1 root root  514664 Jun 22 19:25 ./tests/testing-resources/libtesting-resources.so

以下コマンドによりコンテナ内に適用される。

make install

includeとsoは以下に適用された。

root@90c8a5727855:/app/mnt/aws-sdk-cpp-1.11.104# ls -l /usr/local/include/aws 
total 64
drwxr-xr-x  2 root root 4096 Jun 22 19:39 auth
drwxr-xr-x  2 root root 4096 Jun 22 19:39 cal
drwxr-xr-x  2 root root 4096 Jun 22 19:39 checksums
drwxr-xr-x  3 root root 4096 Jun 22 19:39 common
drwxr-xr-x  2 root root 4096 Jun 22 19:39 compression
drwxr-xr-x 13 root root 4096 Jun 22 19:39 core
drwxr-xr-x  8 root root 4096 Jun 22 19:39 crt
drwxr-xr-x  2 root root 4096 Jun 22 19:39 event-stream
drwxr-xr-x  3 root root 4096 Jun 22 19:39 external
drwxr-xr-x  2 root root 4096 Jun 22 19:39 http
drwxr-xr-x  2 root root 4096 Jun 22 19:39 io
drwxr-xr-x  2 root root 4096 Jun 22 19:39 iot
drwxr-xr-x  4 root root 4096 Jun 22 19:39 mqtt
drwxr-xr-x  3 root root 4096 Jun 22 19:39 s3
drwxr-xr-x  2 root root 4096 Jun 22 19:39 sdkutils
drwxr-xr-x  4 root root 4096 Jun 22 19:39 testing
root@90c8a5727855:/app/mnt/aws-sdk-cpp-1.11.104# ls -l /usr/local/lib/libaws-*.so
-rw-r--r-- 1 root root 4725080 Jun 22 19:23 /usr/local/lib/libaws-cpp-sdk-core.so
-rw-r--r-- 1 root root 2080624 Jun 22 19:27 /usr/local/lib/libaws-cpp-sdk-s3.so

動作確認

公式サンプルコードを参考に確認用コード(bucketリスト出力)を作成、コンパイルし実行形式ファイルを得た。
S3互換であるMinIOを使用し、上記コンテナ内での実行確認に成功した。

また上記で作成した実行形式ファイルそのままに以下機器での動作確認にも成功した。
https://www.amazon.co.jp/AIスターターキット-モジュールカメラ【camera-Ambarella-OV2732】研究開発用-MK-DVASTNP01/dp/B0B1F16V49/ref=sr_1_1?__mk_ja_JP=カタカナ&keywords=ipro&qid=1687833429&sr=8-1

このカメラのようにコンパイル環境とは別の環境での実行時にはlibaws-cpp-sdk-s3.soとlibaws-cpp-sdk-core.soと、それらが必要とするsoファイルも対象環境へコピーが必要。この依存関係調査には、objdump -plddが有用。
また、githubて提示した環境の、aptで入るlibcurlは不要な機能を含んでいる。ソースからのコンパイルを推奨する。

内容は以上だが、省略している点が多い。コメントをいただければ個別で記事作成します。

Discussion