QT5.5移植全攻略


一、編譯

  1. www.qt.io下載源碼,qt-everywhere-opensource-src-5.5.0
  2. 設置編譯器或者說平台。編譯器是通過xplatform參數指定的,xplatform后面跟的參數實際上就時qtbase/mkspec下的文件夾的名字,這里以linux-arm-gnueabi-g++為模板,拷貝這個文件夾,重命名為arm-linux,然后修改這個文件夾里的qmake.conf,修改后的內容如下:
        #  modifications to g++.conf
        QMAKE_CC                = arm-none-linux-gnueabi-gcc
        QMAKE_CXX               = arm-none-linux-gnueabi-g++
        QMAKE_LINK              = arm-none-linux-gnueabi-g++
        QMAKE_LINK_SHLIB        = arm-none-linux-gnueabi-g++
 
        # modifications to linux.conf
        QMAKE_AR                = arm-none-linux-gnueabi-ar cqs
        QMAKE_OBJCOPY           = arm-none-linux-gnueabi-objcopy
        QMAKE_NM                = arm-none-linux-gnueabi-nm -P
        QMAKE_STRIP             = arm-none-linux-gnueabi-strip

這里修改的就是交叉編譯器的名字,根據個人情況而定,我使用的是友善的編譯器。
3. 配置。

./configure --prefix=/QT5.5 -no-c++11 -no-qml-debug -xplatform arm-linux -qt-freetype -no-opengl -qt-pcre -nomake tests -nomake examples -sysroot /opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/  -v

這里的arm-linux就上上面拷貝的文件夾的名字。這里需要說明的是sysroot,指定了sysroot,編譯器就會到sysroot目錄去找頭文件和庫,否則就會去本機找,網上的移植過程基本都沒設置這個路徑,在qt的官網上可以找到這個說明http://doc.qt.io/qt-5/embedded-linux.html,設置了sysroot之后,這個目錄就是根目錄了,prefix是相對於這個目錄來安裝的,也就是說make install后,qt的庫安裝到了/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/QT5.5目錄下。這個配置可能會提示跟xcb相關的東西,按照提示安裝相關軟件即可。配置之后,qt會提示你加上-qreal float選項,這個是為了跟以前的兼容,這里沒有加,如果加上也沒問題,加上之后會碰到編譯上的一些問題,這個在編譯小節里說明。
4. 編譯。編譯過程中,碰到了幾個問題。
- 跟clock_gettime相關的錯誤。根據提示在源文件所在目錄的Makefile里,找到LIBS加上-lrt
- 因為加了-qreal float引起的編譯問題,如果不加這個選項,就不存在這兩個問題。都在qpdf.cpp中,一個是qBound(0., stops.at(i).first, 1.);其中qBound定義如下:

        Q_DECL_CONSTEXPR inline const T &qBound(const T &min, const T &val, const T &max)
        { return qMax(min, qMin(max, val)); }

qBound的3個參數是一樣的,而stops.at(i).firstqreal類型的,0.1.double類型的,而qreal類型被指定為了float類型,所以就造成了這種編譯問題,可以將stops.at(i).first強制轉換為double類型。
另一個問題也在這里文件里,是<<符號的重載問題,代碼如下:

        QPdf::ByteStream s(&shader);
        s << "<<\n"
        "/ShadingType 2\n"
        "/ColorSpace " << (alpha ? "/DeviceGray\n" : "/DeviceRGB\n") <<
        "/AntiAlias true\n"
        "/Coords [" << start.x() << start.y() << stop.x() << stop.y() << "]\n"
        "/Extend [true true]\n"
        "/Function " << function << "0 R\n"
        ">>\n"
        "endobj\n";
這個地方沒弄明白,`ByteStream`已經重載了`qreal`類型,提示是模糊的重載,有int或者char可以備選,將`start.y()`等強制轉換為`int`后編譯通過。
- 因為配置的時候加了`-no-opengl`選項,在編譯qt3d的時候,需要用到opengl的模塊,編譯不過。因為用不到opengl,所以將qt3d屏蔽掉。找到源碼目錄下的`qt.pro`,屏蔽掉下面兩句話:
        addModule(qt3d, qtdeclarative qtimageformats)
        addModule(qtcanvas3d, qtdeclarative)
用#號將這兩句話注釋掉就可以了。
  1. 安裝。make install

二、在目標板上運行

  1. 先編譯一個qt程序,在qtcreator的管理構建套件里設置好QT Versions編譯器,這里QT Versions要設置成安裝之后QT5.5的qmake路徑,本文里是/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/QT5.5/bin/qmake這個路徑,編譯器就選/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-g++
  2. 將編譯好的QT5.5拷貝到目標板上,這里放到/opt目錄下。
  3. 指定QT的運行平台,這里使用linuxfb,QT有幾種運行平台,在官網上有說明http://doc.qt.io/qt-5/embedded-linux.html,這里使用linuxfb,新建一個文件setqtenv.sh,寫下如下內容:
	export QTDIR=/opt/QT5.5
	export QT_QPA_FONTDIR=$QTDIR/lib/fonts
	export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/
	export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
	export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=800x600:mmSize=800x600:offset=0x0:tty=/dev/tty1
如果不指定`QT_QPA_FONTDIR`QT就會到`/QT5.5`的路徑下去找字體,結果就找不到了。如果不指定`QT_QPA_PLATFORM_PLUGIN_PATH`,應用程序啟動的時候就會提示找不到`linuxfb`,`linuxfb`是QT的一個插件,可以在`/opt/QT5.5/plugins/platforms/`文件夾下看到一個`libqlinuxfb.so`。`LD_LIBRARY_PATH`是指定庫的路徑,這個就不說了,最熟悉的東西了。`QT_QPA_PLATFORM`是指定平台,`fb`指定`framebuffer`的設備地址,具體的參數在官網上有說明參見上面給出的鏈接。然后運行`source setqtenv.sh`添加這些環境變量,至此,界面就可以顯示出來了。

三、支持觸摸屏鍵盤

  1. 首先應用程序要鏈接ts庫,在qtcreator的工程文件里加上LIBS += -lts
  2. 設置觸摸屏相關的環境變量,如下:
    export QT_QPA_GENERIC_PLUGINS=tslib,evdevkeyboard:/dev/input/event0
    export TSLIB_TSDEVICE=/dev/touchscreen-1wire
    export TSLIB_CALIBFILE=/etc/pointercal
    export TSLIB_CONFFILE=/etc/ts.conf
    export TSLIB_PLUGINDIR=/usr/lib/ts
    
    這個QT_QPA_GENERIC_PLUGINS參數在官網上沒找到說明,百度到的,evdevkeyboard是鍵盤插件,冒號后面是鍵盤設備的路徑,在/opt/QT5.5/plugins/generic目錄下可以看到一個libqtslibplugin.so,剩下的就是tslib的配置了,這里使用的是友善觸摸屏,tslib已經移植好了,如果沒有tslib的話,還需要移植tslib。至此,觸摸屏就可以使用了,直接執行./ArmTest就可以了,不需要加其他參數,這里ArmTest是我的測試程序。

行者不止

herbert@ih-tech.net


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM