C/C++用外部ライブラリをビルドする

はじめに

このチュートリアルでは、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の詳細については公式サイトよりご確認ください。

http://opencv.org/

 

コンパイル環境を準備する

OpenCVのビルドには「cmake」が必要ですので、インストールします。

$ sudo apt-get install cmake

「setup_env.sh」を使用して SDK を使用するようにビルド環境をセットアップします。

$ cd ${SDK_DIR} $ source setup_env.sh ipro-ambaCV2X

ここでは「ipro-ambaCV2X」を指定していますが、利用する環境にあわせて適宜変更ください。

 

OpenCVのソースコードをダウンロードする

公式サイトからOpenCVのソースコードをダウンロードします。

http://opencv.org/releases/

このチュートリアルでは、例として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をビルドします。

${SDK_DIR}/external/build/opencv/aarch64-linux-gnuディレクトリでOpenCVをインストールします。

ライブラリは${SDK_DIR}/external/build/opencv/aarch64-linux-gnu/installディレクトリに作成されています。

 

アプリで使用する

ビルドしたOpenCVのライブラリやヘッダーファイルをアプリフォルダにコピーします。

このチュートリアルでは、サンプルアプリ「opencv_edge_detection_app」を例にします。

ライブラリのコピー

${SDK_DIR}/external/build/opencv/aarch64-linux-gnuディレクトリで下記コマンドを実行します。

コピー後のディレクトリ構成は以下のようになります。

ヘッダーファイルのコピー

${SDK_DIR}/external/build/opencv/aarch64-linux-gnuディレクトリで下記コマンドを実行します。

コピー後のディレクトリ構成は変化ありません。

コピー先ディレクトリ ${SDK_DIR}/src/adamapp/opencv_edge_detection_app/external/include/opencv2 にファイルがコピーされていることを確認してください。

 

不要なファイルを削除する

作成されたOpenCVライブラリには、ライブラリのデバッグに使用するための情報が含まれています。

アプリケーション実行時には使用しないため、容量削減のためデバッグ情報を削除することをお勧めします。

 

サンプルアプリをビルドする

サンプルアプリ「opencv_edge_detection_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。

ビルド方法は各SDKバージョンに応じて実施ください。

アプリ画面を開きます(下記画像の赤枠ボタン)。

 

下記画像のような、カメラが撮影した映像のエッジ検出された画像が表示されていれば成功です

 

C/C++モジュールをコンパイルする(Curl)


コンパイル環境を準備する

「setup_env.sh」を使用して SDK を使用するようにビルド環境をセットアップします。

 

libcurlのソースコードをダウンロードする

公式サイトからlibcurlのソースコードをダウンロードします。

このチュートリアルでは、例として7.87.0を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

https://curl.se/download.html

ダウンロードしたソースコードを格納するディレクトリを作成します。

ダウンロードしたソースコード(curl-7.87.0.tar.gz)を作成したcurlディレクトリにコピーした後、展開します。

 

Configureを実行する

${SDK_DIR}/external/build/curl/curl-7.87.0 ディレクトリで実行します。

[--host]オプションは必ずつけてください。

そのほかのオプションは使用する機能に合わせて選択してください。

OpenSSLなしの場合

OpenSSLありの場合

[OPENSSL_DIR]は任意のディレクトリ

このチュートリアルではOpenSSLなしの場合で実行します。

 

ビルドを実行する

${SDK_DIR}/external/build/curl/curl-7.87.0 ディレクトリでcurlをビルドします。

 

アプリで使用する

ビルドしたライブラリやヘッダーファイルをアプリフォルダにコピーします。

このチュートリアルでは、サンプルアプリ「update_sample_app」を例にします。

ライブラリのコピー

${SDK_DIR}/external/build/curl/curl-7.87.0 ディレクトリで下記コマンドを実行します。

コピー後のディレクトリ構成は以下のようになります。

ヘッダーファイルのコピー

${SDK_DIR}/external/build/curl/curl-7.87.0 ディレクトリで下記コマンドを実行します。

コピー後のディレクトリ構成は変化ありません。

コピー先ディレクトリ ${SDK_DIR}/src/adamapp/update_sample_app/external/include/curl にファイルがコピーされていることを確認してください。

 

サンプルアプリをビルドする

