山高疑日近,海阔觉天低

Qt编译

一,输入:鼠标,键盘,触摸屏
1、-tslib和-evdev的区别
官方说明:Inputs on an Embedded Linux Device
configure 可以同时让Qt支持这2种功能,./configure –help的截取,可以看出默认是启动的,虽 但实际可能没有,具体以configure的输出为准

-no-evdev .......... Do not compile support for evdev.
* -evdev ............. Compile support for evdev.
-no-tslib .......... Do not compile support for tslib.
* -tslib ............. Compile support for tslib
//以下是启用这2个功能是的方法:
-tslib  -I /opt/tslib-1.14/include  -L /opt/tslib-1.14/lib  //tslib需要指定库文件
-evdev //直接启用
//以下是配置这2个功能启用/配置环境变量:
# tslib eglfs 显示平台使用这个参数
export QT_QPA_EGLFS_TSLIB = 1
# tslib linuxfb 显示平台使用这个参数
export QT_QPA_FB_TSLIB = 1
# evdev的启用配置
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event1:rotate=180:invertx and inverty

①tslib 单点输入,tslib 是一个第三方库,对电阻屏这类低精度屏而言表现较为优秀,用于输入设备:触摸屏;
②evdev 则是 Qt 自带输入库,支持多点输入,但是对于电阻这类需要校准的屏幕效果不好,适合电容这类屏幕,用于设备:鼠标,键盘,触摸屏(电容),支持环境变量触摸旋转倒置
编译Qt可以支持两种触摸方式,软件运行起来只能采用一种,具体用那种其实看看源码就知道了:

//文件位于qtbase/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp,qlinuxfbscreen.cpp也是在这里
void QLinuxFbIntegration::createInputHandlers()
{
#if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK))
    new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString(), this);
    new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this);
#ifndef QT_NO_TSLIB  //如果configure后qmake支持tslib
    const bool useTslib = qEnvironmentVariableIntValue("QT_QPA_FB_TSLIB");//如果用户用环境变量打开 tslib
    if (useTslib)
        new QTsLibMouseHandler(QLatin1String("TsLib"), QString());
    else
#endif // QT_NO_TSLIB
        new QEvdevTouchManager(QLatin1String("EvdevTouch"), QString() /* spec */, this);
#endif
}

从以上可以看出qt库文件支持tslib以及用环境变量打开tslib功能是tslib使用的充分条件,如果configure的时候发现tslib配置有问题就会禁用tslib功能
2、-tslib 的环境变量配置

export TSLIB_ROOT=/tslib
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export LD_PRELOAD=$TSLIB_ROOT/lib/libts.so
export QT_QPA_FB_TSLIB=1
//Qt设置
export QT_ROOT=/qt5.5.1
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1:edevmouse:/dev/input/event3
export QT_QPA_FONTDIR=/qt5.5.1/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms

这写环境变量ts会使用,QT本身不使用这些变量,Qt使用的QT_QPA_FB_TSLIB=1 启用stlib触摸屏,否侧会使用evdev方式
3、注意点
①其实还有Lib:libinput,但是不怎么使用,libinput=evdev+tslib,启用方式:1.configure时使能libudev and libinput,2.disable the built-in input handlers:QT_QPA_FB_DISABLE_INPUT 3. ./App -plugin libinput
②evdev是直接调用,而libinput与tslib是库调用
③tslib其实是模拟鼠标,而不是真正的触摸处理,只能进行简单的单点触摸
④即使使用tslib,evdev还负责键盘和鼠标事务的处理,参考上面的createInputHandlers()函数,建立的处理句柄:EvdevKeyboardManager,QEvdevMouseManager,QEvdevTouchManager/QTsLibMouseHandler(tslib)
⑤tslib使能看QT_QPA_FB_TSLIB,如果没有使能就会使能evdev,需要看QT_QPA_EVDEV_MOUSE_PARAMETERSQT_QPA_EVDEV_KEYBOARD_PARAMETERS and QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS
二,mkspecs
放qmake需要合适的mkspec文件夹生成Make file,在configure 命令种需要指定-xplatform其实就是指定mkspecs文件夹,mkspecs位于qtbase/mkspecs/下,里面有很多目标平台文件夹,嵌入式选择修改linux-arm-gnueabi-g++,此文件夹下通常有2个文件:qplatformdefs.h,qmake.conf,修改qmake.conf即可:

#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard
QMAKE_CXXFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-gcc
QMAKE_CXX = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-g++
QMAKE_LINK = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-g++
# modifications to linux.conf
QMAKE_AR = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-objcopy
QMAKE_NM = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-nm -P
QMAKE_STRIP = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-strip
load(qt_config)

主要是设置了交叉编译器环境,执行Makefile时用给定的编译环境去编译Qt源文件,注意host平台用的一些可执行程序用的是g++编译器,qtbase/src/tools/下所有的源码都是编译成x86格式
ls -alh qtbase/src/tools/:

