前言
在一些特定场景下我们可能需要在更高版本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 8月 5 2021 /usr/bin/gcc -> gcc-11
lrwxrwxrwx 1 root root 23 5月 1 2022 /usr/bin/gcc-11 -> x86_64-linux-gnu-gcc-11
-rwxr-xr-x 1 root root 776344 1月 26 2016 /usr/bin/gcc-4.8
lrwxrwxrwx 1 root root 9 8月 5 2021 /usr/bin/gcc-ar -> gcc-ar-11
lrwxrwxrwx 1 root root 26 5月 1 2022 /usr/bin/gcc-ar-11 -> x86_64-linux-gnu-gcc-ar-11
-rwxr-xr-x 1 root root 27032 1月 26 2016 /usr/bin/gcc-ar-4.8
lrwxrwxrwx 1 root root 9 8月 5 2021 /usr/bin/gcc-nm -> gcc-nm-11
lrwxrwxrwx 1 root root 26 5月 1 2022 /usr/bin/gcc-nm-11 -> x86_64-linux-gnu-gcc-nm-11
-rwxr-xr-x 1 root root 27032 1月 26 2016 /usr/bin/gcc-nm-4.8
lrwxrwxrwx 1 root root 13 8月 5 2021 /usr/bin/gcc-ranlib -> gcc-ranlib-11
lrwxrwxrwx 1 root root 30 5月 1 2022 /usr/bin/gcc-ranlib-11 -> x86_64-linux-gnu-gcc-ranlib-11
-rwxr-xr-x 1 root root 27032 1月 26 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.gz
和 tslib-arm.tar.gz
。
按照我个人的习惯,在前面的编译安装中,将qt4-arm和tslib-arm两个文件夹放在了
~/
下,如果登录ubuntu系统的用户不同,绝对路径是不同的。如果你希望将两个文件夹导出,给其他ubuntu系统使用,则这是一个不好的习惯。建议安装目录放在/opt
,会给未来的迁移减少很多麻烦。
本人这里不出问题是因为我的ubuntu用户名是相同的,也就是说,登录后两个系统的~/
的绝对路径是相同的。
2.2 将qt4-arm和tslib-arm导入到新的ubuntu系统中
拷贝qt4-arm.tar.gz
和 tslib-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、解决开发项目中的问题
开发环境搭建完成后,我们新建一个项目,编译时会出现下面的问题:
Qt 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
文件,如图中修改:
这个编译选项并不是放弃使用 C++11 标准,相反它是支持使用 C++11 标准。注意,如果你希望使用更高版本的标准,比如 C++14 或 C++17,只需要将 -std=c++11 替换成 -std=c++14 或 -std=c++17 即可。文章来源:https://www.toymoban.com/news/detail-625955.html
总之,通过将 -std=c++0x
或-std=c++11
选项添加到 QMAKE_CXXFLAGS
中,项目就可以在可支持 C++11 的编译器下编译 C++11 标准的代码了。文章来源地址https://www.toymoban.com/news/detail-625955.html
到了这里,关于Ubuntu64位系统(20.04、22.04)安装32位armQT4开发环境补充说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!