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字体