当前位置: 首页 > 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.cnnetsun.cn/news/2156799.html

相关文章:

  • 思源黑体TTF:免费开源的多语言字体构建工具完全指南
  • 3个关键步骤打造你的专属云游戏平台:Sunshine游戏串流终极指南
  • 别再傻傻分不清!CANoe仿真中DLC和DataLength到底怎么设?(附CAN-FD映射表避坑)
  • 如何快速掌握PinWin:Windows窗口置顶的终极解决方案
  • Spring Boot项目里用FFmpegFrameGrabber处理视频,这5个实用方法你用过吗?(附完整代码)
  • Git新手必看:彻底搞懂那个烦人的‘LF will be replaced by CRLF’警告(附Windows/Mac/Linux全平台配置)
  • 如何高效下载抖音内容:免费开源工具的完整指南
  • 深度解析BepInEx 6.0:Unity游戏插件框架的技术架构与实战优化
  • 制作5V ARM单片机的下载端口:TXS0108 3.3V到5V
  • 避坑指南:Docker版Duplicati备份到阿里云OSS的完整配置流程
  • 如何快速构建思源黑体TTF:免费商用多语言字体终极指南
  • 终极解决方案:DouyinLiveRecorder PandaTV录制失败的深度解析与实战修复
  • 多表查询---连接查询
  • 给地球做CT:聊聊交错网格有限差分法如何帮我们‘看清’地下结构
  • Java线程(六) 线程池与定时器解析与模拟实现
  • 保姆级教程:在Keil5中为GD32F10x系列新建一个‘干净’的工程模板(从官网下载到编译通过)
  • 【UE】Gerstner Waves 水体模拟 5 :完善水体光学 【高光、粗糙度、折射、斯涅尔窗】
  • 从LINQ到Span<T>:重构字符串处理性能提升42倍,一线架构师压箱底代码全公开,
  • 京东自动抢购终极指南:2025年高效补货监控与多账户下单技术解析
  • 5分钟掌握RF24:嵌入式无线通信新手快速入门完全指南
  • 实战对比:YOLOv11与YOLOv12在金属表面划痕检测中的性能差异
  • 千问 LeetCode 1932.合并多棵二叉搜索树public TreeNode canMerge(List<TreeNode> trees)
  • 别急着降级!用conda和pip搞定numpy版本冲突的保姆级教程
  • 告别BLAST卡顿:用pyani的ANIm方法快速计算微生物基因组ANI(附Conda环境避坑指南)
  • FreeMove终极指南:无痛迁移C盘大文件的完整解决方案
  • 如何用Sunshine在3步内打造你的个人云游戏服务器?
  • WPF窗口生命周期:Loaded和Closing事件到底该放什么代码?一个真实项目案例告诉你
  • 魔兽争霸3终极优化伴侣:WarcraftHelper让你的经典游戏焕发新生
  • 猫抓cat-catch终极指南:浏览器资源嗅探神器让网页资源下载如此简单
  • FPGA新手避坑:用Quartus Prime和IP核搞定RAM读写(附SignalTap调试技巧)