1. 程式人生 > 其它 >移植32位QT程式到ubuntu18.04

移植32位QT程式到ubuntu18.04

1,作業系統變更

某個程式A,是在ubuntu12.04的虛擬機器上編譯QT4.8的原始碼,並將最終的執行程式執行在ubuntu12.04系統上。

由於出貨要更換主機板,供應商提供的ubuntu作業系統版本確定為18.04。

測試結果表明,原ubuntu12.04的虛擬機器上編譯的執行程式無法直接執行在ubuntu18.04系統上。

2,無法直接執行的原因

ubuntu18.04為64位作業系統,預設採用64位程式碼庫,而ubuntu12.04的虛擬機器為32位系統,虛擬機器上編譯的執行程式為32位,執行程式啟動後需要呼叫的依賴庫均為32位檔案,這些條件在ubuntu18.04上預設均不提供,因此無法直接執行在新的作業系統上。

3,解決思路

第一種思路是,將A程式原始碼在ubuntu18.04機器上重新編譯一遍,如此產生的執行檔案即可在ubuntu18.04系統下執行。其優勢在於,一次性徹底解決問題;其劣勢在於,需要熟悉QT編譯環境配置,特別是QT4的環境較為古老,各種依賴庫在ubuntu18.04下不一定完全支援,程式碼功能也不一定能與32位保持一致,編譯也不一定能成功。

第二種思路是,在ubuntu18.04機器上配置32位程式的執行環境。其優勢在於,當前程式碼無需重新編譯為64位程式,程式行為與以前會大概率保持一致;其劣勢在於,需摸索搭建32位執行環境,需深度測試,需重新編寫安裝手冊。

目前實現的方案採用的是第二種。

4,部署條件

本部署條件針對的是方案二,即要在ubuntu18.04機器上執行32位的A軟體。以下條件供採購或者系統安裝時參考:

1) ubuntu18.04必須是中文系統

2) ubuntu18.04必須是同時支援64位和32位程式執行的系統。具體判斷如下:

a)      在終端輸入 dpkg --print-architecture,返回amd64

b)      在終端輸入 dpkg --print-foreign-architectures,返回i386

5,系統配置步驟

5.1,作業系統安裝32位執行庫

apt update
apt install libc6:i386 libstdc++6:i386
apt install lib32ncurses5 lib32z1

5.2,配置LD_LIBRARY_PATH

在當前使用者的主資料夾中,先開啟“顯示隱藏檔案”選項,然後點選右鍵,用文字編輯器開啟 .bashrc檔案。

在.bashrc檔案中最後新增一行,

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/f/mypro/lib

注意:冒號後面的路徑為 查詢機程式下的lib子目錄路徑,此處僅為示例,應根據實際路徑進行替換。

5.3,新增32位依賴庫

本步驟最為關鍵,也最為繁瑣。需要將A程式執行時依賴的32位庫檔案全部從原作業系統中找出來,然後複製到上述LD_LIBRARY_PATH包含的路徑中。

比如,在沒有複製依賴庫之前,執行程式後會顯示找不到“×.so.×”之類的檔案。

f@f-To-be-filled-by-O-E-M:~/mypro$ ./mypro
./mypro: error while loading shared libraries: libQtWebKit.so.4: cannot open shared object file: No such file or directory

此時,要到原系統中,採用locate或whereis命令,找到該so檔案,複製到ubuntu18.04系統下的LD_LIBRARY_PATH包含的路徑中。

該過程相當費時費力,因為每次執行程式只會提示一個錯誤就停下來。

因此建議使用 ldd 命令一次性將程式執行的依賴庫檔案一次性顯示出來。注意下圖中,凡右側為空的,就是缺少的庫檔案。

5.4,配置QT執行環境

32位的QT程式如果使用了資料庫,無論是mysql還是sqlite3,均需要32位的驅動。因此要在執行程式目錄中新增一個qt.conf檔案,指定程式要找驅動的位置。

[Paths]
Plugins = ./plugins

然後將原系統中的驅動程式拷貝到執行檔案目錄下的plugins子目錄下,如:

cp -R /usr/lib/i386-linux-gnu/qt4/plugins/ plugins

plugins子目錄下的檔案究竟需要哪些,可根據實際需求而定。筆者就是隻保留了imageformats和sqldrivers兩個目錄。

6,總結

經過以上工作,原來的32位QT程式順利地執行在ubuntu18.04系統下了。

一路安裝摸索花了不少時間,但是隻要善於運用網路搜尋,解決起來並不複雜。在此一併感謝所有相關作者。

另外,方案一也是值得考慮的,當然這就是後話了。