Config.cmake Rasberry pi çapraz derleme kurulumunda eksik hata oluştu

Aug 19 2020

Derleme süresini kısaltmak için ubuntu 16.04 üzerinde çapraz derleme sistemi kurmaya çalışıyorum.

Ahududu pi'den araçları yükledim ve kitaplıkları kopyaladım ve kesinlikle basit bir "Merhaba dünya" örneği çok iyi çalışıyor.

Sorun cmake ve opencv ile bir program oluşturmaya çalıştığımda ortaya çıktı. Açıkçası, ana sistemde OpenCVConfig.cmake'yi bulamaz çünkü yalnızca aşağıdaki klasördeki rpi'de bulunur:

/ usr / local / lib / cmake / opencv4 $

/ Usr / local / lib / cmake klasörünü ana bilgisayara kopyalayıp kitaplık kurulum yolunu manuel olarak değiştirebilir miyim veya bunu nasıl yapmalıyım?

Hata mesajı:

Aşağıdaki adlardan herhangi biriyle "OpenCV" tarafından sağlanan bir paket yapılandırma dosyası bulunamadı:

OpenCVConfig.cmake
opencv-config.cmake

"OpenCV" kurulum önekini CMAKE_PREFIX_PATH'a ekleyin veya "OpenCV_DIR" öğesini yukarıdaki dosyalardan birini içeren bir dizine ayarlayın. "OpenCV" ayrı bir geliştirme paketi veya SDK sağlıyorsa, kurulu olduğundan emin olun.

CMakeLists.txt dosyam:

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

Yanıtlar

1 t2solve Aug 27 2020 at 19:05

Linux çapraz derleme için genel olarak bazı cmake seçeneklerini kullanmanızı öneririm:

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)

seçeneklerin açıklandığı bağlantıya bakın

Benim için basit bir çözüm , aşağıdaki dosyayı eklemek (veya kendi dosyanızı yazmak):https://github.com/opencv/opencv/blob/2f4e38c8313ff313de7c41141d56d945d91f47cf/cmake/OpenCVConfig.cmake

CmakeLists.txt dosyanızın bulunduğu "cmake-module" klasörüne, örn:

cmake-modules/FindOpenCV.cmake

O zaman lütfen ekleyin

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

find_package (OpenCV) çağrılmadan önce

Hızlı bir düzeltme için başka bir fikir , ifade etmek için sistem değişkenini kullanmaktır, cmake'yi çağırmadan önce commadline'dan follwing komutunu çağıran farklı cmake hedefleri için opencv lib'yi nerede bulabilirsiniz:

export CMAKE_PREFIX_PATH=opencv_installation_folder/build

veya

export OpenCV_DIR=opencv_installation_folder/build

veya cmake dosyanızın içine yazın

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

Senaryonuzda, paketi özel bir konuma yüklediniz.

Aşağıdakileri deneyebilirsiniz ( cmake kılavuzundan ):

Varsayılan arama sırası, yaygın kullanım durumları için en özelden en az özele doğru tasarlanmıştır. Projeler, komutu birden çok kez çağırarak ve NO_ * seçeneklerini kullanarak sıralamayı geçersiz kılabilir:

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

1 divhart Aug 27 2020 at 19:43

set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)Çapraz derleme yapılandırmanızda bir eksik olduğunuzu düşünüyorum .

Tüm çapraz derleme seçeneklerinizi sözde bir araç zinciri dosyasına koymak ve ardından kullanmak da iyi bir uygulamadır. cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchainfile/raspberrypi.cmake ..

Başka bir seçenek de OpenCV'yi kaynaktan derlemek olabilir, bu yüzden zaten araç zincirinizde paketlenmişse endişelenmenize gerek kalmaz. Şununla değiştir 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()