第109话:OpenCV4的交叉构建(从x86-64到ARMv7/ARMv8/RISCV)
本文是2023年OpenCV Advent Calendar的第四天文章。
其他文章已经整理在目录中。
■ 精简版:使用Multiarch可以轻松进行跨平台构建!
-
Ubuntu/Debianには、Multiarchという仕組みがあり、異アーキテクチャを混在できる
- Ubuntu/Debianには、Multiarchという仕組みがあり、異アーキテクチャを混在できる
- OpenCVのクロスビルドに使うと、他Archのバイナリが簡単に作れる
可以跨平台构建freetype包装模块?没问题!每年都会发生几次,在尝试进行交叉编译时,会因为使用freetype而遇到错误而受到指责。
由于有必要编写一个关于交叉构建方法的文档,因此将介绍该流程,并用日语进行说明。
用FFmpeg进行交叉编译?没问题!你想要启用FFmpeg,但是在交叉编译环境中缺少库文件,对此我有好消息!只要使用这种方法,就能搞定!!
◯Python binding ?できらぁ!Python wrapperを有効化するためのオプションを指定することもできます。
◯今回のポイント
-
Ubuntu/Debianには、Multiarchという仕組みがあり、異アーキテクチャを混在できる
◯今回のポイント
-
Ubuntu/Debianには、Multiarchという仕組みがあり、異アーキテクチャを混在できる
- Ubuntu/Debianには、Multiarchという仕組みがあり、異アーキテクチャを混在できる
他アーキのディスクイメージとか面倒なものは要らないでございます
OpenCVのクロスビルドに使うと、他Archのバイナリが簡単に作れる
JetsonもRaspiOSも、みんなdebian系列で友達友達!!ここらへんも適切なhost側OSを選択すれば、クロスコンパイルできるはず!!
さあ、Let’s cross compile !!
◯そもそもMultiarchって何?
If Ubuntu is working, you should not have to concern yourself with the details of how it supports different computer architectures; just install the programs you like.
(翻訳) Ubuntu が動作している場合は、Ubuntu がさまざまなコンピューター アーキテクチャをサポートする方法の詳細を気にする必要はありません。好きなプログラムをインストールするだけです。
If Ubuntu is working, you should not have to concern yourself with the details of how it supports different computer architectures; just install the programs you like.
(翻訳) Ubuntu が動作している場合は、Ubuntu がさまざまなコンピューター アーキテクチャをサポートする方法の詳細を気にする必要はありません。好きなプログラムをインストールするだけです。
ということで、後述の例でも出ますが、host以外にtargetのライブラリも同時にインストールできるようになっております!!
■ 準備
なお、これをやるとHostのLinux環境が汚れるので、VMやコンテナ(Docker)を使う事をお勧めします
◯ディレクトリ構成のイメージ今回は以下のような構成を想定して進めていきます。
另外,基本上,我們希望在/home/<使用者名稱>/work的目錄下進行工作。
/home
+ kmtr - please replace your account name.
+ work
+ opencv - source, cloned from github
+ opencv_contrib - source, cloned from github
+ build4-main - artifact(for Host), created by cmake
+ build4-full - artifact(for Host), created by cmake
+ build4-full_arm64 - artifact(for aarch64 target), created by cmake
+ build4-full_armhf - artifact(for armhf target), created by cmake
+ build4-full_riscv64 - artifact(for riscv64 target), created by cmake
cd
mkdir work
cd wotk
◯必要なライブラリのインストールそれでは、OpenCVの開発に必要なライブラリをインストールしていく。
crossbuild-essential-armhfとcrossbuild-essential-arm64 をインストールすると、クロス開発に必要なアレやコレやソレが全部入る。素敵ですね!!
sudo apt install -y \
git \
cmake \
cmake-curses-gui \
ccache \
ninja-build \
libfreetype-dev \
libharfbuzz-dev \
build-essential \
crossbuild-essential-armhf \
crossbuild-essential-arm64
◯ OpenCVのソースコードをcloneここらへんはいつもの手順ですね。
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
なお、特定バージョンをbuildしたい場合は、git switchを使います。
cd opencv
git switch 4.8.0
git reset --hard
cd ..
cd opencv_contrib
git switch 4.8.0
git reset --hard
cd ..
■ Host版OpenCVビルド
Host版OpenCVビルドなので興味があったら開いてください◯contrib抜き
cmakeを使って、build用の環境を整備する。必要に応じて、ccmakeコマンドなどで微調整しても良い。
cmake -S opencv \
-B build4-main \
-GNinja
— General configuration for OpenCV 4.8.0-dev =====================================
— Version control: 4.8.0-XXX-XXXXXXXX
—
— Platform:
— Timestamp: 2023-09-17T00:01:52Z
— Host: Linux 6.2.0-32-generic x86_64
— CMake: 3.25.1
— CMake generator: Ninja
— CMake build tool: /usr/bin/ninja
— Configuration: Release
特に問題が無ければ、サクッとbuildもinstallもできるはず。
cmake –build build4-main
sudo cmake –install build4-main
sudo ldconfig
◯contrib入り
contrib入りでbuildをするべく、OPENCV_EXTRA_MODULES_PATHを指定する。
cmake -S opencv \
-B build4-full \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
cmakeの結果にもExtra modulesが追加される。
— General configuration for OpenCV 4.8.0-dev =====================================
— Version control: 4.8.0-237-XXXXXXXX
—
— Extra modules:
— Location (extra): /home/kmtr/work/opencv_contrib/modules
— Version control (extra): 4.8.0-17-XXXXXXXX
—
— Platform:
— Timestamp: 2023-09-17T00:35:16Z
— Host: Linux 6.2.0-32-generic x86_64
— CMake: 3.25.1
— CMake generator: Ninja
— CMake build tool: /usr/bin/ninja
— Configuration: Release
あとは普通にまたbuild/install.
cmake –build build4-full
sudo cmake –install build4-full
sudo ldconfig
■ 目标版OpenCV建立(arm64)接下来才是正式比赛。
◯/etc/apt/sources.listの修正
sudo apt edit-sources を使い、インストールするarchを追加していく。なお、私はvi大好きなので、2を選んでいるけど、なんでしたら/bin/edを選んでいただいてもよいのですよ(?)。
sudo apt edit-sources
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]: 2
例えば、ubuntu23.04の場合は以下の行を追加する。これによって、x86-64のhost環境でも、arm64とarmhfのtarget環境のパッケージを入れられる。
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-updates main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-updates universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-updates multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-backports main restricted universe multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-security main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-security universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-security multiverse
例えば、ubuntu23.10の場合は以下の行を追加する。
なお、risc64にも対応させたいならば、,riscv64も追加する。
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-updates main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-updates universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-updates multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-backports main restricted universe multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-security main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-security universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-security multiverse
最後に、データベースを更新する。
sudo apt update
◯dpkg側の設定更新aptの内側にいるdpkgにも、アーキ追加のお知らせをする。そうしないとapt installできない。
sudo dpkg --add-architecture arm64
sudo dpkg --add-architecture armhf
sudo dpkg --add-architecture riscv64 %riscv64
以下コマンドで現状のarchを確認できる。
$ sudo dpkg --print-architecture
amd64
$ sudo dpkg --print-foreign-architectures
arm64
armhf
◯pkg-configの動作確認Host向け、Target向けのライブラリに対して、pkg-configが正常動作できることを確認する。
ディレクトリ構成はこんな感じになっている。
/usr
+ lib
+ aarch64-linux-gnu - shared libraries for arm64
+ pkgconfig - pkg-config files(for shared libraries)
+ arm-linux-gnueabihf - shared libraries for armhf
+ pkgconfig - pkg-config files(for shared libraries)
+ share
+ pkgconfig - pkg-config files(for header files)
Host向け
pkg-config --list-all
Target(armhf)向け
PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config --list-all
Target(arm64)向け
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config --list-all
◯针对arm64的构建版
freetype/harfbuzzのインストール
安装适用于ARM64的FreeType和HarfBuzz。重点是在”arm64″后面添加!
ちゃんとできていると、pkg-configで確認できる。
sudo apt install libfreetype-dev:arm64 libharfbuzz-dev:arm64
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config freetype2 harfbuzz --cflags --libs
-I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/aarch64-linux-gnu/glib-2.0/include -L/usr/lib/aarch64-linux-gnu -lfreetype -lharfbuzz
cmake 改写成中文的方式可以是:建造模型cmakeを実行していく。CMAKE_TOOLCHAIN_FILEは、相対パスではなく絶対パスで指定が必要。
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_arm64 \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/aarch64-gnu.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
当cmake成功时,主机编程环境将变为x86_64,目标编程环境将变为aarch64。
-- General configuration for OpenCV 4.8.0-dev =====================================
-- Version control: 4.8.0-237-XXXXXXXX
--
-- Extra modules:
-- Location (extra): /home/kmtr/work/opencv_contrib/modules
-- Version control (extra): 4.8.0-17-XXXXXXXX
--
-- Platform:
-- Timestamp: 2023-09-17T01:31:30Z
-- Host: Linux 6.2.0-32-generic x86_64
-- Target: Linux 1 aarch64
-- CMake: 3.25.1
-- CMake generator: Ninja
-- CMake build tool: /usr/bin/ninja
-- Configuration: Release
build & installあとは今まで通り、普通にbuildする。
cmake --build build4-full_arm64
sudo cmake --install build4-full_arm64
build結果は、installパスに入っているので、適当な手段でtargetにコピーする。
targetでは、/usr/local/include/opencv4などに必要なファイルをコピーするなどすればよい。
targetでlibrariesのインストールさて、ここでtarget側での作業になる。これまでbuildしたopencvはhost側環境でインストールしたライブラリに依存している。ということは、targetにコピーしただけだと動かない。
ldd /usr/local/lib/libopencv_freetype.so
linux-vdso.so.1 (0xABCDEFG01234567)
libopencv_imgproc.so.408 => /usr/local/lib/libopencv_imgproc.so.408 (0xABCDEFG01234567)
libfreetype.so.6 => /lib/aarch64-linux-gnu/libfreetype.so.6 (0xABCDEFG01234567)
libharfbuzz.so.0 => not found
libopencv_core.so.408 => /usr/local/lib/libopencv_core.so.408 (0xABCDEFG01234567)
因此,目标端也需要安装所需的库。
sudo apt install libfreetype-dev libharfbuzz-dev
sudo ldconfig
ldd /usr/local/lib/libopencv_freetype.so
linux-vdso.so.1 (0xABCDEFG01234567)
libopencv_imgproc.so.408 => /usr/local/lib/libopencv_imgproc.so.408 (0xABCDEFG01234567)
libfreetype.so.6 => /lib/aarch64-linux-gnu/libfreetype.so.6 (0xABCDEFG01234567)
libharfbuzz.so.0 => /lib/aarch64-linux-gnu/libharfbuzz.so.0 (0xABCDEFG01234567)
libopencv_core.so.408 => /usr/local/lib/libopencv_core.so.408 (0xABCDEFG01234567)
万事解决!拜拜!拜拜!
我想启用FFmpeg!
そんな時は、Hostにインストールするライブラリを足しましょう!!
sudo apt install -y \
+ libavcodec-dev:arm64 \
+ libavformat-dev:arm64 \
+ libavutil-dev:arm64 \
+ libswscale-dev:arm64 \
libfreetype-dev:arm64 \
libharfbuzz-dev:arm64
そして、cmakeコマンドで、コンフィグレーション作り直せばオッケー!!
--
-- Video I/O:
-- DC1394: NO
-- FFMPEG: YES
-- avcodec: YES (60.3.100)
-- avformat: YES (60.3.100)
-- avutil: YES (58.2.100)
-- swscale: YES (7.1.100)
-- avresample: NO
-- GStreamer: NO
-- v4l/v4l2: YES (linux/videodev2.h)
◯ Python bindingも有効化したいよ!激活Python绑定时,需要稍加技巧。
お手持ちのPython Versionが、3.9なのか3.10なのか3.11なのか、という情報が必要。
ちょっとトリッキーだけど、こんな感じで、cmake実行時にオプションを追加してあげる。
PYTHON3_REALPATH=`realpath /usr/bin/python3`
PYTHON3_BASENAME=`basename ${PYTHON3_REALPATH}`
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_arm64 \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/aarch64-gnu.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-DPYTHON3_NUMPY_INCLUDE_DIRS="/usr/local/lib/${PYTHON3_BASENAME}/dist-packages/numpy/core/include/" \
-DPYTHON3_INCLUDE_PATH="/usr/include/${PYTHON3_BASENAME};/usr/include/" \
-DPYTHON3_LIBRARIES=`find /usr/lib/aarch64-linux-gnu/ -name libpython*.so` \
-DPYTHON3_EXECUTABLE="/usr/bin/${PYTHON3_BASENAME}" \
-DPYTHON3_CVPY_SUFFIX=".so" \
-GNinja
如果成功地完成,Python 环境变量将被识别为以下类似的方式(为了谨慎起见,可能需要删除文件夹一次)。
--
-- Python 3:
-- Interpreter: /usr/bin/python3.11 (ver 3.11.6)
-- Libraries: /usr/lib/aarch64-linux-gnu/libpython3.11.so
-- numpy: /usr/local/lib/python3.11/dist-packages/numpy/core/include/ (ver undefined - cannot be probed because of the cross-compilation)
-- install path: lib/python3.11/dist-packages/cv2/python-3.11
--
-- Python (for build): /usr/bin/python3.11
--
■ 目标版OpenCV构建(armhf)大致的步骤与arm64相似。
linux-libc-dev:armhf を手動インストールしないと、依存関係でエラーになる。
-DENABLE_NEON=ONを付けると、NEONを使った最適化が有効になる。
sudo apt install linux-libc-dev:armhf
sudo apt install libfreetype-dev:armhf libharfbuzz-dev:armhf
PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/arm-linux-gnueabihf/ \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config freetype2 harfbuzz --cflags --libs
(output) -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include -L/usr/lib/arm-linux-gnueabihf -lfreetype -lharfbuzz
PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_armhf \
-DENABLE_NEON=ON \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/arm-gnueabi.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
cmake --build build4-full_armhf
sudo cmake --install build4-full_armhf
■ 目标版本OpenCV构建(riscv64)
大致的步骤是遵循arm64的规范。
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic main restricted
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-updates main restricted
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic universe
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-updates universe
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-updates multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-backports main restricted universe multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-security main restricted
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-security universe
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-security multiverse
然而,由于工具链文件出了点问题,需要进行手动修复。
修正细节请查看此处:diff –git a/platforms/linux/riscv-gnu.toolchain.cmake b/platforms/linux/riscv-gnu.toolchain.cmake
index 1657bd1681..6b61251762 100644
— a/platforms/linux/riscv-gnu.toolchain.cmake
+++ b/platforms/linux/riscv-gnu.toolchain.cmake
@@ -17,18 +17,18 @@ 如果(不是“x${GCC_COMPILER_VERSION}”等于“x”)
结束如果
如果(没有定义GNU_MACHINE)
– set(GNU_MACHINE riscv64-unknown-linux-gnu CACHE STRING “GNU compiler triple”)
+ set(GNU_MACHINE riscv64-linux-gnu CACHE STRING “GNU compiler triple”)
结束如果
如果(没有定义TOOLCHAIN_COMPILER_LOCATION_HINT)
set(TOOLCHAIN_COMPILER_LOCATION_HINT PATHS /opt/riscv/bin ENV PATH)
结束如果
-如果(没有定义CMAKE_C_COMPILER)
– find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}-gcc${__GCC_VER_SUFFIX} PATHS ${TOOLCHAIN_COMPILER_LOCATION_HINT})
-否则()
– #message(WARNING “CMAKE_C_COMPILER=${CMAKE_C_COMPILER}已定义”)
-否则结束
+如(没有定义CMAKE_C_COMPILER)
+ find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}-gcc${__GCC_VER_SUFFIX} PATHS ${TOOLCHAIN_COMPILER_LOCATION_HINT})
+否则()
+ #message(WARNING “CMAKE_C_COMPILER=${CMAKE_C_COMPILER}已定义”)
+如何结束
如果(没有定义CMAKE_CXX_COMPILER)
find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}-g++${__GCC_VER_SUFFIX} PATHS ${TOOLCHAIN_COMPILER_LOCATION_HINT})
否则()
@@ -45,11 +45,11 @@ 否则()
#message(WARNING “CMAKE_AR=${CMAKE_AR}已定义”)
否则结束
-如果(没有定义RISCV_SYSROOT)
– get_filename_component(_base_dir ${CMAKE_C_COMPILER} DIRECTORY)
– get_filename_component(_base_dir ${_base_dir} DIRECTORY)
– set(RISCV_SYSROOT ${_base_dir}/sysroot CACHE PATH “RISC-V sysroot”)
-否则结束
+如(没有定义RISCV_SYSROOT)
+ get_filename_component(_base_dir ${CMAKE_C_COMPILER} DIRECTORY)
+ get_filename_component(_base_dir ${_base_dir} DIRECTORY)
+ set(RISCV_SYSROOT ${_base_dir}/sysroot CACHE PATH “RISC-V sysroot”)
+如何结束
set(CMAKE_SYSROOT “${RISCV_SYSROOT}”)
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${RISCV_SYSROOT})
那么就依次进行建造吧。
sudo apt install libfreetype-dev:riscv64 libharfbuzz-dev:riscv64
PKG_CONFIG_PATH=/usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/riscv64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config freetype2 harfbuzz --cflags --libs
(output) -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/riscv64-linux-gnu/glib-2.0/include -L/usr/lib/riscv64-linux-gnu -lfreetype -lharfbuzz
PKG_CONFIG_PATH=/usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/riscv64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_riscv64 \
-DCMAKE_C_COMPILER=/usr/bin/riscv64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/riscv64-linux-gnu-g++ \
-DRISCV_SYSROOT=/ \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/riscv64-gcc.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
cmake --build build4-full_riscv64
sudo cmake --install build4-full_riscv64
■ 总结: 利用Multiarch轻松进行交叉编译!
有了一个x86-64的主机,就可以制作适用于ARMv7/ARMv8/RISCV的OpenCV了!
-
Ubuntuには、Multiarchという仕組みがあり、異アーキテクチャを混在できる。
OpenCVのクロスビルドに使うと、他Archのバイナリが簡単に作れる。
以上就是了。非常感谢。
なお、これをやるとHostのLinux環境が汚れるので、VMやコンテナ(Docker)を使う事をお勧めします
◯ディレクトリ構成のイメージ今回は以下のような構成を想定して進めていきます。
另外,基本上,我們希望在/home/<使用者名稱>/work的目錄下進行工作。
/home
+ kmtr - please replace your account name.
+ work
+ opencv - source, cloned from github
+ opencv_contrib - source, cloned from github
+ build4-main - artifact(for Host), created by cmake
+ build4-full - artifact(for Host), created by cmake
+ build4-full_arm64 - artifact(for aarch64 target), created by cmake
+ build4-full_armhf - artifact(for armhf target), created by cmake
+ build4-full_riscv64 - artifact(for riscv64 target), created by cmake
cd
mkdir work
cd wotk
◯必要なライブラリのインストールそれでは、OpenCVの開発に必要なライブラリをインストールしていく。
crossbuild-essential-armhfとcrossbuild-essential-arm64 をインストールすると、クロス開発に必要なアレやコレやソレが全部入る。素敵ですね!!
sudo apt install -y \
git \
cmake \
cmake-curses-gui \
ccache \
ninja-build \
libfreetype-dev \
libharfbuzz-dev \
build-essential \
crossbuild-essential-armhf \
crossbuild-essential-arm64
◯ OpenCVのソースコードをcloneここらへんはいつもの手順ですね。
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
sudo apt install -y \
git \
cmake \
cmake-curses-gui \
ccache \
ninja-build \
libfreetype-dev \
libharfbuzz-dev \
build-essential \
crossbuild-essential-armhf \
crossbuild-essential-arm64
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
なお、特定バージョンをbuildしたい場合は、git switchを使います。
cd opencv
git switch 4.8.0
git reset --hard
cd ..
cd opencv_contrib
git switch 4.8.0
git reset --hard
cd ..
■ Host版OpenCVビルド
Host版OpenCVビルドなので興味があったら開いてください◯contrib抜き
cmakeを使って、build用の環境を整備する。必要に応じて、ccmakeコマンドなどで微調整しても良い。
cmake -S opencv \
-B build4-main \
-GNinja
— General configuration for OpenCV 4.8.0-dev =====================================
— Version control: 4.8.0-XXX-XXXXXXXX
—
— Platform:
— Timestamp: 2023-09-17T00:01:52Z
— Host: Linux 6.2.0-32-generic x86_64
— CMake: 3.25.1
— CMake generator: Ninja
— CMake build tool: /usr/bin/ninja
— Configuration: Release
特に問題が無ければ、サクッとbuildもinstallもできるはず。
cmake –build build4-main
sudo cmake –install build4-main
sudo ldconfig
◯contrib入り
contrib入りでbuildをするべく、OPENCV_EXTRA_MODULES_PATHを指定する。
cmake -S opencv \
-B build4-full \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
cmakeの結果にもExtra modulesが追加される。
— General configuration for OpenCV 4.8.0-dev =====================================
— Version control: 4.8.0-237-XXXXXXXX
—
— Extra modules:
— Location (extra): /home/kmtr/work/opencv_contrib/modules
— Version control (extra): 4.8.0-17-XXXXXXXX
—
— Platform:
— Timestamp: 2023-09-17T00:35:16Z
— Host: Linux 6.2.0-32-generic x86_64
— CMake: 3.25.1
— CMake generator: Ninja
— CMake build tool: /usr/bin/ninja
— Configuration: Release
あとは普通にまたbuild/install.
cmake –build build4-full
sudo cmake –install build4-full
sudo ldconfig
■ 目标版OpenCV建立(arm64)接下来才是正式比赛。
◯/etc/apt/sources.listの修正
sudo apt edit-sources を使い、インストールするarchを追加していく。なお、私はvi大好きなので、2を選んでいるけど、なんでしたら/bin/edを選んでいただいてもよいのですよ(?)。
sudo apt edit-sources
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]: 2
cmakeを使って、build用の環境を整備する。必要に応じて、ccmakeコマンドなどで微調整しても良い。
cmake -S opencv \
-B build4-main \
-GNinja
— General configuration for OpenCV 4.8.0-dev =====================================
— Version control: 4.8.0-XXX-XXXXXXXX
—
— Platform:
— Timestamp: 2023-09-17T00:01:52Z
— Host: Linux 6.2.0-32-generic x86_64
— CMake: 3.25.1
— CMake generator: Ninja
— CMake build tool: /usr/bin/ninja
— Configuration: Release
特に問題が無ければ、サクッとbuildもinstallもできるはず。
cmake –build build4-main
sudo cmake –install build4-main
sudo ldconfig
◯contrib入り
contrib入りでbuildをするべく、OPENCV_EXTRA_MODULES_PATHを指定する。
cmake -S opencv \
-B build4-full \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
cmakeの結果にもExtra modulesが追加される。
— General configuration for OpenCV 4.8.0-dev =====================================
— Version control: 4.8.0-237-XXXXXXXX
—
— Extra modules:
— Location (extra): /home/kmtr/work/opencv_contrib/modules
— Version control (extra): 4.8.0-17-XXXXXXXX
—
— Platform:
— Timestamp: 2023-09-17T00:35:16Z
— Host: Linux 6.2.0-32-generic x86_64
— CMake: 3.25.1
— CMake generator: Ninja
— CMake build tool: /usr/bin/ninja
— Configuration: Release
あとは普通にまたbuild/install.
cmake –build build4-full
sudo cmake –install build4-full
sudo ldconfig
◯/etc/apt/sources.listの修正
sudo apt edit-sources を使い、インストールするarchを追加していく。なお、私はvi大好きなので、2を選んでいるけど、なんでしたら/bin/edを選んでいただいてもよいのですよ(?)。
sudo apt edit-sources
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]: 2
sudo apt edit-sources
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]: 2
例えば、ubuntu23.04の場合は以下の行を追加する。これによって、x86-64のhost環境でも、arm64とarmhfのtarget環境のパッケージを入れられる。
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-updates main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-updates universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-updates multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-backports main restricted universe multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-security main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-security universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports lunar-security multiverse
例えば、ubuntu23.10の場合は以下の行を追加する。
なお、risc64にも対応させたいならば、,riscv64も追加する。
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-updates main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-updates universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-updates multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-backports main restricted universe multiverse
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-security main restricted
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-security universe
deb [arch=arm64,armhf] http://ports.ubuntu.com/ubuntu-ports mantic-security multiverse
最後に、データベースを更新する。
sudo apt update
◯dpkg側の設定更新aptの内側にいるdpkgにも、アーキ追加のお知らせをする。そうしないとapt installできない。
sudo dpkg --add-architecture arm64
sudo dpkg --add-architecture armhf
sudo dpkg --add-architecture riscv64 %riscv64
sudo dpkg --add-architecture arm64
sudo dpkg --add-architecture armhf
sudo dpkg --add-architecture riscv64 %riscv64
以下コマンドで現状のarchを確認できる。
$ sudo dpkg --print-architecture
amd64
$ sudo dpkg --print-foreign-architectures
arm64
armhf
◯pkg-configの動作確認Host向け、Target向けのライブラリに対して、pkg-configが正常動作できることを確認する。
ディレクトリ構成はこんな感じになっている。
/usr
+ lib
+ aarch64-linux-gnu - shared libraries for arm64
+ pkgconfig - pkg-config files(for shared libraries)
+ arm-linux-gnueabihf - shared libraries for armhf
+ pkgconfig - pkg-config files(for shared libraries)
+ share
+ pkgconfig - pkg-config files(for header files)
Host向け
pkg-config --list-all
Target(armhf)向け
PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config --list-all
Target(arm64)向け
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config --list-all
◯针对arm64的构建版
freetype/harfbuzzのインストール
安装适用于ARM64的FreeType和HarfBuzz。重点是在”arm64″后面添加!
pkg-config --list-all
PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config --list-all
Target(arm64)向け
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config --list-all
◯针对arm64的构建版
freetype/harfbuzzのインストール
安装适用于ARM64的FreeType和HarfBuzz。重点是在”arm64″后面添加!
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config --list-all
freetype/harfbuzzのインストール
安装适用于ARM64的FreeType和HarfBuzz。重点是在”arm64″后面添加!
ちゃんとできていると、pkg-configで確認できる。
sudo apt install libfreetype-dev:arm64 libharfbuzz-dev:arm64
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config freetype2 harfbuzz --cflags --libs
-I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/aarch64-linux-gnu/glib-2.0/include -L/usr/lib/aarch64-linux-gnu -lfreetype -lharfbuzz
cmake 改写成中文的方式可以是:建造模型cmakeを実行していく。CMAKE_TOOLCHAIN_FILEは、相対パスではなく絶対パスで指定が必要。
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_arm64 \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/aarch64-gnu.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_arm64 \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/aarch64-gnu.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
当cmake成功时,主机编程环境将变为x86_64,目标编程环境将变为aarch64。
-- General configuration for OpenCV 4.8.0-dev =====================================
-- Version control: 4.8.0-237-XXXXXXXX
--
-- Extra modules:
-- Location (extra): /home/kmtr/work/opencv_contrib/modules
-- Version control (extra): 4.8.0-17-XXXXXXXX
--
-- Platform:
-- Timestamp: 2023-09-17T01:31:30Z
-- Host: Linux 6.2.0-32-generic x86_64
-- Target: Linux 1 aarch64
-- CMake: 3.25.1
-- CMake generator: Ninja
-- CMake build tool: /usr/bin/ninja
-- Configuration: Release
build & installあとは今まで通り、普通にbuildする。
cmake --build build4-full_arm64
sudo cmake --install build4-full_arm64
cmake --build build4-full_arm64
sudo cmake --install build4-full_arm64
build結果は、installパスに入っているので、適当な手段でtargetにコピーする。
targetでは、/usr/local/include/opencv4などに必要なファイルをコピーするなどすればよい。
targetでlibrariesのインストールさて、ここでtarget側での作業になる。これまでbuildしたopencvはhost側環境でインストールしたライブラリに依存している。ということは、targetにコピーしただけだと動かない。
ldd /usr/local/lib/libopencv_freetype.so
linux-vdso.so.1 (0xABCDEFG01234567)
libopencv_imgproc.so.408 => /usr/local/lib/libopencv_imgproc.so.408 (0xABCDEFG01234567)
libfreetype.so.6 => /lib/aarch64-linux-gnu/libfreetype.so.6 (0xABCDEFG01234567)
libharfbuzz.so.0 => not found
libopencv_core.so.408 => /usr/local/lib/libopencv_core.so.408 (0xABCDEFG01234567)
ldd /usr/local/lib/libopencv_freetype.so
linux-vdso.so.1 (0xABCDEFG01234567)
libopencv_imgproc.so.408 => /usr/local/lib/libopencv_imgproc.so.408 (0xABCDEFG01234567)
libfreetype.so.6 => /lib/aarch64-linux-gnu/libfreetype.so.6 (0xABCDEFG01234567)
libharfbuzz.so.0 => not found
libopencv_core.so.408 => /usr/local/lib/libopencv_core.so.408 (0xABCDEFG01234567)
因此,目标端也需要安装所需的库。
sudo apt install libfreetype-dev libharfbuzz-dev
sudo ldconfig
ldd /usr/local/lib/libopencv_freetype.so
linux-vdso.so.1 (0xABCDEFG01234567)
libopencv_imgproc.so.408 => /usr/local/lib/libopencv_imgproc.so.408 (0xABCDEFG01234567)
libfreetype.so.6 => /lib/aarch64-linux-gnu/libfreetype.so.6 (0xABCDEFG01234567)
libharfbuzz.so.0 => /lib/aarch64-linux-gnu/libharfbuzz.so.0 (0xABCDEFG01234567)
libopencv_core.so.408 => /usr/local/lib/libopencv_core.so.408 (0xABCDEFG01234567)
万事解决!拜拜!拜拜!
我想启用FFmpeg!
そんな時は、Hostにインストールするライブラリを足しましょう!!
sudo apt install -y \
+ libavcodec-dev:arm64 \
+ libavformat-dev:arm64 \
+ libavutil-dev:arm64 \
+ libswscale-dev:arm64 \
libfreetype-dev:arm64 \
libharfbuzz-dev:arm64
sudo apt install -y \
+ libavcodec-dev:arm64 \
+ libavformat-dev:arm64 \
+ libavutil-dev:arm64 \
+ libswscale-dev:arm64 \
libfreetype-dev:arm64 \
libharfbuzz-dev:arm64
そして、cmakeコマンドで、コンフィグレーション作り直せばオッケー!!
--
-- Video I/O:
-- DC1394: NO
-- FFMPEG: YES
-- avcodec: YES (60.3.100)
-- avformat: YES (60.3.100)
-- avutil: YES (58.2.100)
-- swscale: YES (7.1.100)
-- avresample: NO
-- GStreamer: NO
-- v4l/v4l2: YES (linux/videodev2.h)
◯ Python bindingも有効化したいよ!激活Python绑定时,需要稍加技巧。
お手持ちのPython Versionが、3.9なのか3.10なのか3.11なのか、という情報が必要。
ちょっとトリッキーだけど、こんな感じで、cmake実行時にオプションを追加してあげる。
PYTHON3_REALPATH=`realpath /usr/bin/python3`
PYTHON3_BASENAME=`basename ${PYTHON3_REALPATH}`
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_arm64 \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/aarch64-gnu.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-DPYTHON3_NUMPY_INCLUDE_DIRS="/usr/local/lib/${PYTHON3_BASENAME}/dist-packages/numpy/core/include/" \
-DPYTHON3_INCLUDE_PATH="/usr/include/${PYTHON3_BASENAME};/usr/include/" \
-DPYTHON3_LIBRARIES=`find /usr/lib/aarch64-linux-gnu/ -name libpython*.so` \
-DPYTHON3_EXECUTABLE="/usr/bin/${PYTHON3_BASENAME}" \
-DPYTHON3_CVPY_SUFFIX=".so" \
-GNinja
如果成功地完成,Python 环境变量将被识别为以下类似的方式(为了谨慎起见,可能需要删除文件夹一次)。
--
-- Python 3:
-- Interpreter: /usr/bin/python3.11 (ver 3.11.6)
-- Libraries: /usr/lib/aarch64-linux-gnu/libpython3.11.so
-- numpy: /usr/local/lib/python3.11/dist-packages/numpy/core/include/ (ver undefined - cannot be probed because of the cross-compilation)
-- install path: lib/python3.11/dist-packages/cv2/python-3.11
--
-- Python (for build): /usr/bin/python3.11
--
■ 目标版OpenCV构建(armhf)大致的步骤与arm64相似。
linux-libc-dev:armhf を手動インストールしないと、依存関係でエラーになる。
-DENABLE_NEON=ONを付けると、NEONを使った最適化が有効になる。
sudo apt install linux-libc-dev:armhf
sudo apt install libfreetype-dev:armhf libharfbuzz-dev:armhf
PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/arm-linux-gnueabihf/ \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config freetype2 harfbuzz --cflags --libs
(output) -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include -L/usr/lib/arm-linux-gnueabihf -lfreetype -lharfbuzz
PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_armhf \
-DENABLE_NEON=ON \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/arm-gnueabi.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
cmake --build build4-full_armhf
sudo cmake --install build4-full_armhf
■ 目标版本OpenCV构建(riscv64)
大致的步骤是遵循arm64的规范。
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic main restricted
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-updates main restricted
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic universe
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-updates universe
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-updates multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-backports main restricted universe multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-security main restricted
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-security universe
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-security multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic main restricted
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-updates main restricted
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic universe
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-updates universe
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-updates multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-backports main restricted universe multiverse
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-security main restricted
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-security universe
deb [arch=arm64,armhf,riscv64] http://ports.ubuntu.com/ubuntu-ports mantic-security multiverse
然而,由于工具链文件出了点问题,需要进行手动修复。
index 1657bd1681..6b61251762 100644
— a/platforms/linux/riscv-gnu.toolchain.cmake
+++ b/platforms/linux/riscv-gnu.toolchain.cmake
@@ -17,18 +17,18 @@ 如果(不是“x${GCC_COMPILER_VERSION}”等于“x”)
结束如果
如果(没有定义GNU_MACHINE)
– set(GNU_MACHINE riscv64-unknown-linux-gnu CACHE STRING “GNU compiler triple”)
+ set(GNU_MACHINE riscv64-linux-gnu CACHE STRING “GNU compiler triple”)
结束如果
如果(没有定义TOOLCHAIN_COMPILER_LOCATION_HINT)
set(TOOLCHAIN_COMPILER_LOCATION_HINT PATHS /opt/riscv/bin ENV PATH)
结束如果
-如果(没有定义CMAKE_C_COMPILER)
– find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}-gcc${__GCC_VER_SUFFIX} PATHS ${TOOLCHAIN_COMPILER_LOCATION_HINT})
-否则()
– #message(WARNING “CMAKE_C_COMPILER=${CMAKE_C_COMPILER}已定义”)
-否则结束
+如(没有定义CMAKE_C_COMPILER)
+ find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}-gcc${__GCC_VER_SUFFIX} PATHS ${TOOLCHAIN_COMPILER_LOCATION_HINT})
+否则()
+ #message(WARNING “CMAKE_C_COMPILER=${CMAKE_C_COMPILER}已定义”)
+如何结束
如果(没有定义CMAKE_CXX_COMPILER)
find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}-g++${__GCC_VER_SUFFIX} PATHS ${TOOLCHAIN_COMPILER_LOCATION_HINT})
否则()
@@ -45,11 +45,11 @@ 否则()
#message(WARNING “CMAKE_AR=${CMAKE_AR}已定义”)
否则结束
-如果(没有定义RISCV_SYSROOT)
– get_filename_component(_base_dir ${CMAKE_C_COMPILER} DIRECTORY)
– get_filename_component(_base_dir ${_base_dir} DIRECTORY)
– set(RISCV_SYSROOT ${_base_dir}/sysroot CACHE PATH “RISC-V sysroot”)
-否则结束
+如(没有定义RISCV_SYSROOT)
+ get_filename_component(_base_dir ${CMAKE_C_COMPILER} DIRECTORY)
+ get_filename_component(_base_dir ${_base_dir} DIRECTORY)
+ set(RISCV_SYSROOT ${_base_dir}/sysroot CACHE PATH “RISC-V sysroot”)
+如何结束
set(CMAKE_SYSROOT “${RISCV_SYSROOT}”)
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${RISCV_SYSROOT})
那么就依次进行建造吧。
sudo apt install libfreetype-dev:riscv64 libharfbuzz-dev:riscv64
PKG_CONFIG_PATH=/usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/riscv64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
pkg-config freetype2 harfbuzz --cflags --libs
(output) -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/riscv64-linux-gnu/glib-2.0/include -L/usr/lib/riscv64-linux-gnu -lfreetype -lharfbuzz
PKG_CONFIG_PATH=/usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
PKG_CONFIG_LIBDIR=/usr/lib/riscv64-linux-gnu \
PKG_CONFIG_SYSROOT_DIR=/ \
cmake -S opencv \
-B build4-full_riscv64 \
-DCMAKE_C_COMPILER=/usr/bin/riscv64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/riscv64-linux-gnu-g++ \
-DRISCV_SYSROOT=/ \
-DCMAKE_TOOLCHAIN_FILE=/home/kmtr/work/opencv/platforms/linux/riscv64-gcc.toolchain.cmake \
-DOPENCV_EXTRA_MODULES_PATH=opencv_contrib/modules \
-GNinja
cmake --build build4-full_riscv64
sudo cmake --install build4-full_riscv64
■ 总结: 利用Multiarch轻松进行交叉编译!
有了一个x86-64的主机,就可以制作适用于ARMv7/ARMv8/RISCV的OpenCV了!
-
Ubuntuには、Multiarchという仕組みがあり、異アーキテクチャを混在できる。
- Ubuntuには、Multiarchという仕組みがあり、異アーキテクチャを混在できる。
- OpenCVのクロスビルドに使うと、他Archのバイナリが簡単に作れる。
以上就是了。非常感谢。