C++ 使用Qt和opencv交叉编译到Raspberry Pi
有多种方法可以实现Raspberry Pi,也有针对交叉编译或编译的解决方案 然而,我找不到任何解决方案来交叉编译同样使用opencv的Qt程序 我在64位PC上使用debian尝试了以下方法: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
- 我编译并设置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