---
title: "C/C++用外部ライブラリをソースコードからビルド"
canonical: "https://dev-partner.i-pro.com/space/TPFAQ/970000260/C%2FC%2B%2B%E7%94%A8%E5%A4%96%E9%83%A8%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8B%E3%82%89%E3%83%93%E3%83%AB%E3%83%89"
format: markdown
---
> ⚠️ ビルド方法を改善した内容を下記に公開しております。  
> ⚠️ [https://iproiot.atlassian.net/wiki/spaces/TPFAQ/pages/3016164316](https://iproiot.atlassian.net/wiki/spaces/TPFAQ/pages/3016164316)   
> ⚠️ 今後はこちらを利用ください。

# はじめに

このチュートリアルでは、SDKのインストールディレクトリを`${SDK_DIR}`として記載します。

> ⚠️ 外部ライブラリのビルドにつきましてはサポート対象外となっております。本章に記載の情報を参考に外部ライブラリをビルドしてください。問い合わせいただいてもサポートできかねますので予めご了承ください。


# 目次

---

> Macro (toc)

# 概要

---

C/C++版のAdamAppで外部ライブラリを使用する場合は、C/C++モジュールのコンパイルが必要です。

本チュートリアルでは、C/C++用外部ライブラリをビルドするための環境構築～モジュールのコンパイルまでの手順を解説します。

##### チュートリアルで使用する外部ライブラリ

- OpenCV 4.7.0
- Curl 7.87.0
- SQLite 3.40.0
- libjpeg (version : 9e)

> ⚠️ - OpenCVをビルドする場合はディスク空き容量やメモリを多く必要とします。環境にも依存しますが、ディスク空き容量は10GB以上、メモリは8GB以上が推奨されますので事前に確認ください。
> ⚠️ - 外部ライブラリはビルドに数時間かかる場合もあります。事前に時間に余裕を持って実施ください。


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

---

チュートリアルとして、OpenCVのコンパイルを実施します。

OpenCVの詳細については公式サイトよりご確認ください。

> [http://opencv.org/](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/](http://opencv.org/releases/)

このチュートリアルでは、例として4.7.0のソース（opencv-4.7.0.zip）を使用します。

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

![image](media://efceda7b-6515-45bb-8406-6493a3009255)

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](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バージョンに応じて実施ください。

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

![image](media://c9e3f265-5a88-4633-9e98-768f71c9d453)


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

![image](media://fa32fdf9-2392-41a9-90c8-01b2fae4a2a9)


# 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](https://curl.se/download.html)

![image](media://5b009c56-e274-4aab-a84f-903464602a53)

> ℹ️ 各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](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バージョンに応じて実施ください。

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

![image](media://c9e3f265-5a88-4633-9e98-768f71c9d453)


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

> {"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](https://www.sqlite.org/index.html)
> 
> SQLite 3.40.0
> 
> [https://www.sqlite.org/2022/sqlite-autoconf-3400000.tar.gz](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](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ボタンを押下します。

![image](media://72a617d6-81b7-4896-b45c-a4554bab9de2)


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

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

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

![image](media://c9e3f265-5a88-4633-9e98-768f71c9d453)


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

![image](media://ce126a5f-7171-4de0-b59e-c49a10f33caf)


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

---

## Docker環境を構築する

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

[こちら](https://iproiot.atlassian.net/wiki/spaces/TPFAQ/pages/830048002/Python3.7.9#Docker環境を構築する)を参考にしてDocker環境を構築およびDockerイメージを作成してください。


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

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

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

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

> libjpeg (version : 9e)
> 
> [http://www.ijg.org/files/jpegsrc.v9e.tar.gz](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画像が表示されていれば成功です。

![image](media://c9e3f265-5a88-4633-9e98-768f71c9d453)


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