目的
M5Stack UnitV2のGithubで公開されている、UnitV2に元々組み込まれているサンプルプログラム集「UnitV2 Framework」をクロスコンパイルして動かす手順です。
PC環境
UnitV2 Frameworkをコンパイル手順に入る前に、Ubuntuをインストールした環境で、クロスコンパイル環境を構築しておきます。
はじめに
この記事を作成するにあたり、以下のmeganetaaan氏のUnitV2Frameworkを参考にさせて頂きました。
https://github.com/meganetaaan/UnitV2Framework
UnitV2Frameworkのダウンロード
Githubから、UnitV2Frameworkをダウンロードします。
$ git clone https://github.com/m5stack/UnitV2Framework.git
ncnnのヘッダファイル更新
m5stackのUnitV2Frameworkには、古いバージョンのncnnのヘッダファイルが入っているため、ncnnのヘッダファイルをクロスコンパイル環境の構築でインストールしたバージョンのもので上書きをします。
$ cd UnitV2Framework
$ cp -r ~/external/ncnn/install/x64/include/ncnn/include/
CMakeLists.txt の編集
cmakeの設定ファイルを、クロスコンパイル環境の構築にあわせて編集します。
meganetaaan氏のgithubを参考に、
cmakeに、TARGET_COMPILERのオプションを設けて、
UnitV2(arm環境)のビルドとPC環境(x64環境)のビルドを両立するようにしています。
$ gedit CMakeLists.txt
if(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE Release)
message(STATUS "CMAKE_BUILD_TYPE Release")
else()
SET(CMAKE_BUILD_TYPE DEBUG)
message(STATUS "CMAKE_BUILD_TYPE DEBUG")
endif()
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
if(TARGET_COMPILER STREQUAL "arm")
message(STATUS "TARGET_COMPILE STREQUAL arm")
SET(CMAKE_CXX_COMPILER arm-none-linux-gnueabihf-g++)
SET(CMAKE_C_COMPILER arm-none-linux-gnueabihf-gcc)
SET(NCNN_INSTALL_DIR /opt/external/ncnn/install/arm/)
SET(ZBAR_INSTALL_DIR /opt/external/zbar-0.10/build/arm)
SET(OpenCV_DIR /opt/external/opencv/build/arm)
else()
message(STATUS "TARGET_COMPILE STREQUAL X64")
SET(NCNN_INSTALL_DIR /opt/external/ncnn/install/x64/)
SET(ZBAR_INSTALL_DIR /opt/external/zbar-0.10/build/x64/)
SET(OpenCV_DIR /opt/external/opencv/build/x64)
endif()
# project name
PROJECT(camera_capture)
# requirement of cmake version
cmake_minimum_required(VERSION 3.5)
# Enable C++11
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED TRUE)
# set the directory of executable files
if(TARGET_COMPILER STREQUAL "x64")
message(STATUS "CMAKE_RUNTIME_OUTPUT_DIRECTORY X64")
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin/x64)
else()
message(STATUS "CMAKE_RUNTIME_OUTPUT_DIRECTORY arm")
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin/arm)
endif()
SET(Target ${TARGET})
# find required opencv
find_package(OpenCV REQUIRED)
find_package(Threads REQUIRED)
# directory of opencv headers
include_directories(${OpenCV_INCLUDE_DIRS})
# name of executable file and path of source file
add_executable(${Target} main/${Target}.cpp)
# directory of opencv library
link_directories(${OpenCV_LIBRARY_DIRS})
# includes
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/include/ncnn)
# opencv libraries
target_link_libraries(${Target} ${OpenCV_LIBRARIES})
target_link_libraries(${Target} ${NCNN_INSTALL_DIR}/libncnn.a -fopenmp)
# .so link
target_link_libraries(${Target} ${ZBAR_INSTALL_DIR}/lib/libzbar.so)
FILE(GLOB_RECURSE PRJ_SRC
"${PROJECT_SOURCE_DIR}/src/*.c"
"${PROJECT_SOURCE_DIR}/src/*.cpp"
)
add_library(mainlib ${PRJ_SRC})
target_link_libraries(mainlib ${OpenCV_LIBRARIES})
target_link_libraries(mainlib ${NCNN_INSTALL_DIR}/libncnn.a -fopenmp)
target_link_libraries(${Target} mainlib)
UnitV2Frameworkをコンパイルする
UnitV2(arm環境)で動く「camera_capture」のサンプルをビルドする場合は以下のコマンドで実施します。
$ cmake -B build/arm -DTARGET_COMPILE=arm -DTARGET=camera_capture .
$ cmake --build build/arm
PC環境(x64環境)で動く「camera_capture」のサンプルをビルドする場合は以下のコマンドで実施します。
$ cmake -B build/x64 -DTARGET_COMPILE=x64 -DTARGET=camera_capture .
$ cmake --build build/x64