Erro ausente no config.cmake na configuração de compilação cruzada do Rasberry pi
Estou tentando construir um sistema de compilação cruzada no Ubuntu 16.04 para diminuir o tempo de compilação.
Eu instalei as ferramentas e copiei as bibliotecas do raspberry pi e definitivamente um exemplo simples de "Olá, mundo" funciona muito bem.
O problema ocorreu quando tentei construir um programa com cmake e opencv. Obviamente, ele não encontra OpenCVConfig.cmake no sistema host, pois ele só existe em rpi na seguinte pasta:
/ usr / local / lib / cmake / opencv4 $
Posso apenas copiar a pasta / usr / local / lib / cmake para o computador host e modificar manualmente o caminho de instalação da biblioteca ou como devo fazer isso?
Mensagem de erro:
Não foi possível encontrar um arquivo de configuração de pacote fornecido por "OpenCV" com qualquer um dos seguintes nomes:
OpenCVConfig.cmake
opencv-config.cmake
Adicione o prefixo de instalação de "OpenCV" a CMAKE_PREFIX_PATH ou defina "OpenCV_DIR" para um diretório contendo um dos arquivos acima. Se "OpenCV" fornecer um pacote de desenvolvimento ou SDK separado, certifique-se de que ele foi instalado.
My 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})
Respostas
Eu sugiro que você use em geral alguma opção cmake para compilação cruzada do 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)
veja o link onde as opções são explicadas
Uma solução simples para mim foi adicionar o seguinte arquivo (ou escrever o seu próprio):https://github.com/opencv/opencv/blob/2f4e38c8313ff313de7c41141d56d945d91f47cf/cmake/OpenCVConfig.cmake
para uma pasta "cmake-modules" onde seu CmakeLists.txt está localizado, por exemplo:
cmake-modules/FindOpenCV.cmake
Então por favor adicione
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules)
antes de chamar find_package (OpenCV)
Outra ideia para uma solução rápida é usar a variável de sistema para expressar, onde encontrar a lib opencv para diferentes alvos cmake chamando o comando seguinte do commadline antes de chamar cmake:
export CMAKE_PREFIX_PATH=opencv_installation_folder/build
ou
export OpenCV_DIR=opencv_installation_folder/build
ou escreva dentro do seu arquivo cmake
set (OpenCV_DIR /home/cmake/opencv/compiled) #change the path to match your complied directory of opencv
Em seu cenário, você tem o pacote instalado em um local personalizado.
Você pode tentar o seguinte (do manual do cmake ):
A ordem de pesquisa padrão é projetada para ser do mais específico ao menos específico para casos de uso comuns. Os projetos podem substituir o pedido simplesmente chamando o comando várias vezes e usando as opções NO_ *:
find_package (<package> PATHS paths... NO_DEFAULT_PATH)
Acho que está faltando um set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
em sua configuração de compilação cruzada.
Também é uma boa prática colocar todas as suas opções de compilação cruzada em um arquivo de conjunto de ferramentas e, em seguida, usar cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchainfile/raspberrypi.cmake ..
Outra opção poderia ser construir o OpenCV a partir do código-fonte, então você não precisa se preocupar se ele já estiver empacotado em seu conjunto de ferramentas. Substitua find_package
por:
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()