Config.cmake ไม่มีข้อผิดพลาดในการตั้งค่าการคอมไพล์ข้าม Rasberry pi
ฉันกำลังพยายามสร้างระบบคอมไพล์ข้ามบน ubuntu 16.04 เพื่อย่นระยะเวลาการคอมไพล์
ฉันได้ติดตั้งเครื่องมือและคัดลอก libs จาก raspberry pi แล้วและแน่นอนว่าตัวอย่าง "Hello world" ที่เรียบง่ายใช้งานได้ดีมาก
ปัญหาเกิดขึ้นเมื่อฉันพยายามสร้างโปรแกรมด้วย 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})
คำตอบ
ฉันขอแนะนำให้คุณใช้ตัวเลือก cmake โดยทั่วไปสำหรับการรวบรวม linux cross:
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
ไปยังโฟลเดอร์ "cmake-modules" ซึ่ง CmakeLists.txt ของคุณอยู่เช่น:
cmake-modules/FindOpenCV.cmake
แล้วกรุณาเพิ่ม
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules)
ก่อนเรียก find_package (OpenCV)
อีกแนวคิดหนึ่งสำหรับการแก้ไขอย่างรวดเร็วคือการใช้ตัวแปรระบบเพื่อแสดงตำแหน่งที่จะค้นหา opencv lib สำหรับเป้าหมาย cmake ต่างๆที่เรียกคำสั่ง follwing จาก commadline ก่อนที่จะเรียก cmake:
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)
ในการกำหนดค่าการคอมไพล์ข้าม
นอกจากนี้ยังเป็นแนวทางปฏิบัติที่ดีในการใส่ตัวเลือกการคอมไพล์ข้ามทั้งหมดของคุณลงในไฟล์ toolchain ที่เรียกว่าแล้วใช้ cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchainfile/raspberrypi.cmake ..
อีกทางเลือกหนึ่งคือการสร้าง OpenCV จากซอร์สดังนั้นคุณไม่จำเป็นต้องกังวลว่ามันจะบรรจุอยู่ใน toolchain ของคุณแล้วหรือยัง แทนที่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()