前情提醒,本文图文匹配为文字说明在上,图片在下,所有文件夹均不使用中文以免出错。
前置操作:交叉编译工具链的安装,QT与opencv皆需要交叉编译工具链作为前置,否则无法在开发板运行或程序报错。前置操作都在linux上操作
下载开发板对应交叉编译工具链或自行下载,可参考第一步的文章,我使用的是rv1106自带交叉编译工具链,各位也可使用linaro公司的交叉编译工具链。
交叉编译工具链下载解压即为安装,安装完成后需在系统中添加环境变量路径。
1.(在终端)打开系统环境变量文件
sudo gedit /etc/profile
2.添加交叉编译器路径到文件中,这里以我自己的举例,(在文件)末尾添加
export PATH=$PATH:/opt/arm-rockchip830-linux-uclibcgnueabihf/bin
3.添加结束后保存退出,(在终端)更新系统文件变量,显示无权限则在前面添加sudo
source profile
4.(在终端)查看交叉编译器gcc版本,寻找交叉编译器路径/bin目录下,
以gcc结尾的文件名,添加-v查看版本,以此验证交叉编译器是否成功添加到环境变量中
以我自己的举例,出现右图中的情况即为成功添加到环境变量
arm-rockchip830-linux-uclibcgnueabihf-gcc -v
opencv库的编译移植,在linux上操作
第一步:下载opencv4.2.0源码,下载cmake与cmake-gui
参考文章
(24条消息) OpenCV移植到ARM全过程-I_opencv在arm上的移植_KayChanGeek的博客-CSDN博客
(24条消息) Qt+OpenCV在arm板上运行实现思路_MXY__的博客-CSDN博客
(24条消息) OpenCV 移植与交叉编译详细过程以及问题解决记录_XcodeBox的博客-CSDN博客
opencv下载
可以在opencv官网下载opencv源码包,本教程下载opencv源码的zip包,下载后解压到主文件夹内避免权限问题。
cmake、cmake-gui下载
安装
sudo apt-get install cmake
sudo apt-get install cmake-qt-gui
运行
cmake-gui
第二步:交叉编译opencv源码
打开opencv解压路径,创建新文件夹(我的为下图文件夹),放置编译配置文件。
打开cmake-gui,按图示方法设置①opencv文件路径,与②编译配置文件的路径,再点击③configure 到CMake Setup
CMake Setup 选择
①Unix Makefiles
②Specify options……,
③点击next 到下一步。
① OS大小写敏感,所以一定要写成Linux
②选择交叉编译工具链路径/bin 中的文件,C选择gcc,C++选择g++,在前置操作第四步中有文件图。
③选择交叉编译工具链路径/bin,用于查找gcc与g++文件
④修改下方路径选择地址为根目录查找
⑤点击finish开始加载配置文件,等待加载结束,第一次加载后参数全标红是正常现象。
配置文件第一次加载后全标红,请根据下列信息修改配置文件
①BUILD_opencv_world,勾选
②BUILD_ZLIB,勾选
③CMAKE_INSTALL_PREFIX,修改路径。该路径为编译opencv后的库文件路径,由于开发板环境的特殊性,尽量新建一个文件夹放置。
④CMAKE_BUILD_TYPE,添加Release
⑤CMAKE_CXX_FLAGS,添加-fpermissive -Wno-psabi -pthread -lrt -ldl
⑥CMAKE_EXE_LINKER_FLAGS,添加-lstdc++ -pthread -lrt -ldl -lm
⑤⑥为减少编译时错误的参数,建议添加
点击configure,查看配置参数是否还有标红,若有检查下方配置时错误,若无点击Generate,退出cmake-gui。
终端进入配置文件目录,输入make,不需要make -jx,多核可能导致编译出错。
make
若编译出错,可先在以下网址查看错误:
(24条消息) opencv交叉编译和遇到的问题_西西弗Sisyphus的博客-CSDN博客
(24条消息) 交叉编译opencv:undefined reference to `png_riffle_palette_neon_柳鲲鹏的博客-CSDN博客
make完全结束后输入sudo make install,尽量安装在/usr/local/自己的文件夹,以便移植
sudo make install
库文件编译完成后需要为opencv配置环境变量
sudo gedit /etc/ld.so.conf.d/opencv.conf
QT库的编译移植、QT编译器的配置,在linux上操作
参考
(24条消息) Qt交叉编译移植arm开发板_qt arm 交叉编译_岩枭~的博客-CSDN博客
在QT官网下载QT源码qteverywhere,下载对应版本源码,我所使用的是5.12.1的版本,
先解压源码。
tar xvf qt-everywhere-src-5.12.1.tar.xz
在源码目录下,寻找路径/qtbase/mkspecs/linux-arm-gnueabi-g++,该目录最后一项需对照使用的交叉编译工具链选择,我使用的是gnueabi的工具链,所以选择该目录。打开该目录的qmake.conf,修改其中内容,我的内容放上来以供参考。
下面这三项需要根据开发板的实际架构修改。
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a -lts
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = /opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc
QMAKE_CXX = /opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g++
QMAKE_LINK = /opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g++
QMAKE_LINK_SHLIB = /opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-g++
# modifications to linux.conf
QMAKE_AR = /opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc-ar cqs
QMAKE_OBJCOPY = /opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-objcopy
QMAKE_NM = /opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc-nm -P
QMAKE_STRIP = /opt/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-strip
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a -lts
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a -lts
load(qt_config)
修改完成后退回到qt源码的根目录下,创建一个可执行文件XXX.sh用于编译,该文件内容见下,若是开发板需要增加tsilb库,可查看参考网址。
-xplatform为所使用的的配置文件,即上方修改的配置文件的文件夹路径
-prefix为编译安装路径,自己设置,尽量在根目录下而非主目录下
#!/bin/bash
./configure -prefix /opt/qteverywhere5.12.1-rockchip \
-opensource \
-confirm-license \
-release \
-strip \
-shared \
-xplatform linux-arm-gnueabi-g++ \
-optimized-qmake \
-c++std c++11 \
--rpath=no \
-pch \
-skip qt3d \
-skip qtactiveqt \
-skip qtandroidextras \
-skip qtcanvas3d \
-skip qtconnectivity \
-skip qtdatavis3d \
-skip qtdoc \
-skip qtgamepad \
-skip qtlocation \
-skip qtmacextras \
-skip qtnetworkauth \
-skip qtpurchasing \
-skip qtremoteobjects \
-skip qtscript \
-skip qtscxml \
-skip qtsensors \
-skip qtspeech \
-skip qtsvg \
-skip qttools \
-skip qttranslations \
-skip qtwayland \
-skip qtwebengine \
-skip qtwebview \
-skip qtwinextras \
-skip qtx11extras \
-skip qtxmlpatterns \
-make libs \
-make examples \
-nomake tools -nomake tests \
-gui \
-widgets \
-dbus-runtime \
--glib=no \
--iconv=no \
--pcre=qt \
--zlib=qt \
-no-openssl \
--freetype=qt \
--harfbuzz=qt \
-no-opengl \
-linuxfb \
--xcb=no \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-recheck-all
执行该文件安装配置,若权限不足在前面加上sudo,配置完成编译源码。
./XXX.sh
XXX替换自己文件名
sudo make -j4
sudo make install
下载qt编译器opensource,官网下载安装qt编译器。
安装完成后,将交叉编译的qt源码设置到qt编译器内。
gcc/g++配置:
打开qt,选择 ①工具—>②选项,
选择①编译器,点击②添加—>③GCC,需要把GCC中的C和C++都配置一遍,
其中④是名称,统一一下即可,⑤为编译器路径,实际上选择交叉编译工具链/bin中的gcc与g++
即可。
选择 ①Qt Versions,点击②添加,添加请寻找刚刚编译的qteverywhere源码路径下的/bin/qmake,名称会根据路径自动添加
选择构建套件(Kit),点击添加,套件中需要修改4处地方:①名称,建议与开发板统一,②设备类型,选择通用linux设备即可,③编译器,选择之前添加的交叉编译工具的编译器,④Qt版本,选择之前添加的经过交叉编译后的qt版本即可,选择完之后点击ok保存退出。
之后创建开发板项目,选择对应开发板的构建套件即可。