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
這裏修改的就是交叉編譯器的名字,根據我的狀況而定,我使用的是友善的編譯器。html
./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
選項,這個是爲了跟之前的兼容,這裏沒有加,若是加上也沒問題,加上以後會碰到編譯上的一些問題,這個在編譯小節裏說明。linux
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).first
是qreal
類型的,0.
和1.
是double
類型的,而qreal
類型被指定爲了float
類型,因此就形成了這種編譯問題,能夠將stops.at(i).first
強制轉換爲double
類型。
另外一個問題也在這裏文件裏,是<<符號的重載問題,代碼以下:c++
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)用#號將這兩句話註釋掉就能夠了。
安裝。make install
canvas
管理構建套件
裏設置好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++
/opt
目錄下。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`添加這些環境變量,至此,界面就能夠顯示出來了。
ts
庫,在qtcreator的工程文件里加上LIBS += -lts
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字體