Config.cmake kesalahan yang hilang dalam pengaturan kompilasi lintas Rasberry pi
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
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
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)
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_package
dengan:
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()