一、编译前工作
1、普通版
上官网:https://download.qt.io下载和解压源码,例如:qt-everywhere-opensource-src-5.15.10.tar.xz
到目录/home/jaron/workspace/qt-everywhere-src-5.15.10
,创建构建目录,例如:/home/jaron/workspace/qt-5.15.10-build
,通过终端进入构建目录(注意: 在configure
后会在build
目录下自动生成一些源文件,进行make
时会找不到而报错,此时就不要创建构建目录了,直接在源码目录进行configure
和make
),输入命令(注意: 在执行命令前需要先安装OpenGL):
命令选项说明
./../qt-everywhere-src-5.15.10/configure \
-verbose \
-opensource \
-release \
-shared \
-confirm-license \
-make libs \
-c++std c++14 \
-xcb \
-xcb-xlib \
-bundled-xcb-xinput \
-nomake tests \
-nomake examples \
-prefix /opt/qt-5.15.10-ubuntu-x64
推荐: 这里指定了c++14
,使用g++ 5.4.0
进行编译,高于的话编译过程可能会出错。
说明: 如果要编译出libqxcb.so
,则最好增加选项:-xcb -xcb-xlib -bundled-xcb-xinput
,如果配置出现错误:
Feature 'xcb' was enabled, but the pre-condition 'features.thread && features.xkbcommon && libs.xcb' failed.
可以先安装再重新配置(重新配置要增加选项-recheck-all
):
apt install '^libxcb.*-dev' -y
apt install libx11-xcb-dev -y
apt install libglu1-mesa-dev -y
apt install libxrender-dev -y
apt install libxi-dev -y
apt install libxkbcommon-dev -y
apt install libxkbcommon-x11-dev -y
如果出现警告:
Could not find all necessary libraries for qpa-xcb support in QtWebEngine.
如果还是出现警告,则尝试安装下依赖再试试:
apt install libxss-dev -y
apt install libxxf86vm-dev -y
apt install libxkbfile-dev -y
apt install libxv-dev -y
注意: 编译过程中可能会报错,参考以下提前设置:
- qmutex_linux.cpp:multiple definition of ‘QBasicMutex::lockInternal(int)’
- qdbusmarshaller.cpp:(.text+0x0): `QDBusMarshaller::append(QString const&)'被多次定义
- src/client/qwayland-wayland.h: No such file or directory
-skip location
2、带QtMediaPlayer
编译Qt库时,会默认集成MediaPlayer,但是在执行配置后可能出现:
Qt Multimedia:
ALSA ................................... yes
GStreamer 1.0 .......................... no
GStreamer 0.10 ......................... no
Video for Linux ........................ yes
OpenAL ................................. no
PulseAudio ............................. yes
Resource Policy (libresourceqt5) ....... no
Windows Audio Services ................. no
DirectShow ............................. no
Windows Media Foundation ............... no
说明缺少gstreamer
依赖,需要安装
apt install libgstreamer1.0-0 -y
apt install libgstreamer1.0-dev -y
apt install libgstreamer-plugins-base1.0-dev -y
apt install gstreamer1.0-plugins-base -y
apt install gstreamer1.0-plugins-good -y
apt install gstreamer1.0-plugins-bad -y
apt install gstreamer1.0-plugins-ugly -y
apt install gstreamer1.0-libav -y
apt install gstreamer1.0-doc -y
apt install gstreamer1.0-tools -y
apt install gstreamer1.0-x -y
apt install gstreamer1.0-alsa -y
apt install gstreamer1.0-gl -y
apt install gstreamer1.0-gtk3 -y
apt install gstreamer1.0-qt5 -y
apt install gstreamer1.0-pulseaudio -y
依赖项安装后需要重新配置和编译安装,可以用gst-inspect-1.0
查看gstreamer插件信息,也可以用命令gst-launch-1.0 filesrc location=test.mp4 ! decodebin ! autovideosink
测试gstreamer是否安装成功。成功后会在安装目录多出以下链接库:
root@kylin:/opt/qt-5.15.10-kylin-arm64/plugins/mediaservice# ls -lh
总用量 824K
-rw-r--r-- 1 root root 62K 1月 15 08:27 libgstaudiodecoder.so
-rw-r--r-- 1 root root 341K 1月 15 08:27 libgstcamerabin.so
-rw-r--r-- 1 root root 231K 1月 15 08:27 libgstmediacapture.so
-rw-r--r-- 1 root root 82K 1月 15 08:27 libgstmediaplayer.so
-rwxr-xr-x 1 root root 99K 1月 15 08:27 libqtmedia_audioengine.so
注意: QML中VideoOutput
不能使用软渲染,这是因为VideoOutput
使用QVideoRendererControl
项,它需要自定义QSGGeometryNode
行为,而它只适配于OpenGL
。参考:Qml使用videooutput送入yuv数据无法显示视频。需要在main.cpp
中添加OpenGL设置:QQuickWindow::setSceneGraphBackend(QSGRendererInterface::OpenGL);
3、带QtWebEngine
由于QtWebEngine
模块基于Chromium
内核,会耗内存,最好保证内存大于等于16G
。
编译QtWebEngine
需要先安装相关依赖项。参考官网:https://wiki.qt.io/QtWebEngine/How_to_Try
官方推荐安装:
apt install bison -y
apt install build-essential -y
apt install gperf -y
apt install flex -y
apt install libasound2-dev -y
apt install libcups2-dev -y
apt install libdrm-dev -y
apt install libegl1-mesa-dev -y
apt install libnss3-dev -y
apt install libpci-dev -y
apt install libpulse-dev -y
apt install libudev-dev -y
apt install nodejs -y
apt install libxtst-dev -y
apt install gyp -y
apt install ninja-build -y
如果是在Ubuntu 20.4
或银河麒麟V10
上编译,则需要额外安装:
apt install libssl-dev -y
apt install libxcursor-dev -y
apt install libxcomposite-dev -y
apt install libxrandr-dev -y
apt install libxdamage-dev -y
apt install libfontconfig1-dev -y
apt install libxss-dev -y
apt install libsrtp0-dev -y
apt install libwebp-dev -y
apt install libjsoncpp-dev -y
apt install libopus-dev -y
apt install libminizip-dev -y
apt install libavutil-dev -y
apt install libavformat-dev -y
apt install libavcodec-dev -y
apt install libevent-dev -y
apt install libvpx-dev -y
apt install libsnappy-dev -y
apt install libre2-dev -y
apt install libprotobuf-dev -y
apt install protobuf-compiler -y
编译前进行配置:
./configure \
-verbose \
-opensource \
-release \
-shared \
-confirm-license \
-make libs \
-c++std c++14 \
-xcb \
-xcb-xlib \
-bundled-xcb-xinput \
-nomake tests \
-nomake examples \
-webengine-proprietary-codecs \
-no-feature-webengine-system-ninja \
-prefix /opt/qt-5.15.10-kylin-arm64
其中如果要WebEngineView
支持MP4
视频播放,需要添加-webengine-proprietary-codecs
选项。配置成功后,执行make
,建议不要带-j8
或其他并行参数,不然会很吃内存资源。
- 如果出现
MPFR
相关错误,如:
发现mpfr-3.1.4
的版本的src/init2.c
第52
行有断言MPFR_ASSERTN(p >= MPFR_PREC_MIN && p <= MPFR_PREC_MAX);
,而高版本的则没有,所以可能需要升级版本,可以从官网https://cygwin.uib.no/x86_64/release/mpfr/下载高版本,如:mpfr-4.1.0
并重新编译安装,备份/usr/local/lib/libmpfr.so.4
软件链接,重新建立软连接,如:ln -s /usr/local/lib/libmpfr.so.6.0.2 /usr/local/lib/libmpfr.so.4
。 - 如果出现
ninja
错误,如:
大概率可能前面已经有出现编译错误,只需把前面错误解决然后重新make
即可。也有可能内存资源不足导致的,重新make
或扩大内存后再重新make
。 - 虚拟键盘
qtvirtualkeyboard
在qtwebengine
中中文输入法不可用(输入中文,会自动提交,中文候选词一闪而过不可选中)。方案:修改源码文件qtvirtualkeyboard/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp
,注释掉void QVirtualKeyboardInputContextPrivate::update(Qt::InputMethodQueries queries)
函数中update input engine
注释下方的commit();
函数调用。
二、编译安装
配置成功后,输入命令:make
,内存最好大于4G以上,不然在某些情况下编译可能会不过,即进入编译流程,等候大约三四个小时,编译成功后,输入命令:make install
,即可把qt库安装到目录:/opt/qt-5.15.10-ubuntu-x64
。
三、添加系统字体
进入目录:/opt/qt-5.15.10-ubuntu-x64/lib
,创建字体目录fonts
,可以把.ttf
字体文件拷贝到字体目录中。
四、环境配置
设置环境变量,编辑/etc/profile
文件,末尾添加:
export QT_ROOT=/opt/qt-5.15.10-ubuntu-x64
# 运行依赖
export QT_DEBUG_PLUGINS=1 # 开启插件检测
export QML2_IMPORT_PATH=$QT_ROOT/qml # 指定Qt的QML2路径
export QT_PLUGIN_PATH=$QT_ROOT/plugins # 指定Qt的插件路径
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts # 指定Qt的字体路径
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins/platforms # 指定Qt的平台插件路径
export QT_IM_MODULE=qtvirtualkeyboard # 指定Qt输入法组件(使用Qt自带虚拟键盘)
export LD_LIBRARY_PATH=$QT_ROOT/lib:$LD_LIBRARY_PATH
# 开发依赖
export PATH=$QT_ROOT/bin:$PATH
export CPATH=$QT_ROOT/include:$CPATH
export LIBRARY_PATH=$QT_ROOT/lib:$LIBRARY_PATH
export PKG_CONFIG_PATH=$QT_ROOT/lib/pkgconfig:$PKG_CONFIG_PATH
注意: 当Linux没有安装桌面系统(例如:ukui、gonome等)时,要使Qt窗口能够渲染,需要基于linux framebuffer,所以需要设置环境变量,当窗口显示后杀死程序,系统会停留在Qt程序被杀死前的界面,无法进入命令窗口操作,因此需要设置export QT_QPA_FB_DRM=1
,参考:Qt for Embedded Linux。
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FB_DRM=1
五、绿色配置
参考:Windows平台下的绿色配置。
六、配置Qt Creator
安装Qt Creator后,运行时,如果出现以下错误:
则需要先执行命令:
sudo apt-get install libxcb-xinerama0
。或者添加环境变量QT_QPA_PLATFORM
,例如:
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_INTEGRATION=eglfs_viv
export QT_QPA_EGLFS_FORCEVSYNC=1
export FB_MULTI_BUFFER=2
或者:
export QT_QPA_PLATFORM=linuxfb