Ubuntu64位系统(20.04、22.04)安装32位armQT4开发环境补充说明


前言

在一些特定场景下我们可能需要在更高版本ubuntu上(比如Ubuntu20.04、Ubuntu22.04)安装 Qt 4,维护和开发32位armQT4应用程序。
对于高版本ubuntu, 官方对Qt 4 已经不再提供维护,因此需要解决许多兼容性问题。我们前面博文《Ubuntu64位系统(v18.04)下arm32位版本(Qt4.8.6和tslib1.4)开发环境搭建》详细介绍了
Ubuntu18.04版本中的配置过程。
在 Ubuntu 20.04和Ubuntu 22.04中,又出现了新的兼容性问题,如果希望在ubuntu中编译和安装qt4源码,则需要降低GCC的版本。我们是通过使用 update-alternatives 命令来切换版本,即在不同版本的 GCC 和 G++ 之间进行切换,完成对QT4编译和安装。本文以ubuntu22.04为例介绍了降低GCC版本的具体操作步骤。之后的搭建开发环境过程与ubuntu18.04中相同,不再赘述。
实际的开发环境搭建过程,其实不用那么麻烦,我们可以将已经编译安装完成的QT库(包括tslib)按照原来的安装路径,导入到新的ubuntu系统中,配置相同的交叉工具链,再配置当前的qtcreator即可。

尽管我们可以使用上面的方法在高版本Ubuntu安装32位armQT4开发环境,但还是建议考虑使用较新的 Qt 版本(如 Qt 5 或 Qt 6),因为它们具有更好的性能、更多的特性和更好的兼容性。


1、降低GCC的版本操作步骤

1.1 设置新的源

修改/etc/apt/sources.list文件

sudo  vim  /etc/apt/sources.list

在末尾增加如下配置:

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

然后执行:

sudo apt-get update

结果如下:

命中:1 http://cn.archive.ubuntu.com/ubuntu jammy InRelease
命中:2 http://cn.archive.ubuntu.com/ubuntu jammy-updates InRelease            
获取:3 http://dk.archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
命中:4 http://security.ubuntu.com/ubuntu jammy-security InRelease           
命中:5 http://cn.archive.ubuntu.com/ubuntu jammy-backports InRelease        
错误:3 http://dk.archive.ubuntu.com/ubuntu xenial InRelease
  由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
正在读取软件包列表... 完成
W: GPG 错误:http://dk.archive.ubuntu.com/ubuntu xenial InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
E: 仓库 “http://dk.archive.ubuntu.com/ubuntu xenial InRelease” 没有数字签名。
N: 无法安全地用该源进行更新,所以默认禁用该源。
N: 参见 apt-secure(8) 手册以了解仓库创建和用户配置方面的细节。

出现这个错误的原因是缺少 Ubuntu 存储库 GPG 密钥或未添加正确的 GPG 密钥而导致的。要解决这个问题,可以按照下面的步骤来导入正确的 GPG 密钥:

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

结果如下:

Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
Executing: /tmp/apt-key-gpghome.yzoYZONxEt/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 3B4FE6ACC0B21F32
gpg: 密钥 3B4FE6ACC0B21F32:公钥 “Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>” 已导入
gpg: 密钥 40976EAF437D05B5:公钥 “Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>” 已导入
gpg: 处理的总数:2
gpg:               已导入:2

再次运行以下命令来更新软件包列表:

sudo apt-get update

现在应该不会再出现该错误了。如果仍然遇到问题,请确保您的网络连接正常并尝试使用不同的存储库来更新软件包。

1.2 安装gcc-4.8 、g+±4.8

执行:

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

检查 GCC 和 g++ 版本:

gcc-4.8 --version
g++-4.8 --version

现在,您应该已成功安装 GCC 4.8 和 g++ 4.8。

查看gcc安装情况:

ls /usr/bin/gcc* -l
lrwxrwxrwx 1 root root      6  85  2021 /usr/bin/gcc -> gcc-11
lrwxrwxrwx 1 root root     23  51  2022 /usr/bin/gcc-11 -> x86_64-linux-gnu-gcc-11
-rwxr-xr-x 1 root root 776344  126  2016 /usr/bin/gcc-4.8
lrwxrwxrwx 1 root root      9  85  2021 /usr/bin/gcc-ar -> gcc-ar-11
lrwxrwxrwx 1 root root     26  51  2022 /usr/bin/gcc-ar-11 -> x86_64-linux-gnu-gcc-ar-11
-rwxr-xr-x 1 root root  27032  126  2016 /usr/bin/gcc-ar-4.8
lrwxrwxrwx 1 root root      9  85  2021 /usr/bin/gcc-nm -> gcc-nm-11
lrwxrwxrwx 1 root root     26  51  2022 /usr/bin/gcc-nm-11 -> x86_64-linux-gnu-gcc-nm-11
-rwxr-xr-x 1 root root  27032  126  2016 /usr/bin/gcc-nm-4.8
lrwxrwxrwx 1 root root     13  85  2021 /usr/bin/gcc-ranlib -> gcc-ranlib-11
lrwxrwxrwx 1 root root     30  51  2022 /usr/bin/gcc-ranlib-11 -> x86_64-linux-gnu-gcc-ranlib-11
-rwxr-xr-x 1 root root  27032  126  2016 /usr/bin/gcc-ranlib-4.8

