准备环境和工具
1、主机环境 ubuntu20
2、交叉编译器 gcc-linaro-6.3.1...arm-linux-gnuebihf
3、QT5源码包qt-5.11.3_sources
下载qt-5.11.3的包需要先带网络代理软件,再访问下载目录就可以显示了。
Index of /archive/qt
4、依赖库安装
sudo apt install g++ make qt3d5-dev-tools -y
sudo apt install qml-module-qtquick-xmllistmodel -y
sudo apt install qml-module-qtquick-virtualkeyboard qml-module-qtquick-privatewidgets qml-module-qtquick-dialogs qml -y
sudo apt install libqt53dquickscene2d5 libqt53dquickrender5 libqt53dquickinput5 libqt53dquickextras5 libqt53dquickanimation5 libqt53dquick5 -y
sudo apt install qtdeclarative5-dev qml-module-qtwebengine qml-module-qtwebchannel qml-module-qtmultimedia qml-module-qtaudioengine -y
5、解包交叉编译器和qt源码
tar -xvf gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar
可以选择将gcc编译器,移动到opt目录下
tar -xvf qt-everywhere-src-5.11.3.tar.xz
cd qt-everywhere-src-5.11.3
5、修改qmake.conf
路径: qt-everywhere-src-5.11.3/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
这里需要先配置下交叉变异工具路径 本机qt程序编译也会调用
#
# 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
#交叉编译工具 带有-lts的会编译失败不知道为什么
#QMAKE_CC = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc -lts
#QMAKE_CXX = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ -lts
#QMAKE_LINK = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ -lts
#QMAKE_LINK_SHLIB = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ -lts
QMAKE_CC = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++
# modifications to linux.conf
#交叉编译工具
QMAKE_AR = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP = /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-strip
load(qt_config)
#tslib路径(交叉编译库)
QMAKE_INCDIR=/opt/tslib-1.21/include
QMAKE_LIBDIR=/opt/tslib-1.21/lib
6、configure配置脚本文件
为了防止代码污染,可以先新建一个build目录
mkdir build && cd build (特别说明 这个build 目录 不能在qt 源代码目录下,默认编译仅支持顶级编译,可以在其他目录 脱离qt源码目录随便创建一个文件夹编译)
#!/bin/sh
../configure \
-prefix /opt/rk3288/qt-5.11.3/ \
-xplatform linux-arm-gnueabi-g++ \
-gui \
-widgets \
-release \
-opensource \
-confirm-license \
-no-openssl \
-no-opengl \
-skip qtdeclarative #这行是可选的,加上会不编译qml quick模块,需要就删掉这一行
7、特别说下 -skip qtdeclarative这一条,名字很坑完全看不出和quick有什么关系,网上很多都说编译会报错就加上这个,也可能是因为用不到quick为了缩小体积,很多配置文件都把这个给加上了,但是这个是qml quick模块,需要这部分功能的一定不要加,而且我这边编译也没报错。
8、build (-j8 8指的是cpu核心数)
make -j8
sudo make -j8 install
9、编译报错处理
1),error1 :qt-everywhere-src-5.11.3/qtbase/src/corelib/global/qrandom.cpp:455:62: error: no matching function for call to 'std::mersenne_twister_engine
方法:在qrandom.cpp 的219行,增加一条定义
typedef quint32 result_type;
qsizetype fillBuffer(void *, qsizetype) Q_DECL_NOTHROW
{
// always use the fallback
return 0;
}
#endif // Q_OS_WINRT
typedef quint32 result_type;
static SystemGenerator &self();
void generate(quint32 *begin, quint32 *end) Q_DECL_NOEXCEPT_EXPR(FillBufferNoexcept);
2),error: 'SIOCGSTAMP' undeclared (first use in this function); did you mean 'SIOCGARP'?
解决:找到socketcanbackend.cpp并打开,添加头文件
#include <linux/sockios.h>
即可解决问题
3),python: not found
解决:在终端输入命令
sudo ln -s /usr/bin/python3 /usr/bin/python 将Python和Python3 连接到一起
4),缺少 libxcb*
解决:sudo apt-get install libxcb*
备注:
ubuntu20的 系统vi编辑器过老,需要升级下
1、打开终端。
2、更新软件包列表:
sudo apt-get update
3、安装或更新 vim:
sudo apt-get install --only-upgrade vim
或者直接升级所有软件包:
sudo apt-get upgrade vim
如果系统提示需要升级,输入 Y 确认。
admin1@admin:/opt/gcc-arm-linux-gnueabihf-8.3.0/bin$ find "$(pwd)" -maxdepth 1
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-addr2line
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/runtest
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gdb
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-c++filt
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-strip
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-c++
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-elfedit
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-readelf
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gprof
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-strings
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ld.gold
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcov
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ld
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-6.3.1
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-size
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcov-tool
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-objdump
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-dwp
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-as
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-ar
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ld.bfd
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/gdbserver
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ar
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-ranlib
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-nm
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-objcopy
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-cpp
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-nm
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gcc-ranlib
/opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-gfortran
下方为编译qt开发工具
../configure \
-prefix /opt/qt-5.11.3/ \
-gui \
-widgets \
-release \
-opensource \
-confirm-license \
-no-openssl \
-no-opengl
之后
make -j8
sudo make -j8 install
上述编译完成之后
sudo apt install qtcreator
问题
可能遇到的问题
ubuntu安装qt时编译出现cstddef:50:10: fatal error: 'stddef.h' file not found
sudo apt-get install libclang-common-8-dev
,这条命令完美解决
补充 :
设置文件权限
sudo chmod -R 777 /home/
更改用户组权限
sudo chown admin1:admin1 /home
ubuntu 下用的vpn客户端 - 可用的
https://github.com/2dust/v2rayN/releases
MAC M2下
当出现 版本不匹配 这样做
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.15
CONFIG+=sdk_no_version_check
如果 报错 不影响运行 可以关闭插件中
ClangCodeModel
这个配置是基于 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
#
# 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/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_CC = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP = /opt/gcc-linaro-7.5.0/bin/arm-linux-gnueabihf-strip
load(qt_config)
推荐几个主流 Linaro 工具链版本选择参考
Linaro 工具链版本 | GCC 版本 | 对应 glibc 范围 | 使用场景 |
---|---|---|---|
6.3.1-2017.02 | 6.3.1 | glibc 2.23 | 嵌入式 Linux 4.x 常见 |
7.5.0-2019.12 | 7.5.0 | glibc 2.27~2.28 | ARMv7 硬浮点常见 |
8.3.0-2019.03 | 8.3.0 | glibc 2.28~2.29 | 新平台(如 RK3399) |
aarch64-linux-gnu-9.x | 9.x | glibc 2.31+ | 64 位 ARM(Cortex-A72) |
当嵌入式linux内置qt版本与开发机器编译版本不一致
-
本机编译机器运行正常,但部署远端会发生异常
处理
在远端嵌入式linux机器上进入/usr/lib/arm-linux-gnueabihf/qt5/qml/QtQuick/Controls.2
嵌入式linux机器qt相关东西一般在这里
随意打开一个 例如 menu.qml vi 编辑后查看内部 import 的相关版本
- 此相关问题 导致的原因在于本地编译qt库与远端设备不同步导致的
注意
qt 库编译 - 路径禁止包含中文 --卡了一段时间没想到是因为这个
当开发机器选择远端编译环境运行部署的时候如果提示
qt.qpa.screen: QXcbConnection: Could not connect to display :0
Could not connect to any X display.
-
1、先确认远端是否有
echo $DISPLAY # 如果有输出则说明有图形界面
若上述条件满足 则直接登陆远端设备 直接执行下方指令
-
临时放开所有本地用户的访问权限(不安全,只用于调试):
xhost +local:
或者执行
-
(注意:这会放开所有访问权限,不建议在公共或生产环境使用)
xhost +
成功再次编译项目运行到远端