前言
在一些特定場景下我們可能需要在更高版本ubuntu上(比如Ubuntu20.04、Ubuntu22.04)安裝 Qt 4,維護(hù)和開發(fā)32位armQT4應(yīng)用程序。
對于高版本ubuntu, 官方對Qt 4 已經(jīng)不再提供維護(hù),因此需要解決許多兼容性問題。我們前面博文《Ubuntu64位系統(tǒng)(v18.04)下arm32位版本(Qt4.8.6和tslib1.4)開發(fā)環(huán)境搭建》詳細(xì)介紹了
Ubuntu18.04版本中的配置過程。
在 Ubuntu 20.04和Ubuntu 22.04中,又出現(xiàn)了新的兼容性問題,如果希望在ubuntu中編譯和安裝qt4源碼,則需要降低GCC的版本。我們是通過使用 update-alternatives
命令來切換版本,即在不同版本的 GCC 和 G++ 之間進(jìn)行切換,完成對QT4編譯和安裝。本文以ubuntu22.04為例介紹了降低GCC版本的具體操作步驟。之后的搭建開發(fā)環(huán)境過程與ubuntu18.04中相同,不再贅述。
實(shí)際的開發(fā)環(huán)境搭建過程,其實(shí)不用那么麻煩,我們可以將已經(jīng)編譯安裝完成的QT庫(包括tslib)按照原來的安裝路徑,導(dǎo)入到新的ubuntu系統(tǒng)中,配置相同的交叉工具鏈,再配置當(dāng)前的qtcreator即可。
盡管我們可以使用上面的方法在高版本Ubuntu安裝32位armQT4開發(fā)環(huán)境,但還是建議考慮使用較新的 Qt 版本(如 Qt 5 或 Qt 6),因?yàn)樗鼈兙哂懈玫男阅?、更多的特性和更好的兼容性?/p>
1、降低GCC的版本操作步驟
1.1 設(shè)置新的源
修改/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
然后執(zhí)行:
sudo apt-get update
結(jié)果如下:
命中: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
錯(cuò)誤:3 http://dk.archive.ubuntu.com/ubuntu xenial InRelease
由于沒有公鑰,無法驗(yàn)證下列簽名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
正在讀取軟件包列表... 完成
W: GPG 錯(cuò)誤:http://dk.archive.ubuntu.com/ubuntu xenial InRelease: 由于沒有公鑰,無法驗(yàn)證下列簽名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
E: 倉庫 “http://dk.archive.ubuntu.com/ubuntu xenial InRelease” 沒有數(shù)字簽名。
N: 無法安全地用該源進(jìn)行更新,所以默認(rèn)禁用該源。
N: 參見 apt-secure(8) 手冊以了解倉庫創(chuàng)建和用戶配置方面的細(xì)節(jié)。
出現(xiàn)這個(gè)錯(cuò)誤的原因是缺少 Ubuntu 存儲庫 GPG 密鑰或未添加正確的 GPG 密鑰而導(dǎo)致的。要解決這個(gè)問題,可以按照下面的步驟來導(dǎo)入正確的 GPG 密鑰:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 3B4FE6ACC0B21F32
結(jié)果如下:
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>” 已導(dǎo)入
gpg: 密鑰 40976EAF437D05B5:公鑰 “Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>” 已導(dǎo)入
gpg: 處理的總數(shù):2
gpg: 已導(dǎo)入:2
再次運(yùn)行以下命令來更新軟件包列表:
sudo apt-get update
現(xiàn)在應(yīng)該不會再出現(xiàn)該錯(cuò)誤了。如果仍然遇到問題,請確保您的網(wǎng)絡(luò)連接正常并嘗試使用不同的存儲庫來更新軟件包。
1.2 安裝gcc-4.8 、g+±4.8
執(zhí)行:
sudo apt-get install gcc-4.8 g++-4.8
檢查 GCC 和 g++ 版本:
gcc-4.8 --version
g++-4.8 --version
現(xiàn)在,您應(yīng)該已成功安裝 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優(yōu)先級
使用alternatives工具管理gcc優(yōu)先級,先將兩個(gè)版本的gcc和g++加入到alternativers。
在 Linux 系統(tǒng)中,可能會安裝多個(gè)版本的 GCC(GNU Compiler Collection),每個(gè)版本可能會提供不同的功能或優(yōu)化。alternatives 工具提供了一種簡單的方式來管理這些不同版本的 GCC,并設(shè)置默認(rèn)的版本以供使用。
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位系統(tǒng)(v18.04)下arm32位版本(Qt4.8.6和tslib1.4)開發(fā)環(huán)境搭建》1~6節(jié)的方法,完成開發(fā)環(huán)境搭建。
2、導(dǎo)入已有的QT For Arm庫和tslib
2.1 導(dǎo)出qt4-arm和tslib-arm
我們將按照《Ubuntu64位系統(tǒng)(v18.04)下arm32位版本(Qt4.8.6和tslib1.4)開發(fā)環(huán)境搭建》第5節(jié)的方法完成的QT4庫qt4-arm文件夾
和第4節(jié)完成的tslib-arm文件夾
壓縮。
tar -czvf qt4-arm.tar.gz qt4-arm
tar -czvf tslib-arm.tar.gz tslib-arm
得到兩個(gè)壓縮文件:qt4-arm.tar.gz
和 tslib-arm.tar.gz
。
按照我個(gè)人的習(xí)慣,在前面的編譯安裝中,將qt4-arm和tslib-arm兩個(gè)文件夾放在了
~/
下,如果登錄ubuntu系統(tǒng)的用戶不同,絕對路徑是不同的。如果你希望將兩個(gè)文件夾導(dǎo)出,給其他ubuntu系統(tǒng)使用,則這是一個(gè)不好的習(xí)慣。建議安裝目錄放在/opt
,會給未來的遷移減少很多麻煩。
本人這里不出問題是因?yàn)槲业膗buntu用戶名是相同的,也就是說,登錄后兩個(gè)系統(tǒng)的~/
的絕對路徑是相同的。
2.2 將qt4-arm和tslib-arm導(dǎo)入到新的ubuntu系統(tǒng)中
拷貝qt4-arm.tar.gz
和 tslib-arm.tar.gz
到新的ubuntu系統(tǒng)中,解壓。
tar -zxvf qt4-arm.tar.gz
tar -zxvf tslib-arm.tar.gz
2.3 安裝交叉工具鏈、必要依賴庫、針對x86-32架構(gòu)的zlib庫、配置qtcreator
參見《Ubuntu64位系統(tǒng)(v18.04)下arm32位版本(Qt4.8.6和tslib1.4)開發(fā)環(huán)境搭建》第1節(jié)、第2節(jié)、第3節(jié)、第6節(jié)。
3、解決開發(fā)項(xiàng)目中的問題
開發(fā)環(huán)境搭建完成后,我們新建一個(gè)項(xiàng)目,編譯時(shí)會出現(xiàn)下面的問題:Qt Creator 是一個(gè)集成了編譯器的 IDE 工具,最新版本的 Qt Creator 默認(rèn)使用了 C++11 標(biāo)準(zhǔn)。
上面這個(gè)錯(cuò)誤消息表示在自動生成的代碼中使用了 C++11 新增的關(guān)鍵字 nullptr,但是編譯器并不認(rèn)識它,導(dǎo)致編譯失敗。
解決的方法是為項(xiàng)目追加一個(gè)編譯選項(xiàng):
- GCC 編譯器版本 < 4.7。
QMAKE_CXXFLAGS += -std=c++0x
- GCC 編譯器版本 >= 4.7。
QMAKE_CXXFLAGS += -std=c++11
這個(gè)選項(xiàng)的意義是告訴編譯器將代碼編譯成符合 C++11 標(biāo)準(zhǔn)的代碼。這意味著在編譯時(shí)編譯器會遵循 C++11 標(biāo)準(zhǔn)規(guī)范對代碼進(jìn)行編譯,而且在代碼中可以使用 C++11 新引入的特性。如果不在編譯選項(xiàng)中加上 -std=c++0x或-std=c++11,代碼中使用一些新特性,比如 nullptr、auto、range-based for loops 等,就會出現(xiàn)編譯錯(cuò)誤。
具體操作如下:打開項(xiàng)目中的.pro
文件,如圖中修改:
這個(gè)編譯選項(xiàng)并不是放棄使用 C++11 標(biāo)準(zhǔn),相反它是支持使用 C++11 標(biāo)準(zhǔn)。注意,如果你希望使用更高版本的標(biāo)準(zhǔn),比如 C++14 或 C++17,只需要將 -std=c++11 替換成 -std=c++14 或 -std=c++17 即可。文章來源:http://www.zghlxwxcb.cn/news/detail-625955.html
總之,通過將 -std=c++0x
或-std=c++11
選項(xiàng)添加到 QMAKE_CXXFLAGS
中,項(xiàng)目就可以在可支持 C++11 的編譯器下編譯 C++11 標(biāo)準(zhǔn)的代碼了。文章來源地址http://www.zghlxwxcb.cn/news/detail-625955.html
到了這里,關(guān)于Ubuntu64位系統(tǒng)(20.04、22.04)安裝32位armQT4開發(fā)環(huán)境補(bǔ)充說明的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!