1.3 使用alternatives工具管理gcc优先级

使用alternatives工具管理gcc优先级,先将两个版本的gcc和g++加入到alternativers。

在 Linux 系统中,可能会安装多个版本的 GCC(GNU Compiler Collection),每个版本可能会提供不同的功能或优化。alternatives 工具提供了一种简单的方式来管理这些不同版本的 GCC,并设置默认的版本以供使用。

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 90
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 90

1.4 安装交叉工具链、编译安装qt4.8.6和tslib1.4、安装配置qtcreator

按照前面的博文:《Ubuntu64位系统(v18.04)下arm32位版本(Qt4.8.6和tslib1.4)开发环境搭建》1~6节的方法,完成开发环境搭建。

2、导入已有的QT For Arm库和tslib

2.1 导出qt4-arm和tslib-arm

我们将按照《Ubuntu64位系统(v18.04)下arm32位版本(Qt4.8.6和tslib1.4)开发环境搭建》第5节的方法完成的QT4库qt4-arm文件夹和第4节完成的tslib-arm文件夹压缩。

 tar -czvf qt4-arm.tar.gz qt4-arm
 tar -czvf tslib-arm.tar.gz tslib-arm

得到两个压缩文件:qt4-arm.tar.gztslib-arm.tar.gz

按照我个人的习惯,在前面的编译安装中,将qt4-arm和tslib-arm两个文件夹放在了~/下,如果登录ubuntu系统的用户不同,绝对路径是不同的。如果你希望将两个文件夹导出,给其他ubuntu系统使用,则这是一个不好的习惯。建议安装目录放在/opt,会给未来的迁移减少很多麻烦。
本人这里不出问题是因为我的ubuntu用户名是相同的,也就是说,登录后两个系统的~/的绝对路径是相同的。

2.2 将qt4-arm和tslib-arm导入到新的ubuntu系统中

拷贝qt4-arm.tar.gztslib-arm.tar.gz到新的ubuntu系统中,解压。

tar -zxvf qt4-arm.tar.gz
tar -zxvf tslib-arm.tar.gz

2.3 安装交叉工具链、必要依赖库、针对x86-32架构的zlib库、配置qtcreator

参见《Ubuntu64位系统(v18.04)下arm32位版本(Qt4.8.6和tslib1.4)开发环境搭建》第1节、第2节、第3节、第6节。

3、解决开发项目中的问题

开发环境搭建完成后,我们新建一个项目,编译时会出现下面的问题:
图1Qt Creator 是一个集成了编译器的 IDE 工具,最新版本的 Qt Creator 默认使用了 C++11 标准。
上面这个错误消息表示在自动生成的代码中使用了 C++11 新增的关键字 nullptr,但是编译器并不认识它,导致编译失败。

解决的方法是为项目追加一个编译选项:

  • GCC 编译器版本 < 4.7。
QMAKE_CXXFLAGS += -std=c++0x
  • GCC 编译器版本 >= 4.7。
QMAKE_CXXFLAGS += -std=c++11

这个选项的意义是告诉编译器将代码编译成符合 C++11 标准的代码。这意味着在编译时编译器会遵循 C++11 标准规范对代码进行编译,而且在代码中可以使用 C++11 新引入的特性。如果不在编译选项中加上 -std=c++0x或-std=c++11,代码中使用一些新特性,比如 nullptr、auto、range-based for loops 等,就会出现编译错误。

具体操作如下:打开项目中的.pro文件,如图中修改:
图2
这个编译选项并不是放弃使用 C++11 标准,相反它是支持使用 C++11 标准。注意,如果你希望使用更高版本的标准,比如 C++14 或 C++17,只需要将 -std=c++11 替换成 -std=c++14 或 -std=c++17 即可。

总之,通过将 -std=c++0x-std=c++11 选项添加到 QMAKE_CXXFLAGS 中,项目就可以在可支持 C++11 的编译器下编译 C++11 标准的代码了。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值