1. 程式人生 > >Qt-4.8.7交叉編譯平臺的搭建、移植詳解

Qt-4.8.7交叉編譯平臺的搭建、移植詳解

        由於專案需要,需要在國產系統(銀河麒麟系統--飛騰cpu-arm64)上用firefox載入一個npapi外掛,而firefox是一個32位的瀏覽器,而銀河麒麟系統不支援編譯32位的動態庫,因此只能用交叉編譯環境來編譯arm32的動態庫。

        整了一個星期的Qt移植,今天終於弄出來了。網上的移植教程很多,可沒有一篇能夠完整編譯出自己需要的版本,因此記錄一下學習過程以及編譯過程中所遇到的問題。   

        首先理解一下QT相關知識:Qt平臺在Linux 下分為兩個平臺:qt-x11和qt-embeddedqt-x11是使用X11的圖形庫,比較大,主要是使用在PC機上; 而qt-embedded

使用的是qt專門為嵌入式系統設計的圖形庫,其庫檔案較小,主要用於嵌入式板上。而我主要編譯的是qt-x11版本。

  • 一、環境準備:

        我的機器環境是:ubuntu 16-04 LTS版本,如圖:


  1.  準備交叉編譯環境

         首先安裝交叉編譯器,在銀河麒麟系統下面,檢視系統的檔案目錄,發現使用的交叉編譯器為:arm-linux-gnueabihf(關於交叉編譯器的相關資訊詳見參考資料1、2)。因此在ubuntu環境下安裝arm-linux-gnueabihf。在終端中輸入arm-linux-gnueabihf-g++,提示如下:


        使用安裝命令:

sudo apt-get install g++-arm-linux-gnueabihf

        使用一下命令檢視是否安裝成功:

arm-linux-gnueabihf-g++ --version

        顯示結果如下表示安裝成功。


         2. 準備qt編譯環境

               

        提前安裝各種軟體及依賴庫

sudo apt-get install libx11-dev libxext-dev libxtst-dev zlib1g-dev lib32ncurses5 lib32z1 

二、交叉編譯QT4.8.7

        將下載的qt-everywhere-opensource-src-4.8.7.tar.gz執行如下命令解壓:

tar -xzvf qt-everywhere-opensource-src-4.8.7.tar.gz
        進入qt原始碼目錄:
cd ./qt-everywhere-opensource-src-4.8.7

        在/mkspecs/qws/目錄下,新建一個資料夾,命名為linux-arm-gnueabihf-g++,然後複製其他資料夾下的qmake.conf以及qplatformdefs.h檔案到當前目錄,並修改qmake.conf,修改後的內容如下:

#
# qmake configuration for building with arm-none-linux-gnueabihf-g++
#

include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)

# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_STRIP             = arm-linux-gnueabihf-strip

load(qt_config)

        進入到qt原始碼主目錄,執行編譯命令:

./configure -opensource -confirm-license  -xplatform qws/linux-arm-gnueabihf-g++  -shared -no-qt3support -no-phonon -no-phonon-backend -qt-zlib -no-gif -no-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -no-glib -no-dbus -no-rpath -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -no-audio-backend -no-svg -no-javascript-jit -no-script -no-scripttools -no-multimedia -no-openssl -nomake tools -nomake examples -nomake demos

        執行完上面命令後,執行make命令,編譯過程中,會遇到第一個問題,問題截圖如下:


        這是因為在編譯arm下的動態庫,而arm找不到,因此只需要在編譯時定義一個巨集(DQT_ARCH_ARM)即可。即重新執行下面的命令:

./configure -opensource -confirm-license  -xplatform qws/linux-arm-gnueabihf-g++  -shared -no-qt3support -no-phonon -no-phonon-backend -qt-zlib -no-gif -no-libtiff -no-qvfb -qt-libjpeg -no-nis -no-opengl -no-cups -no-webkit -no-glib -no-dbus -no-rpath -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -no-audio-backend -no-svg -no-javascript-jit -no-script -no-scripttools -no-multimedia -no-openssl -nomake tools -nomake examples -nomake demos -DQT_ARCH_ARM

        執行完後,,繼續執行make命令,會遇到下面這個問題:


        出現這個問題的原因是沒有引用到X11的一系列動態庫檔案,因此需要在/src/gui/Makefile下新增動態庫所在的位置(使用-L)以及需要的動態庫名稱(-l):

-L/home/luyp/workspace/arm-linux-gnueabihf  -lX11 -lXext -lXrender -lICE -lSM -lfreetype -lfontconfig 
        繼續執行make命令,然後編譯成功後,執行make install命令後,將所有的標頭檔案、執行檔案以及庫檔案放入了/usr/local/Trolltech/Qt-4.8.7/下。

參考資料

2、What's the difference between arm-linux- / arm-none-linux-gnueabi- / arm-fsl-linux-gnueabi- in LTIB?https://community.freescale.com/thread/313490