简体   繁体   English

如何使用附加模块为 Raspberry Pi 交叉编译 OpenCV(highgui ...)

[英]How do I cross compile OpenCV for the Raspberry Pi with additional modules (highgui…)

My goal is to cross-compile OpenCV for Raspberry Pi with CMake on an Ubuntu 16.04 Host.我的目标是在 Ubuntu 16.04 主机上使用 CMake 为 Raspberry Pi 交叉编译 OpenCV。 The Problem lies within the CMake toolchain file which is unable to handle the compilation process correctly.问题出在无法正确处理编译过程的 CMake 工具链文件中。 As soon as pkg-config comes into play, a lot of "fatal error: No such file or directory" errors arise (eg "fatal error: gtk/gtk.h: No such file or directory).一旦 pkg-config 开始发挥作用,就会出现很多“致命错误:没有这样的文件或目录”错误(例如“致命错误:gtk/gtk.h:没有这样的文件或目录)”。

I figured out that further "-isystem" flags with the directories containing the missing files seem to help in some way, but I doubt that this is the right way to address these errors.我发现包含丢失文件的目录的进一步“-isystem”标志似乎在某种程度上有所帮助,但我怀疑这是解决这些错误的正确方法。

The toolchain file works, as long as the "PKG_CONFIG"-stuff is commented out.只要“PKG_CONFIG”-stuff 被注释掉,工具链文件就可以工作。 This causes pkg-config not to find "libgtk2.0", which is needed for OpenCV's highgui module and builds without highgui-support.这会导致 pkg-config 找不到“libgtk2.0”,这是 OpenCV 的 highgui 模块所需要的,并且在没有 highgui-support 的情况下构建。

Some ideas for the toolchain are from here:工具链的一些想法来自这里:

build-toolchain.sh构建工具链.sh

#!/bin/bash

# apt -y install lib32z1 libstdc++6:i386 git qemu-user proot cmake pkg-config

MOUNT_DIR=/mnt/rasp-pi-rootfs
TEMP_DIR=/tmp/build
RASPBIAN_IMG_ZIP=raspbian-jessie.zip
TOOLCHAIN=gcc-linaro-arm-linux-gnueabihf-raspbian-x64
CMAKE_TOOLCHAIN_FILE=rpi-toolchain.cmake
############################################################################
RASPBIAN_IMG=${TEMP_DIR}/$(unzip -Z1 $RASPBIAN_IMG_ZIP)

rm -rf $TEMP_DIR
mkdir $TEMP_DIR
cd $TEMP_DIR

#unzip raspbian-img
unzip $RASPBIAN_IMG_ZIP

#resize raspbian-img
LOOP_DEVICE=$(losetup -f)
RASPBIAN_PARTITION_BOOT=${LOOP_DEVICE}p1
RASPBIAN_PARTITION_SYSTEM=${LOOP_DEVICE}p2
truncate -s +500M $RASPBIAN_IMG
losetup $LOOP_DEVICE $RASPBIAN_IMG
parted $LOOP_DEVICE resizepart 2 100%
#wait until auto-mounted
umount $RASPBIAN_PARTITION_BOOT
umount $RASPBIAN_PARTITION_SYSTEM
e2fsck -f $RASPBIAN_PARTITION_SYSTEM
resize2fs $RASPBIAN_PARTITION_SYSTEM

#mount raspbian-img
mkdir -p $MOUNT_DIR
mount $RASPBIAN_PARTITION_SYSTEM $MOUNT_DIR

#fix absolute links
proot -q qemu-arm -S $MOUNT_DIR<<EOF
apt update

apt -y install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
libxvidcore-dev libx264-dev \
libgtk2.0-dev libatlas-base-dev gfortran

apt -y install symlinks
symlinks -cr /usr/lib
EOF

wget -O opencv.zip https://codeload.github.com/Itseez/opencv/zip/2.4.13
unzip opencv.zip
cd opencv-*
mkdir build
cd build

cmake -D CMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE -D PIROOT=$MOUNT_DIR -D TOOLROOT=$TOOLCHAIN -D CMAKE_BUILD_TYPE=Release -D WITH_V4L=ON -D WITH_OPENGL=ON ..
make -j $(nproc)
make install

sync; umount $MOUNT_DIR
losetup -d $LOOP_DEVICE

rpi-toolchain.cmake rpi-toolchain.cmake

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER ${TOOLROOT}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${TOOLROOT}/bin/arm-linux-gnueabihf-g++)

set(CMAKE_SYSROOT ${PIROOT})
set(CMAKE_FIND_ROOT_PATH ${PIROOT})

unset(ENV{PKG_CONFIG_DIR})
set(ENV{PKG_CONFIG_LIBDIR} "$ENV{PKG_CONFIG_LIBDIR}:${PIROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig:${PIROOT}/usr/share/pkgconfig:${PIROOT}/usr/lib/pkgconfig")
set(ENV{PKG_CONFIG_SYSROOT_DIR} "${PIROOT}")

set(FLAGS "-isystem ${PIROOT}/usr/include/arm-linux-gnueabihf")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS}" CACHE STRING "" FORCE)

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)

set(CMAKE_INSTALL_PREFIX ${PIROOT}/usr/local)

Got it.明白了。 The Problem was the setting of PKG_CONFIG-vars within the rpi-toolchain.cmake file, this does not work .They have to be added to the environment with export:问题是在 rpi-toolchain.cmake 文件中设置了 PKG_CONFIG-vars,这不起作用。它们必须通过导出添加到环境中:

...
export PKG_CONFIG_SYSROOT_DIR=${MOUNT_DIR}
export PKG_CONFIG_LIBDIR=${MOUNT_DIR}/usr/lib/arm-linux-gnueabihf/pkgconfig:${MOUNT_DIR}/usr/share/pkgconfig:${MOUNT_DIR}/usr/lib/pkgconfig
export PKG_CONFIG_DIR=

cmake -D CMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE -D PIROOT=$MOUNT_DIR -D TOOLROOT=$TOOLCHAIN -D CMAKE_BUILD_TYPE=Release -D WITH_V4L=ON -D WITH_OPENGL=ON ..
make -j $(nproc)

edit: I don't remember what the actual problem was here, but setting pkg-config variables with ENV{} works and was not the culprit.编辑:我不记得这里的实际问题是什么,但是使用ENV{}设置 pkg-config 变量是有效的,并不是罪魁祸首。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM