当前位置: 首页 > news >正文

在Ubuntu 20.10上为老项目降级GCC 4.8,再搞定Qt 4.8.7编译(附字体修复)

在Ubuntu 20.10上为老项目降级GCC 4.8并编译Qt 4.8.7的完整指南

当维护一个遗留的Qt 4.8.7项目时,在现代Ubuntu系统上会遇到各种兼容性问题。本文将深入探讨如何降级GCC编译器到4.8版本,成功编译Qt 4.8.7,并解决常见的字体显示问题。

1. 为什么需要降级GCC?

在现代Ubuntu系统上编译老旧的Qt项目时,使用高版本GCC往往会遇到各种编译错误。这是因为:

  • ABI不兼容:高版本GCC对C++ ABI做了修改,导致与老代码不兼容
  • 语法变更:C++标准演进导致某些旧语法不再被支持
  • 依赖关系:Qt 4.8.7是为特定GCC版本设计的,依赖特定编译器行为

关键考虑因素

因素高版本GCCGCC 4.8
ABI兼容性
编译成功率
性能优化一般
安全特性完善有限

2. 安装GCC 4.8的详细步骤

2.1 添加旧版软件源

由于GCC 4.8已从Ubuntu 20.10的默认源中移除,需要手动添加旧版源:

sudo nano /etc/apt/sources.list

在文件末尾添加以下内容:

deb http://dk.archive.ubuntu.com/ubuntu/ xenial main deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe

2.2 处理公钥错误

更新源时可能会遇到公钥错误,解决方法:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 sudo apt-get update

2.3 安装GCC 4.8

安装GCC和G++ 4.8版本:

sudo apt-get install gcc-4.8 g++-4.8

2.4 设置默认编译器

将GCC 4.8设为系统默认:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 \ --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 \ --slave /usr/bin/gcov gcov /usr/bin/gcov-4.8 sudo update-alternatives --config gcc

选择GCC 4.8对应的编号,然后验证:

gcc --version

3. 编译Qt 4.8.7的完整流程

3.1 准备编译环境

首先安装必要的依赖:

sudo apt-get install libx11-dev libxext-dev libxtst-dev

3.2 配置Qt源码

解压源码并进入目录:

tar xf qt-everywhere-opensource-src-4.8.7.tar.gz cd qt-everywhere-opensource-src-4.8.7

初始配置命令:

./configure -opensource -no-openssl -no-sql-mysql

提示:如果之前尝试过配置,先运行make confclean清除旧配置

3.3 解决常见配置错误

可能遇到的错误及解决方案:

  1. XLib功能测试失败

    • 确保已安装libx11-dev等包
    • 检查/usr/include/X11是否存在
  2. OpenGL相关错误

    sudo apt-get install libgl1-mesa-dev
  3. 缺少SQL驱动

    • 如果不需要数据库支持,可以添加-no-sql-*选项
    • 或者安装相应开发包:libsqlite3-dev

3.4 编译和安装

使用多核编译加速:

make -j$(nproc) sudo make install

编译时间可能较长,取决于系统配置。

4. 解决字体显示问题

Qt 4.8.7在现代系统上常遇到字体显示问题,特别是中文显示异常或字体模糊。

4.1 安装字体相关依赖

sudo apt-get install libfreetype6-dev libfontconfig1-dev sudo ln -s /usr/include/freetype2/freetype/ /usr/include/freetype

4.2 重新配置Qt

添加fontconfig支持重新配置:

./configure -opensource -no-openssl -no-sql-mysql -fontconfig make clean make -j$(nproc) sudo make install

4.3 配置系统字体

创建或修改~/.fonts.conf文件:

<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <match target="font"> <edit name="antialias" mode="assign"> <bool>true</bool> </edit> <edit name="hinting" mode="assign"> <bool>true</bool> </edit> <edit name="hintstyle" mode="assign"> <const>hintslight</const> </edit> <edit name="rgba" mode="assign"> <const>rgb</const> </edit> </match> </fontconfig>

4.4 测试字体显示

创建一个简单的测试程序验证字体显示:

