C++ 使用Qt和opencv交叉编译到Raspberry Pi

C++ 使用Qt和opencv交叉编译到Raspberry Pi,c++,qt,opencv,arm,cross-compiling,C++,Qt,Opencv,Arm,Cross Compiling,有多种方法可以实现Raspberry Pi,也有针对交叉编译或编译的解决方案 然而,我找不到任何解决方案来交叉编译同样使用opencv的Qt程序 我在64位PC上使用debian尝试了以下方法: 我编译并设置Qt作为ARM7的交叉编译器,使用。不过,它并不是没有问题就可以工作的,我发布了一个为我解决问题的帖子。我现在可以在Raspberry Pi上用图形GUI运行我的Qt程序(虽然只是全屏,但这是一个完全不同的问题) 我在opencv官方网站上创建了opencv。它失败,找不到CMAKE\U

有多种方法可以实现Raspberry Pi,也有针对交叉编译或编译的解决方案

然而,我找不到任何解决方案来交叉编译同样使用opencv的Qt程序

我在64位PC上使用debian尝试了以下方法:

  • 我编译并设置Qt作为ARM7的交叉编译器,使用。不过,它并不是没有问题就可以工作的,我发布了一个为我解决问题的帖子。我现在可以在Raspberry Pi上用图形GUI运行我的Qt程序(虽然只是全屏,但这是一个完全不同的问题)

  • 我在opencv官方网站上创建了opencv。它失败,找不到CMAKE\U CXX\U编译器。

  • 根据经验(我在Windows和Linux上使用Qt和opencv),我知道Qt和opencv只有在使用同一个编译器编译时才能一起工作,因此我尝试使用我成功编译Qt的同一个opencv交叉编译器:
    gcc-4.7-linaro-rpi-gnueabihf

  • 我将以前用于编译Qt的
    gnueabihf
    指定为编译器:

我创建了目录
~/opt/opencv\u build\u arm7/
,并在其中尝试:

sudo cmake -DCMAKE_CXX_COMPILER=/home/<user>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g++ -DCMAKE_C_COMPILER=/home/<user>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-gcc -DCMAKE_TOOLCHAIN_FILE=/usr/dev/opencv/platforms/linux/arm-gnueabi.toolchain.cmake /usr/dev/opencv/
如果我键入

arm-linux-gnueabihf-g++ -v
已成功找到它:

使用内置规格。COLLECT_GCC=。/arm-linux-gnueabihf-c++ COLLECT_LTO_WRAPPER=/home/vszabi/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/。/libexec/gcc/arm-linux-gnueabihf/4.7.2/LTO-WRAPPER 目标:arm linux gnueabihf配置有: /opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/.build/src/gcc-linaro-4.7-2012.07/configure --build=i686-build_pc-linux-gnu--host=i686-build_pc-linux-gnu--target=arm-linux-gnueabihf--prefix=/opt/dev/src/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/install --使用sysroot=/opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/install/arm-linux-gnueabihf/libc -启用语言= C、C++、FORTRAN——用ARC= ARMV6ZK——用FUP= VFP——用PogValp= =“CxgOLT-NG-LIAROR-1 1.131-2012.0720120720-LIANARO GCC 2012.07”,启用ARCH=ARMV6ZK。 --使用bugurl=--enable-uu cxa_atexit--enable libmudflap--enable libgomp--enable libssp--gmp=/opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --mpfr=/opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --使用mpc=/opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --使用ppl=/opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --使用cloog=/opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --使用libelf=/opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static --主机libstdcxx='-L/opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static/lib -lpwl'--enable threads=posix--disable libstdcxx pch--enable linker build id--enable gold--local prefix=/opt/dev/src/crosstool ng/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/install/arm-linux-gnueabihf/libc --enable-c99——启用长螺纹型号:posix gcc版本4.7.2 20120701(预发布)(crosstool NG linaro-1.13.1-2012.07-20120720- 利纳罗GCC(2012.07)

下一步我可以尝试什么?使用
opencv/platforms/linux/arm-gnueabi.toolchain.cmake
打开cmake的gui版本时显示的选项很少(只有ARM_LINUX_SYSROOT、CMAKE_BUILD_TYPE、CMAKE_CONFIGURATION_TYPE、CMAKE_INSTALL_PREFIX、GCC_COMPILER_VERSION和LIBRARY_OUTPUT_PATH_ROOT,但没有一个BUILD_opencv_xyz可以用来禁用单个软件包),比我为x86或x64平台构建opencv时少得多

我担心搜索不同的编译器可能会导致Qt出现问题,因为据我所知,为了让opencv在Qt中工作,它必须使用与构建Qt库和构建程序所用的编译器相同的编译器进行编译。过去每当我尝试使用它时,都会不小心地发现这三件事(Qt libs、opencv、我的程序)需要使用同一个编译器进行编译,我总是会遇到奇怪的崩溃,要么是在包含任何opencv头时,要么是在调用opencv中的任何函数时。

上的教程似乎要么错误,要么过时

下载opencv 3.0的源代码时,
opencv/platforms/linux/arm-gnueabi.toolchain.cmake
似乎没有为Raspberry Pi充分配置

配置 访问
arm linux gnueabihf
工具链的创建者,似乎要支持Raspberry Pi中的ARM7,必须将以下选项传递给编译器:
-mcpu=cortex-a7-mfloat abi=hard-mfpu=vfpv4

因此,我们必须编辑
opencv/platforms/linux/arm-gnueabi.toolchain.cmake
文件并进行更改

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")

再次运行cmake,配置已成功完成

制作 在构建过程中,如果出现以下错误

CMakeFiles/opencv_core.dir/src/rand.cpp.o:重新定位 在以下情况下,不能使用针对“本地符号”的R_ARM_THM_MOVW_ABS_NC 创建共享对象;使用-fPIC重新编译 CMakeFiles/opencv_core.dir/src/rand.cpp.o:无法读取符号:错误 价值观

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=vfpv4")
set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=vfpv4")
INCLUDEPATH += <your build dir>/install/include/opencv2/
INCLUDEPATH += <your build dir>/install/include/
LIBS += -L  "<your build dir>/install/lib/"
LIBS += -lopencv_calib3d
LIBS += -lopencv_core
#... and so on
$ LD_LIBRARY_PATH=. ./your_program