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

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をビルドします。

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上でコピーしてください。

参考:https://dev-partner.i-pro.com/space/TPFAQ/582320143

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

${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ライブラリには、ライブラリのデバッグに使用するための情報が含まれています。

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

不要なファイルを削除するだけで数十MBの容量削減になります。アプリのファイルサイズが大きくなるとROM容量制限によりアプリ異常終了の原因となりますのでご注意ください。

$ cd ${SDK_DIR}/src/adamapp/opencv_edge_detection_app/external/lib/aarch64-linux-gnu/ $ aarch64-linux-gnu-strip --strip-debug libopencv_world.so $ aarch64-linux-gnu-strip --strip-debug libopencv_world.so.4.7.0 $ aarch64-linux-gnu-strip --strip-debug libopencv_world.so.407

 

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

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

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

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

 

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

 

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


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

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

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

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

 

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

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

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

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

https://curl.se/download.html

各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上でコピーしてください。

参考:https://dev-partner.i-pro.com/space/TPFAQ/582320143

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

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

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

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

 

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

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

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

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

$ 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上でコピーしてください。

参考:https://dev-partner.i-pro.com/space/TPFAQ/582320143

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

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

 

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

サンプルアプリをビルドする前に、下記の画面にて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ファイルに、コンパイル手順を記載します。

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

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

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

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

 

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

 

Related content