Config.cmake Rasberry pi çapraz derleme kurulumunda eksik hata oluştu
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
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
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)
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()