#include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label("中文测试 - 字体显示测试"); label.show(); return app.exec(); }

编译并运行,应该能看到清晰的中文显示。

5. 项目集成与维护建议

5.1 设置项目构建环境

在项目的.pro文件中添加:

QMAKE_CC = gcc-4.8 QMAKE_CXX = g++-4.8 QMAKE_LINK = g++-4.8

5.2 使用Docker容器隔离环境

为避免污染主机环境,可以考虑使用Docker:

FROM ubuntu:20.10 RUN apt-get update && apt-get install -y \ gcc-4.8 g++-4.8 \ libx11-dev libxext-dev libxtst-dev \ libfreetype6-dev libfontconfig1-dev # 设置默认GCC RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 \ --slave /usr/bin/g++ g++ /usr/bin/g++-4.8 \ --slave /usr/bin/gcov gcov /usr/bin/gcov-4.8

5.3 长期维护策略

对于必须维护的老旧Qt项目,建议:

  • 文档化环境配置:详细记录所有依赖和配置步骤
  • 创建构建脚本:自动化整个构建过程
  • 考虑逐步迁移:评估将项目迁移到新版Qt的可能性
http://www.jsqmd.com/news/724488/

相关文章:

  • WindowsCleaner:如何用开源工具为你的Windows系统“减负瘦身“?
  • 全国邮票回收 北京上门回收邮票纪念币 18910232290 - 品牌排行榜单
  • 用 ChatGPT 5.5 的进阶思考与 Deep Research 打通 SOTA 文献阅读、改进实验到英文 SCI 写作全流程
  • 要不要辍学和辞职来赚钱
  • 深度解析BepInEx 6.0:Unity游戏插件框架的技术架构与实战优化
  • 别再傻傻分不清了!CAD、CAE、CAM、PDM到底怎么选?给工程师的软件选择避坑指南
  • 抖音内容保存全攻略:3种高效方法让精彩瞬间永不丢失
  • 完整网页截图终极方案:一键捕获超长页面的专业工具
  • 移动红绿灯挑战:自动驾驶系统的非常规决策逻辑
  • 终极指南:LeagueSkinChanger英雄联盟全皮肤解锁完整教程
  • 保姆级教程:在CentOS 7上从源码编译安装Apache Ranger 2.0.0(含Maven国内源配置)
  • 水文新人避坑指南:P-III曲线计算,选武大版软件还是河海版?实测对比来了
  • 别再乱改设备树了!手把手教你用sysfs和debugfs排查RK3588 GPIO复用冲突
  • 2026年泉州外贸推广公司服务商优选榜单:从流量焦虑到询盘兜底,谁能真正助力泉企出海? - 速递信息
  • 3个核心疑问:如何用C工具自动化采集全国高铁数据?
  • 要不要了解宏观-全球-各种品牌的商业故事-和我们的关系是什么-
  • 云容笔谈东方审美量化评估:基于CLIP-ViT与人工评审双轨打分体系报告
  • ComfyUI-Manager终极指南:如何快速掌握AI工作流管理神器
  • 国内低噪音螺旋振动提升机厂家实力排行与实测对比 - 奔跑123
  • 气门摇臂轴支座加工工艺设计
  • Spring IoC 依赖注入:从原理到实践的深度解析
  • 抖音批量下载终极指南:10倍效率获取无水印视频
  • Qwen2.5-VL-7B-Instruct多模态教程:支持视频首帧+关键帧多图联合理解
  • Starry Night镜像免配置部署:Docker+conda环境3分钟启动指南
  • 深度学习医疗应用
  • Joy-Con Toolkit终极指南:如何免费解锁Switch手柄完整潜力
  • 魔兽争霸III终极优化指南:WarcraftHelper让你的经典游戏重获新生 [特殊字符]
  • 家里的老邮票、旧纪念币想出手 联系我们现金结算18910232290 - 品牌排行榜单
  • 小伙伴提问-应该怎么脱离父母的控制
  • 深入对比:STC8H的I2C驱动DS3231与DS1307,哪个更适合你的低功耗项目?