サンプルアプリ「update_sample_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。

ビルド方法は各SDKバージョンに応じて実施ください。

アプリ画面を開きます(下記画像の赤枠ボタン)。

 

下記のようなメッセージが表示されていれば成功です

{"r_appDataType":"0","r_appData":"CA=="}

 

C/C++モジュールをコンパイルする(SQLite)


コンパイル環境を準備する

「setup_env.sh」を使用して SDK を使用するようにビルド環境をセットアップします。

 

SQLiteのソースコードをダウンロードする

公式サイトからSQLiteのソースコードをダウンロードします。

このチュートリアルでは、例として3.40.0を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

SQLite Home Page

https://www.sqlite.org/index.html

SQLite 3.40.0

https://www.sqlite.org/2022/sqlite-autoconf-3400000.tar.gz

ダウンロードしたソースコードを格納するディレクトリを作成します。

ダウンロードしたソースコード(sqlite-autoconf-3400000.tar.gz)を作成したsqliteディレクトリにコピーした後、展開します。

 

Configureを実行する

${SDK_DIR}/external/build/sqlite/sqlite-autoconf-3400000 ディレクトリで実行します。

[--host]オプションは必ずつけてください。

そのほかのオプションは使用する機能に合わせて選択してください。

 

ビルドを実行する

${SDK_DIR}/external/build/sqlite/sqlite-autoconf-3400000 ディレクトリでSQLiteをビルドします。

 

アプリで使用する

ビルドしたライブラリやヘッダーファイルをアプリフォルダにコピーします。

このチュートリアルでは、サンプルアプリ「sqlite_app」を例にします。

ライブラリのコピー

${SDK_DIR}/external/build/sqlite/sqlite-autoconf-3400000 ディレクトリで下記コマンドを実行します。

コピー後のディレクトリ構成は以下のようになります。

ヘッダーファイルのコピー

${SDK_DIR}/external/build/sqlite/sqlite-autoconf-3400000 ディレクトリで下記コマンドを実行します。

コピー後のディレクトリ構成は以下のようになります。

Makefileの修正

SQLiteの.soや.aファイルに合わせてMakefileを修正する必要があります。

このチュートリアルではSQLiteライブラリが「libsqlite3.so」「libsqlite3.a」のファイル名になっているので、このファイル名に合わせて修正することになります。

${SDK_DIR}/src/adamapp/sqlite_app/Makefile を下記の通り修正します。

修正前)ADD_LIBS+= sqlite


修正後)ADD_LIBS+= sqlite3

 

サンプルアプリをビルドする

サンプルアプリをビルドする前に、下記の画面にてSDカードをフォーマットします。(フォーマットしてよいSDカードか事前に確認ください、SDカードのデータは全て消去されます。)
フォーマットが完了したら、SDカードをext(ext4)フォーマットにしてSetボタンを押下します。

 

サンプルアプリ「sqlite_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。

ビルド方法は各SDKバージョンに応じて実施ください。

アプリ画面を開きます(下記画像の赤枠ボタン)。

 

下記のような画面が表示されていれば成功です。

 

C/C++モジュールをコンパイルする(libjpeg)


Docker環境を構築する

Ubuntu(64-bit)環境でlibjpegを利用するためにDocker環境でコンパイルします。

こちらを参考にしてDocker環境を構築およびDockerイメージを作成してください。

 

libjpegのソースコードをダウンロードする

公式サイトからlibjpegのソースコードをダウンロードします。

このチュートリアルでは、例としてバージョン9eを使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

libjpeg (version : 9e)

http://www.ijg.org/files/jpegsrc.v9e.tar.gz

ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。

 

コンパイル手順ファイルを更新する

${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。

下記の内容をコピーしてください。

 

コンパイルする

Dockerを用いてlibjpegモジュールをコンパイルします。

${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。

${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

コピーしたら、シンボリックリンクを作成してください。

コピーおよびシンボリックリンク作成後のディレクトリ構成は以下のようになります。

${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

コピー後のディレクトリ構成は以下のようになります。

${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」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。

ビルド方法は各SDKバージョンに応じて実施ください。

アプリ画面を開いて(下記画像の赤枠ボタン)、カメラが撮影したjpeg画像が表示されていれば成功です。

 

チュートリアルは以上となります。