ubuntu 环境 cross compile 交叉编译 ARM Qt 集成 opencv
Qt 的版本众多,交叉编译Qt可以下载 最新的 Qt 5.11,在 qtbase/mkspecs/devices/ 下找到你对应开发板的配置文件,
拷贝出来, 选择一版适用当前交叉编译工具链的版本,这里以 5.8.0版本的Qt 作为demo。
下载源码,qt-everywhere-opensource-src-5.8.0 下载地址 http://download.qt.io/archive/qt/
解压后 ,找到Qt 5.11.1中跟目标开发板最匹配的配置文件 ,我的是 qt-everywhere-opensource-src-5.8.0/qtbase/mkspecs/devices/linux-rcar-m3-g++ 拷贝整个linux-rcar-m3-g++目录
到 Qt 5.8.0 对应的 devices/目录下,
source XXXXX交叉工具编译链
写一个 配置脚本build.sh chmod 修改执行权限 。
#!/bin/bash
export ROOTFS=/apt/poky/2.1.2/sysroots/aarch64-poky-linux
./configure \
-opensource \
-confirm-license \
-v \
-skip qt3d \
-skip webchannel \
-skip location \
-prefix /home/Qt580/ \
-device linux-rcar-m3-g++ \
-device-option CROSS_COMPILE=/apt/poky/2.1.2/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux- \
-sysroot $ROOTFS \
-opengl es2 \
对于报错的模块可以选在skip 掉 。
执行build.sh 脚本 后,生成Makefile
make 长达一个多小时
make install 安装在 ROOTFS 的 /home/QT580中
Qt Creator 下载 qt-opensource-linux-x64-5.8.0.run 还是之前的下载地址。
配置交叉编译环境。
工具栏 ----〉 Options ----〉
左边栏 Build & Run , 配置 Compliers -〉 Manual Add -〉 GCC -〉 C/C++ 全配置成/apt/poky/2.1.2/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux-g++
配置Qt Versions -〉 Manual Add 配置 /apt/poky/2.1.2/sysroots/aarch64-poky-linux/home/Qt580/bin/qmake
配置 Kits Compiles 选 配置的Manual GCC ,Qt Version 选择 Menual Version
Apply
新建一个工程
Kit Selection 选择刚才配置 的KIt 名字 。
在 demo.pro 配置文件中 添加Opencv 库文件。(交叉编译好了)
INCLUDEPATH += /apt/poky/2.1.2/sysroots/aarch64-poky-linux/usr/include \
/apt/poky/2.1.2/sysroots/aarch64-poky-linux/usr/include/opencv \
/apt/poky/2.1.2/sysroots/aarch64-poky-linux/usr/include/opencv2
LIBS += \
/apt/poky/2.1.2/sysroots/aarch64-poky-linux/usr/lib/libopencv_*
编写代码
#include "mainwindow.h"
#include <QApplication>
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat frame0,frame1,frame2,frame3;
//frame=imread("/media/logo.bmp");
VideoCapture cap0(0);
VideoCapture cap1(1);
VideoCapture cap2(2);
VideoCapture cap3(3);
if(!cap0.isOpened())return 1;
if(!cap1.isOpened())return 1;
if(!cap2.isOpened())return 1;
if(!cap3.isOpened())return 1;
while(1){
if(!cap0.read(frame0))return 1;
if(!cap1.read(frame1))return 1;
if(!cap2.read(frame2))return 1;
if(!cap3.read(frame3))return 1;
resize(frame0,frame0,Size(640,480));
imshow("test0",frame0);
moveWindow("test0", 0, 0);
resize(frame1,frame1,Size(640,480));
imshow("test1",frame1);
moveWindow("test1",640,0);
resize(frame2,frame2,Size(640,480));
imshow("test2",frame2);
moveWindow("test2",0,480);
resize(frame3,frame3,Size(640,480));
imshow("test3",frame3);
moveWindow("test3",640,480);
waitKey(30);
}
//cout << "Hello world\n"<<endl;
// return 0;
// QApplication a(argc, argv);
// MainWindow w;
//w.show();
// return a.exec();
return 0;
}
配置 ,开发板环境变量 /etc/enviroment 添加 QT_QPA_PLATFORM=linuxfb ( 还可以指明 那个fb 等等 )或者 程序后 加上 -platform=linuxfb 或者其他显示系统 wayland X11 等等。
把交叉编译Qt的 产物 /plugins/platforms/ 拷贝到程序执行目录下 。解决
failed to start because it could not find or load the Qt platform plugin "linuxfb"
in "".
完美执行。