news 2026/4/18 10:28:55

在Ubuntu 20.04上源码编译Qt 5.15.2,我踩过的那些坑和最终解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在Ubuntu 20.04上源码编译Qt 5.15.2,我踩过的那些坑和最终解决方案

在Ubuntu 20.04上源码编译Qt 5.15.2:避坑指南与实战解决方案

第一次在Ubuntu 20.04上从源码编译Qt 5.15.2时,我以为这不过是个标准的./configure && make流程。直到configure脚本报出第一个依赖错误,我才意识到这将是一场持续两天的"生存挑战"。本文记录了我从依赖地狱到最终成功运行Qt应用的完整历程,特别聚焦那些官方文档从未提及的"坑"。

1. 环境准备:那些容易被忽略的依赖项

大多数教程会告诉你安装libxcb相关依赖,但很少有人提到Qt 5.15.2对系统组件的特殊要求。在纯净的Ubuntu 20.04上,以下依赖包缺一不可:

sudo apt update sudo apt install -y build-essential libgl1-mesa-dev libglu1-mesa-dev \ libxkbcommon-dev libxkbcommon-x11-dev libxrender-dev \ libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev \ libxext-dev libxfixes-dev libxi-dev libxrandr-dev libxcb1-dev \ libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev \ libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev \ libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev \ libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev \ libxcb-xkb-dev libxcb-xinput-dev libwayland-dev

注意:libxcb相关依赖需要完整安装,缺少任何一个子模块都可能导致后续的GUI组件编译失败。

我特别整理了几个关键依赖的作用:

依赖包作用缺失时的典型错误
libxcb-xinerama0-dev多显示器支持QScreen无法初始化
libxcb-xinput-dev输入设备支持鼠标/键盘事件失效
libwayland-devWayland协议支持在Wayland会话中窗口异常

2. 源码配置:超越官方建议的参数优化

下载解压源码后,直接运行./configure -xcb可能会遇到以下问题:

问题1:OpenGL检测失败

ERROR: The OpenGL functionality tests failed!

解决方案是明确指定OpenGL实现:

./configure -xcb -opengl desktop

问题2:SQL插件编译失败添加SQL驱动支持:

./configure -xcb -sql-sqlite -plugin-sql-sqlite

经过多次测试,我最终使用的完整配置命令如下:

./configure -prefix /opt/Qt5.15.2 \ -release \ -opensource \ -confirm-license \ -xcb \ -opengl desktop \ -no-openssl \ -nomake examples \ -nomake tests \ -skip qtwebengine \ -sql-sqlite -plugin-sql-sqlite \ -qt-zlib \ -qt-libpng \ -qt-libjpeg \ -qt-freetype

提示:使用-skip qtwebengine可以显著减少编译时间,除非你确实需要WebEngine模块。

3. 编译过程:性能调优与错误处理

开始编译后,新的挑战才真正开始:

问题3:内存不足导致g++崩溃

virtual memory exhausted: Cannot allocate memory

解决方案是限制并行编译线程数(8核机器示例):

make -j4 # 而非make -j$(nproc)

问题4:链接阶段卡死添加交换空间临时解决方案:

sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

我推荐使用以下监控命令观察编译状态:

watch -n 1 "ps -eo pid,user,pcpu,pmem,cmd --sort=-pcpu | head -n 10"

当遇到特定模块编译失败时,可以尝试单独重新编译:

cd qtbase/src/widgets make clean && make

4. 安装后配置:环境变量与字体问题

完成sudo make install后,还需要解决以下问题:

问题5:qmake命令未找到创建qtchooser配置:

sudo qtchooser -install qt5.15.2 /opt/Qt5.15.2/bin/qmake export QT_SELECT=qt5.15.2

问题6:应用程序显示白屏无文字这是因为Qt默认不包含字体。解决方案:

  1. 创建字体目录:
sudo mkdir -p /opt/Qt5.15.2/lib/fonts
  1. 复制系统字体(示例):
sudo cp /usr/share/fonts/truetype/dejavu/* /opt/Qt5.15.2/lib/fonts/
  1. 设置环境变量:
export QT_QPA_FONTDIR=/opt/Qt5.15.2/lib/fonts

永久生效的配置方法是在~/.bashrc中添加:

export PATH="/opt/Qt5.15.2/bin:$PATH" export LD_LIBRARY_PATH="/opt/Qt5.15.2/lib:$LD_LIBRARY_PATH" export QT_QPA_PLATFORM_PLUGIN_PATH="/opt/Qt5.15.2/plugins" export QT_QPA_FONTDIR="/opt/Qt5.15.2/lib/fonts"

5. 验证与调试技巧

编写测试程序时,建议使用以下CMake配置:

cmake_minimum_required(VERSION 3.5) project(TestQt) set(CMAKE_CXX_STANDARD 11) set(CMAKE_PREFIX_PATH "/opt/Qt5.15.2") find_package(Qt5 COMPONENTS Widgets REQUIRED) add_executable(testqt main.cpp) target_link_libraries(testqt Qt5::Widgets)

调试时常用的环境变量:

# 显示Qt的调试信息 export QT_DEBUG_PLUGINS=1 # 指定平台插件 export QT_QPA_PLATFORM=xcb # 启用详细日志 export QT_LOGGING_RULES=qt.*=true

当应用程序出现奇怪问题时,尝试在命令行运行并观察输出:

./your_app -platform xcb
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 10:28:15

QMCDecode:一键解锁QQ音乐加密格式,让音乐真正属于你

QMCDecode:一键解锁QQ音乐加密格式,让音乐真正属于你 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录&#x…

作者头像 李华
网站建设 2026/4/18 10:25:43

AzurLaneAutoScript:5分钟搞定碧蓝航线全自动脚本的终极指南

AzurLaneAutoScript:5分钟搞定碧蓝航线全自动脚本的终极指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 你是…

作者头像 李华
网站建设 2026/4/18 10:25:38

葵花8号卫星数据获取实战(一)——FTP协议详解与FileZilla配置指南

1. 葵花8号卫星数据与FTP协议基础 第一次接触卫星数据下载的朋友可能会觉得这是个高大上的技术活,其实只要掌握几个关键工具,操作起来比想象中简单得多。葵花8号(Himawari-8)是日本气象厅(JMA)运营的静止气…

作者头像 李华
网站建设 2026/4/18 10:24:20

用cpolar实现SSH内网穿透:Ubuntu远程连接保姆级教程

零公网IP环境下实现Ubuntu远程SSH访问的终极方案 想象一下这样的场景:你正在咖啡馆处理紧急工作,突然需要访问家中Ubuntu服务器上的关键文件;或是出差途中发现实验室的Ubuntu工作站有个配置需要立即调整。没有固定公网IP的情况下,…

作者头像 李华
网站建设 2026/4/18 10:22:46

跨平台流媒体下载终极指南:N_m3u8DL-RE一键解密加密视频教程

跨平台流媒体下载终极指南:N_m3u8DL-RE一键解密加密视频教程 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL…

作者头像 李华