lee@MRZ:~/project/qt-everywhere-opensource-src-5.5.1$ ls -alh qtbase/src/tools/
总用量 44K
drwxrwxr-x 11 lee lee 4.0K 10月  9  2015 .
drwxrwxr-x 22 lee lee 4.0K 9月  17 13:46 ..
drwxrwxr-x  4 lee lee 4.0K 9月  17 13:47 bootstrap
drwxrwxr-x  2 lee lee 4.0K 10月 13  2015 bootstrap-dbus
drwxrwxr-x  5 lee lee 4.0K 9月  17 13:47 moc
drwxrwxr-x  2 lee lee 4.0K 10月 13  2015 qdbuscpp2xml
drwxrwxr-x  2 lee lee 4.0K 10月 13  2015 qdbusxml2cpp
drwxrwxr-x  6 lee lee 4.0K 9月  17 13:47 qdoc
drwxrwxr-x  6 lee lee 4.0K 9月  17 13:47 qlalr
drwxrwxr-x  4 lee lee 4.0K 9月  17 13:47 rcc
drwxrwxr-x  5 lee lee 4.0K 9月  17 13:47 uic

三,Qt Configure
官方文档
脚本
首先必须明白configure 都干了什么,congfiure 主要完成这件事情:
①是生成x86格式的qmake,这个qmake主要用来根据*.pro生成Makefile
②执行configure前需要检查系统的环境变量是否干净
③生成根目录下的Makefile:/qtbase/bin/qmake -o Makefile qt.pro
④检查configure选项是否支持,如果configure的时候使能tslib,但有没有指定tslib 头文件或者库文件目录,就会禁用tslib
最终需要检查configure后生成的统计文件,configure 常见选项:

-opensource -confirm-license -release -shared \\
-strip \\   //Strip binaries and libraries of unneeded symbols when installing
-xplatform linux-arm-gnueabi-g++ \\  //目标mkspecs,这个是一个目录在qtbase/mkspecs/下有qmake,初始化编译环境
-optimized-qmake \\
-no-rpath \\  //不使用lib安装路径作为链接路径
-pch \\  //Use precompiled header support,通常大型项目有许多头文件,它们包含在每个源文件中。编译器一遍又一遍地处理这些头文件所花费的时间几乎占了构建项目所需的全部时间。为了使构建更快,GCC允许预编译头文件
#-skip 可以选择不编译某些Qt模块,其实就是是Qt*.so库.在根目录 tree -dL 1 ./  可以看到文件夹目录,如果不想编译某些模块就加进去
#-skip qtbase  \\        //Qt核心:QtANGLE QtConcurrent QtCore QtDBus QtGui QtNetwork QtOpenGL QtOpenGLExtensions QtPlatformHeaders QtPlatformSupport QtPrintSupport QtSql QtWidgets QtXml QtZlib
-skip qt3d \\            //3D模块 :Qt3DCollision Qt3DCore Qt3DInput Qt3DLogic Qt3DQuick Qt3DQuickRenderer Qt3DRenderer
-skip qtactiveqt \\      //ActiveQt
-skip qtandroidextras \\ //安卓相关 :QtAndroidExtras
-skip qtcanvas3d \\      //3D模块:QtCanvas3D
-skip qtconnectivity \\  //蓝牙NFC:QtBluetooth QtNfc
-skip qtdoc \\
-skip qtlocation \\      //位置定位:QtPositioning QtLocation
-skip qtmacextras \\     //MAC系统:QtMacExtras
#-skip qtmultimedia \\   //多媒体:QtMultimediaWidgets QtMultimediaQuick_p QtMultimedia
-skip qtscript \\        //脚本:QtScriptTools QtScript
#-skip qtquick1 \\       //QtDeclarative
-skip qtsensors \\       //QtSensors
-skip qtsvg \\           //QtSvg
-skip qttools \\         //工具:QtCLucene QtDesigner QtDesignerComponents QtHelp QtUiPlugin QtUiTools
-skip qttranslations \\  
-skip qtwayland \\       //QtCompositor QtWaylandClient
-skip qtwebchannel \\    //QtWebChannel
-skip qtwebengine \\     //QtWebEngineWidgets QtWebEngine
-skip qtwinextras \\     //windows:QtWinExtras
#-skip qtwebkit \\        //QtWebKitWidgets QtWebKit
-skip qtx11extras \\     //QtX11Extras
-skip qtxmlpatterns \\   //QtXmlPatterns
-make libs \\            //指定编译的部分,这个根skip区别是skip针对Qt模块,就是Qt*.so,make 是指定部分
-nomake tools -nomake tests -nomake examples \\
-gui \\                 //编译QTGui.so
-widgets \\             //编译QtWidgets
-no-dbus \\       //进程间通信
-no-opengl \\
-linuxfb \\
-no-iconv \\      //编码转换
-no-glib \\       //glib库一般用不上
-qt-pcre \\       //Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式)是一个用C语言编写的正则表达式函数
-qt-zlib \\       //压缩相关
-no-openssl \\
-qt-freetype \\
-qt-harfbuzz \\
-no-xcb \\
-qt-libpng \\
-qt-libjpeg \\
-qt-sql-sqlite \\
-no-tslib \\

四,打补丁
1、patch文件生成
diff 命令可以生成patch文件,具体使用方式:
diff -Naur old new >filname.patch
old与new 可以是具体文件也可以是文件夹
2、patch文件使用
可以加-d 指定qt源文件路径
patch -p0 <qt551LinuxfbRotate.patch
3、常用patch补丁
Qt5.5.1 支持旋转补丁
Qt5.4.1 支持旋转补丁
Qt5.12.9 支持旋转补丁

赞(1) 打赏
未经允许不得转载:Mr.Zhang » Qt编译

你的打赏是我的动力

登录

找回密码

注册