RasberrypiクロスコンパイルセットアップでConfig.cmakeにエラーがありません
コンパイル時間を短縮するために、ubuntu16.04でクロスコンパイルシステムを構築しようとしています。
ツールをインストールし、ラズベリーパイからライブラリをコピーしましたが、単純な「Helloworld」の例が非常にうまく機能します。
この問題は、cmakeとopencvを使用してプログラムをビルドしようとしたときに発生しました。明らかに、OpenCVConfig.cmakeは次のフォルダーのrpiにのみ存在するため、ホストシステムでは見つかりません。
/ usr / local / lib / cmake / opencv4 $
/ usr / local / lib / cmakeフォルダーをホストコンピューターにコピーして、ライブラリのインストールパスを手動で変更することはできますか、それともどのようにすればよいですか?
エラーメッセージ:
次のいずれかの名前の「OpenCV」によって提供されたパッケージ構成ファイルが見つかりませんでした。
OpenCVConfig.cmake
opencv-config.cmake
「OpenCV」のインストールプレフィックスをCMAKE_PREFIX_PATHに追加するか、「OpenCV_DIR」を上記のファイルのいずれかを含むディレクトリに設定します。「OpenCV」が別の開発パッケージまたはSDKを提供している場合は、それがインストールされていることを確認してください。
私のCMakeLists.txt:
set(CMAKE_BUILD_TYPE Release)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER $ENV{HOME}/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER $ENV{HOME}/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-g++) # Where is the target environment SET(CMAKE_FIND_ROOT_PATH $ENV{HOME}/raspi/sysroot)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${CMAKE_FIND_ROOT_PATH}")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${CMAKE_FIND_ROOT_PATH}")
SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --sysroot=${CMAKE_FIND_ROOT_PATH}")
# Search for programs only in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# Search for libraries and headers only in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -fopenmp")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp") find_package( OpenCV REQUIRED ) find_library(LIB_RT rt) list(APPEND LINK_LIBS ${OpenCV_LIBS}
)
include_directories(
${OpenCV_INCLUDE_DIRS} ) set(SOURCE opencvdemo.cpp) add_executable(vc_opencv_demo ${SOURCE})
target_link_libraries(vc_opencv_demo ${LIB_RT} ${LINK_LIBS})
回答
Linuxクロスコンパイルには一般的にいくつかのcmakeオプションを使用することをお勧めします。
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_SYSROOT /home/devel/rasp-pi-rootfs)
set(CMAKE_STAGING_PREFIX /home/devel/stage)
set(tools /home/devel/gcc-4.7-linaro-rpi-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc) set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
オプションが説明されているリンクを参照してください
私にとっての簡単な解決策は、次のファイルを追加する(または独自のファイルを作成する)ことでした。https://github.com/opencv/opencv/blob/2f4e38c8313ff313de7c41141d56d945d91f47cf/cmake/OpenCVConfig.cmake
CmakeLists.txtが配置されているフォルダ「cmake-modules」に移動します。例:
cmake-modules/FindOpenCV.cmake
次に追加してください
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules)
find_package(OpenCV)を呼び出す前
クイックフィックスのもう1つのアイデアは、システム変数を使用して表現することです。cmakeを呼び出す前に、commadlineから次のコマンドを呼び出してさまざまなcmakeターゲットのopencvlibを見つけます。
export CMAKE_PREFIX_PATH=opencv_installation_folder/build
または
export OpenCV_DIR=opencv_installation_folder/build
またはcmakeファイル内に書き込む
set (OpenCV_DIR /home/cmake/opencv/compiled) #change the path to match your complied directory of opencv
シナリオでは、パッケージがカスタムの場所にインストールされています。
次のことを試すことができます(cmakeのマニュアルから):
デフォルトの検索順序は、一般的なユースケースで最も具体的から最も具体的でないように設計されています。プロジェクトは、コマンドを複数回呼び出し、NO_ *オプションを使用するだけで、順序を上書きできます。
find_package (<package> PATHS paths... NO_DEFAULT_PATH)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
クロスコンパイル構成にが欠けていると思います。
すべてのクロスコンパイルオプションをいわゆるツールチェーンファイルに入れてから使用することもお勧めします cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchainfile/raspberrypi.cmake ..
もう1つのオプションは、ソースからOpenCVをビルドすることです。そのため、ツールチェーンに既にパッケージ化されているかどうかを心配する必要はありません。置換find_package
:
include(FetchContent)
FetchContent_Declare(
opencv
GIT_REPOSITORY https://github.com/opencv/opencv.git
GIT_TAG 4.4.0)
FetchContent_GetProperties(opencv)
if(NOT opencv_POPULATED)
FetchContent_Populate(opencv)
add_subdirectory(${opencv_SOURCE_DIR} ${opencv_BINARY_DIR})
endif()