Config.cmake kesalahan yang hilang dalam pengaturan kompilasi lintas Rasberry pi

Aug 19 2020

Saya mencoba membangun sistem kompilasi silang di ubuntu 16.04 untuk mempersingkat waktu kompilasi.

Saya telah menginstal alat dan menyalin libs dari raspberry pi dan yang pasti contoh sederhana "Hello world" bekerja dengan sangat baik.

Masalahnya terjadi ketika saya mencoba membuat program dengan cmake dan opencv. Jelas tidak menemukan OpenCVConfig.cmake di sistem host karena hanya ada di rpi di folder berikut:

/ usr / local / lib / cmake / opencv4 $

Bisakah saya menyalin / usr / local / lib / cmake folder ke komputer host dan secara manual mengubah jalur instalasi perpustakaan atau bagaimana saya harus melakukannya?

Pesan eror:

Tidak dapat menemukan file konfigurasi paket yang disediakan oleh "OpenCV" dengan salah satu nama berikut:

OpenCVConfig.cmake
opencv-config.cmake

Tambahkan awalan penginstalan "OpenCV" ke CMAKE_PREFIX_PATH atau setel "OpenCV_DIR" ke direktori yang berisi salah satu file di atas. Jika "OpenCV" menyediakan paket pengembangan atau SDK terpisah, pastikan sudah diinstal.

CMakeLists.txt saya:

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})

Jawaban

1 t2solve Aug 27 2020 at 19:05

Saya menyarankan Anda untuk menggunakan secara umum beberapa opsi cmake untuk kompilasi silang linux:

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)

lihat tautan di mana opsi dijelaskan

Solusi sederhana bagi saya adalah menambahkan file berikut (atau tulis file Anda sendiri):https://github.com/opencv/opencv/blob/2f4e38c8313ff313de7c41141d56d945d91f47cf/cmake/OpenCVConfig.cmake

ke folder "cmake-modules" tempat CmakeLists.txt Anda berada, misalnya:

cmake-modules/FindOpenCV.cmake

Lalu tolong tambahkan

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules)

sebelum memanggil find_package (OpenCV)

Ide lain untuk perbaikan cepat adalah dengan menggunakan variabel sistem untuk mengekspresikan, di mana menemukan lib opencv untuk target cmake berbeda yang memanggil perintah follwing dari commadline sebelum memanggil cmake:

export CMAKE_PREFIX_PATH=opencv_installation_folder/build

atau

export OpenCV_DIR=opencv_installation_folder/build

atau tulis di dalam file cmake Anda

set (OpenCV_DIR /home/cmake/opencv/compiled) #change the path to match your complied directory of opencv

1 vvg Aug 26 2020 at 20:43

Dalam skenario Anda, Anda memiliki paket yang diinstal di lokasi kustom.

Anda dapat mencoba yang berikut (dari manual cmake ):

Urutan pencarian default dirancang untuk menjadi yang paling spesifik hingga yang paling tidak spesifik untuk kasus penggunaan umum. Proyek dapat menimpa pesanan hanya dengan memanggil perintah beberapa kali dan menggunakan opsi NO_ *:

find_package (<package> PATHS paths... NO_DEFAULT_PATH)

1 divhart Aug 27 2020 at 19:43

Saya pikir Anda kehilangan set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)dalam konfigurasi kompilasi silang Anda.

Ini juga merupakan praktik yang baik untuk meletakkan semua opsi kompilasi silang Anda ke dalam apa yang disebut file toolchain dan kemudian menggunakannya cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchainfile/raspberrypi.cmake ..

Pilihan lainnya adalah membangun OpenCV dari sumber, jadi Anda tidak perlu khawatir jika sudah dikemas dalam toolchain Anda. Ganti find_packagedengan:

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()