有多种方法可以交叉编译到树莓派,也有针对Qt或opencv的交叉编译解决方案。
然而,我找不到任何同时使用Qt和opencv进行交叉编译的解决方案。
我尝试了在64位PC上使用Debian进行以下操作:
我按照这个教程将Qt编译成ARM7的交叉编译器。尽管存在问题,但这里是我的解决方案。现在我可以在树莓派上运行带有图形GUI的Qt程序(虽然只能全屏,但那是一个完全不同的问题)。我按照官方opencv网站上的指南构建opencv。它失败了,出现错误:
No CMAKE_CXX_COMPILER could be found.
通过经验得知(我曾在Windows和Linux上同时使用Qt和opencv),只有当两者都使用相同的编译器进行编译时,Qt和opencv才能一起工作。因此,我尝试使用与我成功编译Qt所使用的相同的交叉编译器来编译opencv:gcc-4.7-linaro-rpi-gnueabihf
。我将先前用于编译Qt的
gnueabihf
指定为编译器:
我创建了目录~/opt/opencv_build_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/
在我最近使用的Qt安装程序自带的g++编译器成功地为x64平台编译opencv时,下载的opencv源代码位于/usr/dev/opencv/
。请注意,<user>
是当前会话的用户名,以防其他初学者在未来尝试这些方法。
以下错误导致操作失败(其中<user>
是我的用户名)
C++编译器"/home//opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g++"无法编译简单的测试程序。以下是其输出:
更改目录:/home//temp/CMakeFiles/CMakeTmp
运行构建命令:“/usr/bin/make”“cmTryCompileExec117178613 / fast”
/usr/bin/make -f CMakeFiles / cmTryCompileExec117178613.dir / build.make CMakeFiles / cmTryCompileExec117178613.dir / build
make1:进入目录'/home//temp/CMakeFiles/CMakeTmp'
/usr/bin/cmake -E cmake_progress_report/home//temp/CMakeFiles/CMakeTmp/CMakeFiles 1
构建CXX对象CMakeFiles/cmTryCompileExec117178613.dir/testCXXCompiler.cxx.o
/home//opt/gcc-4.7-linaro-rpi-gnueabihf/bin/arm-linux-gnueabihf-g++-mthumb-fdata-sections-Wa,--noexecstack-fsigned-char-Wno-psabi-mthumb fdata-sections-Wa,--noexecstack-fsigned-char-Wno-psabi-o CMakeFiles / cmTryCompileExec117178613.dir / testCXXCompiler.cxx.o-c / home //temp/CMakeFiles/CMakeTmp/testCXXCompiler.cxx
/home//temp/CMakeFiles/CMakeTmp/testCXXCompiler.cxx:在函数‘int main()’中:
/home//temp/CMakeFiles/CMakeTmp/testCXXCompiler.cxx:4:10:对不起,未实现:Thumb-1 hard-float VFP ABI
CMakeFiles/cmTryCompileExec117178613.dir/build.make:57:目标'CMakeFiles / cmTryCompileExec117178613.dir / testCXXCompiler.cxx.o'的配方失败
make1:*** [CMakeFiles/cmTryCompileExec117178613.dir/testCXXCompiler.cxx.o]错误1
make1:离开目录'/home//temp/CMakeFiles/CMakeTmp'
Makefile:118:目标'cmTryCompileExec117178613 / fast'的配方失败
make:***[cmTryCompileExec117178613/fast]错误2
我为编译器指定了绝对路径,但即使我不指定它,只是将其添加到我的$PATH中,它仍然存在相同的问题。
export PATH=$PATH:/home/<user>/opt/gcc-4.7-linaro-rpi-gnueabihf/bin/
sudo cmake -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/crosstool-ng-linaro-1.13.1-2012.07-20120720/builds/arm-linux-gnueabihf-linux/install --with-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 --enable-languages=c,c++,fortran --enable-multilib --with-arch=armv6zk --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=hard --with-pkgversion='crosstool-NG linaro-1.13.1-2012.07-20120720 - Linaro GCC 2012.07' --with-bugurl=https://bugs.launchpad.net/gcc-linaro --enable-__cxa_atexit --enable-libmudflap --enable-libgomp --enable-libssp --with-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 --with-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 --with-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 --with-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 --with-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 --with-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 --with-host-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 --with-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 --enable-long-long 线程模型:posix gcc版本4.7.2 20120701(预发布)(crosstool-NG linaro-1.13.1-2012.07-20120720 - Linaro GCC 2012.07)我该尝试什么? 使用 opencv/platforms/linux/arm-gnueabi.toolchain.cmake
打开cmake的图形用户界面会显示很少的选项(只有ARM_LINUX_SYSROOT、CMAKE_BUILD_TYPE、CMAKE_CONFIGURATION_TYPES、CMAKE_INSTALL_PREFIX、GCC_COMPILER_VERSION和LIBRARY_OUTPUT_PATH_ROOT,但没有BUILD_opencv_xyz选项,这使得我无法禁用单个软件包),比我在x86或x64平台上构建opencv时 情况 更少。
我担心寻找不同的编译器可能会导致Qt出问题,因为据我所知,为了使opencv在Qt中工作,必须使用与用于构建Qt库和构建我的程序相同的编译器对其进行编译。每当我不小心尝试过这样做时,就会遇到奇怪的崩溃,无论是在我包含任何opencv头文件时,还是在我调用任何opencv函数时都会出现。