はじめに
このチュートリアルでは、SDKのインストールディレクトリを${SDK_DIR}
として記載します。
外部ライブラリのビルドにつきましてはサポート対象外となっております。問い合わせいただいてもサポートできかねますので予めご了承ください。
目次
概要
C/C++版のAdamAppで外部ライブラリを使用する場合は、C/C++モジュールのコンパイルが必要です。
本チュートリアルでは、C/C++用外部ライブラリをビルドするための環境構築~モジュールのコンパイルまでの手順を解説します。
チュートリアルで使用する外部ライブラリ
OpenCV 4.7.0
Curl 7.87.0
SQLite 3.40.0
libjpeg (version : 9e)
C/C++モジュールをコンパイルする(OpenCV)
チュートリアルとして、OpenCVのコンパイルを実施します。
OpenCVの詳細については公式サイトよりご確認ください。
コンパイル環境を準備する
OpenCVのビルドには「cmake」が必要ですので、インストールします。
$ sudo apt-get install cmake
「setup_env.sh」を使用して SDK を使用するようにビルド環境をセットアップします。
$ cd ${SDK_DIR} $ source setup_env.sh ipro-ambaCV2X
ここでは「ipro-ambaCV2X
」を指定していますが、利用する環境にあわせて適宜変更ください。
OpenCVのソースコードをダウンロードする
公式サイトからOpenCVのソースコードをダウンロードします。
このチュートリアルでは、例として4.7.0のソース(opencv-4.7.0.zip)を使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
OpenCVのビルドのため、サンプルのMakefileとcmakeファイルをSDKに同梱しています。
ダウンロードしたソースコード(opencv-4.7.0.zip)を下記のフォルダにコピーしてください。
${SDK_DIR}
/external/build/opencv/aarch64-linux-gnu
cmakeの設定
必要に応じて、${SDK_DIR}/external/build/opencv/aarch64-linux-gnu/aarch64_toolchain.cmakeファイルをカスタマイズします。
このチュートリアルでは、カスタマイズせず進めます。
Makefileの設定
${SDK_DIR}/external/build/opencv/aarch64-linux-gnu/Makefileファイルの2行目をダウンロードしたバージョンに合わせて編集します。
このチュートリアルでは、opencv-4.7.0 とします。
OPENCV_DIR = opencv-4.7.0
また、OpenCV モジュールのビルド オプションをカスタマイズします。
Makefile で「-D」を検索すると、オプションを確認できます。
本当に必要なオプションのみを有効にしてください。
不要なオプションが含まれると、OpenCV ライブラリのサイズが必要以上に大きくなり、アプリに搭載できなくなります。
このチュートリアルでは、カスタマイズせず進めます。
ビルドを実行し、OpenCVをインストールする
${SDK_DIR}/external/build/opencv/aarch64-linux-gnuディレクトリでOpenCVをビルドします。
sudo makeのように実行すると一般ユーザではアクセスできない場所にファイル生成された場合などに失敗する可能性があります。sudo makeで実行する場合はUbuntu OSのユーザ設定を事前に確認ください。
$ make
OpenCVのコンパイルには時間がかかるため、しばらく待ちます。
${SDK_DIR}/external/build/opencv/aarch64-linux-gnuディレクトリでOpenCVをインストールします。
$ make install
管理者権限が必要な場合があります。その場合は、sudo make install で実行してください。
ライブラリは${SDK_DIR}/external/build/opencv/aarch64-linux-gnu/installディレクトリに作成されています。
アプリで使用する
ビルドしたOpenCVのライブラリやヘッダーファイルをアプリフォルダにコピーします。
このチュートリアルでは、サンプルアプリ「opencv_edge_detection_app」を例にします。
ライブラリのコピー
${SDK_DIR}/external/build/opencv/aarch64-linux-gnuディレクトリで下記コマンドを実行します。
$ cp -a install/lib/libopencv_world.so* ../../../../src/adamapp/opencv_edge_detection_app/external/lib/aarch64-linux-gnu
共有フォルダなどを使用し、Windowsのエクスプローラーを使ってコピーすると、シンボリックリンクが正しくコピーされないことがありますので、Linux上でコピーしてください。
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp/opencv_edge_detection_app/external/lib/aarch64-linux-gnu/libopencv_world.so ${SDK_DIR}/src/adamapp/opencv_edge_detection_app/external/lib/aarch64-linux-gnu/libopencv_world.so.4.7.0 ${SDK_DIR}/src/adamapp/opencv_edge_detection_app/external/lib/aarch64-linux-gnu/libopencv_world.so.407
ヘッダーファイルのコピー
${SDK_DIR}/external/build/opencv/aarch64-linux-gnuディレクトリで下記コマンドを実行します。
$ cp -r install/include/opencv4/opencv2 ../../../../src/adamapp/opencv_edge_detection_app/external/include
コピー後のディレクトリ構成は変化ありません。
コピー先ディレクトリ ${SDK_DIR}/src/adamapp/opencv_edge_detection_app/external/include/opencv2 にファイルがコピーされていることを確認してください。
サンプルアプリをビルドする
サンプルアプリ「opencv_edge_detection_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。
ビルド方法はこちらを参照してください。
アプリ画面を開きます(下記画像の赤枠ボタン)。
下記画像のような、カメラが撮影した映像のエッジ検出された画像が表示されていれば成功です
C/C++モジュールをコンパイルする(Curl)
コンパイル環境を準備する
「setup_env.sh」を使用して SDK を使用するようにビルド環境をセットアップします。
$ cd ${SDK_DIR} $ source setup_env.sh ipro-ambaCV2X
ここでは「ipro-ambaCV2X
」を指定していますが、利用する環境にあわせて適宜変更ください。
libcurlのソースコードをダウンロードする
公式サイトからlibcurlのソースコードをダウンロードします。
このチュートリアルでは、例として7.87.0を使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
各OSに配慮したファイルも存在するため、過去のバージョンは画像赤枠のOld Releasesから取得することを推奨します。
ダウンロードしたソースコードを格納するディレクトリを作成します。
$ cd ${SDK_DIR}/external/build $ mkdir curl $ cd curl
ダウンロードしたソースコード(curl-7.87.0.tar.gz)を作成したcurlディレクトリにコピーした後、展開します。
$ cd ${SDK_DIR}/external/build/curl $ cp [ダウンロードしたソースコード格納ディレクトリ]/curl-7.87.0.tar.gz ./ $ tar -zxvf curl-7.87.0.tar.gz $ cd curl-7.87.0
Configureを実行する
${SDK_DIR}/external/build/curl/curl-7.87.0 ディレクトリで実行します。
[--host]オプションは必ずつけてください。
そのほかのオプションは使用する機能に合わせて選択してください。
OpenSSLなしの場合
$ ./configure --host=aarch64-linux-gnu --without-ssl
OpenSSLありの場合
$ ./configure --host=aarch64-linux-gnu --with-ssl=[OPENSSL_DIR]
[OPENSSL_DIR]
は任意のディレクトリ
このチュートリアルではOpenSSLなしの場合で実行します。
ビルドを実行する
${SDK_DIR}/external/build/curl/curl-7.87.0 ディレクトリでcurlをビルドします。
$ make
アプリで使用する
ビルドしたライブラリやヘッダーファイルをアプリフォルダにコピーします。
このチュートリアルでは、サンプルアプリ「update_sample_app」を例にします。
ライブラリのコピー
${SDK_DIR}/external/build/curl/curl-7.87.0 ディレクトリで下記コマンドを実行します。
$ cp -a lib/.libs/libcurl.so* ../../../../src/adamapp/update_sample_app/external/lib/aarch64-linux-gnu
共有フォルダなどを使用し、Windowsのエクスプローラーを使ってコピーすると、シンボリックリンクが正しくコピーされないことがありますので、Linux上でコピーしてください。
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp/update_sample_app/external/lib/aarch64-linux-gnu/libcurl.so ${SDK_DIR}/src/adamapp/update_sample_app/external/lib/aarch64-linux-gnu/libcurl.so.4 ${SDK_DIR}/src/adamapp/update_sample_app/external/lib/aarch64-linux-gnu/libcurl.so.4.8.0
ヘッダーファイルのコピー
${SDK_DIR}/external/build/curl/curl-7.87.0 ディレクトリで下記コマンドを実行します。
$ cp -r include/curl ../../../../src/adamapp/update_sample_app/external/include
コピー後のディレクトリ構成は変化ありません。
コピー先ディレクトリ ${SDK_DIR}/src/adamapp/update_sample_app/external/include/curl にファイルがコピーされていることを確認してください。
サンプルアプリをビルドする
サンプルアプリ「update_sample_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。
ビルド方法はこちらを参照してください。
アプリ画面を開きます(下記画像の赤枠ボタン)。
下記のようなメッセージが表示されていれば成功です
{"r_appDataType":"0","r_appData":"CA=="}
C/C++モジュールをコンパイルする(SQLite)
コンパイル環境を準備する
「setup_env.sh」を使用して SDK を使用するようにビルド環境をセットアップします。
$ cd ${SDK_DIR} $ source setup_env.sh ipro-ambaCV2X
ここでは「ipro-ambaCV2X
」を指定していますが、利用する環境にあわせて適宜変更ください。
SQLiteのソースコードをダウンロードする
公式サイトからSQLiteのソースコードをダウンロードします。
このチュートリアルでは、例として3.40.0を使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
SQLite Home Page
https://www.sqlite.org/index.html
SQLite 3.40.0
ダウンロードしたソースコードを格納するディレクトリを作成します。
$ cd ${SDK_DIR}/external/build $ mkdir sqlite $ cd sqlite
ダウンロードしたソースコード(sqlite-autoconf-3400000.tar.gz)を作成したsqliteディレクトリにコピーした後、展開します。
$ cd ${SDK_DIR}/external/build/sqlite $ cp [ダウンロードしたソースコード格納ディレクトリ]/sqlite-autoconf-3400000.tar.gz ./ $ tar -zxvf sqlite-autoconf-3400000.tar.gz $ cd sqlite-autoconf-3400000
Configureを実行する
${SDK_DIR}/external/build/sqlite/sqlite-autoconf-3400000 ディレクトリで実行します。
[--host]オプションは必ずつけてください。
そのほかのオプションは使用する機能に合わせて選択してください。
$ ./configure --host=aarch64-linux-gnu
ビルドを実行する
${SDK_DIR}/external/build/sqlite/sqlite-autoconf-3400000 ディレクトリでSQLiteをビルドします。
$ make
アプリで使用する
ビルドしたライブラリやヘッダーファイルをアプリフォルダにコピーします。
このチュートリアルでは、サンプルアプリ「sqlite_app」を例にします。
sqlite_app の動作にはSDカードが必要です。SDカードを挿入できるカメラのみ確認可能です。
また、カメラのファームウェアによってはext4でフォーマットしたSDカードでないと動作しない可能性があります。
ライブラリのコピー
${SDK_DIR}/external/build/sqlite/sqlite-autoconf-3400000 ディレクトリで下記コマンドを実行します。
$ cp -a .libs/libsqlite3.* ../../../../src/adamapp/sqlite_app/external/lib/aarch64-linux-gnu
共有フォルダなどを使用し、Windowsのエクスプローラーを使ってコピーすると、シンボリックリンクが正しくコピーされないことがありますので、Linux上でコピーしてください。
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.a ${SDK_DIR}/src/adamapp/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.la ${SDK_DIR}/src/adamapp/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.lai ${SDK_DIR}/src/adamapp/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so ${SDK_DIR}/src/adamapp/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so.0 ${SDK_DIR}/src/adamapp/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so.0.8.6
ヘッダーファイルのコピー
${SDK_DIR}/external/build/sqlite/sqlite-autoconf-3400000 ディレクトリで下記コマンドを実行します。
$ cp sqlite3.h ../../../../src/adamapp/sqlite_app/external/include
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp/sqlite_app/external/include/sqlite3.h
Makefileの修正
SQLiteの.soや.aファイルに合わせてMakefileを修正する必要があります。
このチュートリアルではSQLiteライブラリが「libsqlite3.so」「libsqlite3.a」のファイル名になっているので、このファイル名に合わせて修正することになります。
${SDK_DIR}/src/adamapp/sqlite_app/Makefile を下記の通り修正します。
修正前)ADD_LIBS+= sqlite
↓
修正後)ADD_LIBS+= sqlite3
サンプルアプリをビルドする
サンプルアプリ「sqlite_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。
ビルド方法はこちらを参照してください。
アプリ画面を開きます(下記画像の赤枠ボタン)。
下記のような画面が表示されていれば成功です。
C/C++モジュールをコンパイルする(libjpeg)
Docker環境を構築する
Ubuntu(64-bit)環境でlibjpegを利用するためにDocker環境でコンパイルします。
こちらを参考にしてDocker環境を構築およびDockerイメージを作成してください。
libjpegのソースコードをダウンロードする
公式サイトからlibjpegのソースコードをダウンロードします。
このチュートリアルでは、例としてバージョン9eを使用します。
ダウンロードするバージョンは、使用する機能に合わせて選択してください。
libjpeg (version : 9e)
ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。
コンパイル手順ファイルを更新する
${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。
下記の内容をコピーしてください。
#!/bin/sh -x HOME_PATH=/home/docker LIBJPEG_ARCHIVES=jpegsrc.v9e.tar.gz LIBJPEG_DIR=jpeg-9e ## for libjpeg cd ${HOME_PATH} tar zxf ${LIBJPEG_ARCHIVES} cd ${LIBJPEG_DIR} ./configure make
コンパイルする
Dockerを用いてlibjpegモジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1
${SDK_DIR}/external/build/sample/docker/docker_volume/jpeg-9eにコンパイル済みモジュールが作成されます。
AdamAppに配置する
作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルではsrc/adamapp/jpeg_appを例とします。
libjpegを配置する
libjpegライブラリは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/jpeg-9e/.libs
libjpeg.so.9.5.0
上記ファイルを、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp/jpeg_app/external/lib/aarch64-linux-gnu
$ cp -r ${SDK_DIR}/external/build/sample/docker/docker_volume/jpeg-9e/.libs/libjpeg.so.9.5.0 ${SDK_DIR}/src/adamapp/jpeg_app/external/lib/aarch64-linux-gnu
コピーしたら、シンボリックリンクを作成してください。
$ cd ${SDK_DIR}/src/adamapp/jpeg_app/external/lib/aarch64-linux-gnu/ $ ln -s libjpeg.so.9.5.0 libjpeg.so.9 $ ln -s libjpeg.so.9 libjpeg.so
コピーおよびシンボリックリンク作成後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp/jpeg_app/external/lib/aarch64-linux-gnu/libjpeg.so.9.5.0
${SDK_DIR}/src/adamapp/jpeg_app/external/lib/aarch64-linux-gnu/libjpeg.so.9
${SDK_DIR}/src/adamapp/jpeg_app/external/lib/aarch64-linux-gnu/libjpeg.so
libjpegヘッダファイルは以下のディレクトリにインストールされています。
${SDK_DIR}/external/build/sample/docker/docker_volume/jpeg-9e
jconfig.h
jmorecfg.h
jpeglib.h
上記3ファイルを、AdamAppソースディレクトリにコピーしてください。
${SDK_DIR}/src/adamapp/jpeg_app/external/include
$ cp -r ${SDK_DIR}/external/build/sample/docker/docker_volume/jpeg-9e/jconfig.h ${SDK_DIR}/src/adamapp/jpeg_app/external/include $ cp -r ${SDK_DIR}/external/build/sample/docker/docker_volume/jpeg-9e/jmorecfg.h ${SDK_DIR}/src/adamapp/jpeg_app/external/include $ cp -r ${SDK_DIR}/external/build/sample/docker/docker_volume/jpeg-9e/jpeglib.h ${SDK_DIR}/src/adamapp/jpeg_app/external/include
コピー後のディレクトリ構成は以下のようになります。
${SDK_DIR}/src/adamapp/jpeg_app/external/include/jconfig.h
${SDK_DIR}/src/adamapp/jpeg_app/external/include/jmorecfg.h
${SDK_DIR}/src/adamapp/jpeg_app/external/include/jpeglib.h
サンプルアプリをビルドする
サンプルアプリ「jpeg_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。
ビルド方法はこちらを参照してください。
アプリ画面を開いて(下記画像の赤枠ボタン)、カメラが撮影したjpeg画像が表示されていれば成功です。
チュートリアルは以上となります。