嵌⼊式linux+qt经典书,嵌⼊式linux新⼿⼊门⼿记-准备qt5.4.1开
发平台
那么,我们正式开始搭建qt的开发平台,我的ubuntu上安装的是qt5.4.1,并已经写了⼀个hello world的qt程序,这个程序⾮常简单,就是运⾏后在桌⾯上显⽰⼀个窗⼝,窗⼝中显⽰⼀⾏⽂字“hello world”,以及⼀个按键。⿏标点击按键退出程序。
ubuntu的qt安装在/home/XXXX/qt5.4.1⽬录下,QtCreator也安装在相同⽬录下,上述的qtdemo程序⽤QtCreator创建并编译通过。
A、设置交叉编译的环境变量。这⾥需要注意⼀点,我们在交叉编译qt5.4.1的⼯具包时,涉及到2种不同的编译:第⼀种是使⽤ubuntu安装的GCC和G++编译qmake⼯具,这些qmake⼯具将运⾏在ubuntu下,⽤于将后续⾃⼰编写的qt应⽤程序的源代码编译成能够运⾏在arm平台上的⽬标可执⾏程序;第⼆种是使⽤arm-linux-gnueabihf编译器,将qt5.4.1的库编译成运⾏于arm平台的静态库或者共享库。
export QT_INSTALL_DIR=/home/XXXX/Qt541arm #设定编译好的qt包的安装路径
export ARCH=arm #设定⽬标cpu架构
export LIBRARY_PATH=$LIBRARY_PATH:/usr/lib/i386-linux-gnu #为后续的编译设定库路径
B、编辑./qtbase/mkspecs/linux-arm-gnueabi-g++/f。mkspecs⽬录下有很多的保存.conf⽂件的⽬录,分别对应不同的操作系统和交叉编译平台,我这⾥使⽤linux-arm-gnueabi-g++平台的配置⽂件进⾏交叉编译。
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental gdb_dwarf_index
QMAKE_INCREMENTAL_STYLE = sublib
include(../f)
include(../f)
include(../common/g++-f)
QT_QPA_DEFAULT_PLATFORM=linuxfb
COMPILER_FLAGS += -o3 -march=armv7-a -mtune=cortex-a8 -mfpu=vfpv3 -mfloat-abi=hard
QMAKE_CFLAGS_RELEASE += -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=vfpv3 -mfloat-abi=h
ard
QMAKE_CXXFLAGS_RELEASE += -O3 -march=armv7-a -mtune=cortex-a8 -mfpu=vfpv3 -mfloat-abi=hard
QT_INSTALL_DIR = /home/XXXX/Qt541arm
QMAKE_INCDIR += /usr/tslib/include
QMAKE_LIBDIR += /usr/tslib/lib
LIBS += -ldl -fPIC -lts
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++
QMAKE_AR = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
QMAKE_NM = arm-linux-gnueabihf-nm -P
QMAKE_STRIP = arm-linux-gnueabihf-strip
load(qt_config)
⼀定要正确设置QMAKE_INCDIR和QMAKE_LIBDIR,指向正确的编译后tslib安装⽬录下的include和lib⽬录。否则交叉编译qt5.4.1时会出现不到头⽂件的错误。
LIBS的⼏个设置⽐较重要,-lts是在后续的交叉编译应⽤时增加tslib库。-fPIC⽤于在编译时⽣产位置⽆关代码,-ldl设置⽤显⽰⽅法调⽤相关的函数调⽤。
这⾥额外提⼀句,交叉编译器中有⼀个⼯具arm-linux-gnueabihf-readelf,⾮常实⽤,利⽤这个⼯具能够查看应⽤程序的可执⾏⽂件的各种信息,例如使⽤arm-linux-gnueabihf-readelf -d qtdemo,可以查看qtdemo中包含并使⽤哪⼀些共享库。
C、执⾏./configure进⾏配置:
我编辑了⼀个sh⽂件,⽤于进⾏配置,这样⽅便后续使⽤:
#!/bin/sh
./configure -v \
-release \
-opensource \
-confirm-license \
-make libs \
-optimized-qmake \
-platform linux-g++ \
-xplatform linux-arm-gnueabi-g++ \
-prefix /home/XXXX/Qt541arm \
-pch \
-
qt-libjpeg \
-qt-libpng \
-qt-zlib \
-qt-sql-sqlite \
-tslib \
-qreal float \
-linuxfb \
-no-evdev \
-no-egl \
-no-eglfs \
-no-opengl \
-
no-directfb \
-no-sql-db2 \
-no-sql-ibase \
-no-sql-mysql \
-no-sql-oci \
-no-sql-odbc \
-no-sql-psql \
-no-sql-sqlite2 \
-no-sql-tds \
-no-xcb \
-no-xcb-xlib \
-
no-icu \
-no-c++11 \
-no-cups \
-no-iconv \
-no-android-style-assets \
-nomake examples \
-nomake tests \
这⾥重点地⽅是:
1、⽤-platform指定交叉编译的平台,这个是错误的,这个选项是指定编译qmake⼯具的平台,由于我的qmake是需要运⾏在ubuntu 上,所以这个选项指定的f中必须将编译⼯具指向ubuntu的GCC和G++;
⽽-xplatform才是指定共享库等,以及最终的qt应⽤程序的运⾏平台的。-xplatform告诉configure使⽤
哪⼀个交叉编译⼯具编译qt5.4.1开发包的lib。这个选项指定的f中必须将编译⼯具指向arm的交叉编译⼯具,并设定相关的编译选项。
2、第⼀次编译好arm的qt5.4.1开发包,并将这个qt5.4.1开发包中的lib和plugins⽬录下的内容全部拷贝到arm⽬标平台的nfs⽂件系统中的/opt/qt541arm⽬录中。⽤这个包的qmake编译我的qtdemo程序,然后将可执⾏⽂件拷贝到arm板的nfs⽂件系统中。正确设定运⾏环境后,运⾏qtdemo出错,提⽰could not
find or load a platform。不能打开显⽰平台,这个错误我⼤约花了2天时间,后来发现关键在上⾯的configure时,如果使⽤了-linuxfb,则必须-no-egl,-no-eglfs,-no-directfb,-no-opengl将其他的显⽰平台关闭,要不然后续编译qtdemo并运⾏时,就会出现不能到或者装载显⽰平台,有效地显⽰平台是:......的错误。
当然,运⾏qt应⽤程序之前,需要保证你的qt的运⾏环境变量设置是正确的。使⽤上述的configure成功配置好编译环境后,最后应该显⽰出qt5.4.1开发包的包含项,以及编译后的安装位置等:
Building on: linux-g++ (i386, CPU features: none detected)
Building for: linux-arm-gnueabi-g++ (arm, CPU features: none detected)
qmake vars .......... styles += mac fusion
windows DEFINES += QT_NO_MTDEV DEFINES += QT_NO_EVDEV sql-drivers = sqlite sql-plugins = qmake switches .........
Build options:
Configuration .......... accessibility alsa audio-backend clock-gettime
clock-monotonic compile_examples concurrent cross_compile dbus eventfd freetype
full-config getaddrinfo getifaddrs harfbuzz inotify ipv6ifname large-config
largefile libudev linuxfb medium-config minimal-config mremap nis no-pkg-config openssl pcre png
posix_fallocate precompile_header qpa qpa reduce_exports release rpath shared
small-config tslib zlib
Build parts ............ libs
Mode ................... release
Using C++11 ............ no
Using no
Using PCH .............. yes
Target compiler supports:
Neon ................. no
Qt modules and options:
Qt D-Bus ............... yes (loading dbus-1 at runtime) Qt Concurrent .......... yes
Qt GUI ................. yes
Qt Widgets ............. yes
Large File ............. yes
QML debugging .......... yes
Use system proxies ..... no
Support enabled for:
Accessibility .......... yes
ALSA ................... yes
CUPS ................... no
Evdev .................. no
FontConfig ............. no
FreeType ............... yes (bundled copy)
Glib ................... no
GTK theme .............. no
HarfBuzz ............... yes (bundled copy)
Iconv .................. no
ICU .................... no
Image formats:
GIF .................. yes (plugin, using bundled copy) JPEG ................. yes (plugin, using bundled copy) PNG .................. yes (in QtGui, using bundled copy) journald ............... no
mtdev .................. no
Networking:
getaddrinfo .......... yes
getifaddrs ........... yes
ubuntu使用入门教程IPv6 ifname .......... yes
OpenSSL .............. yes (loading libraries at run-time)
NIS .................... yes
OpenGL / OpenVG:
EGL .................. no
OpenGL ............... no
OpenVG ............... no
PCRE ................... yes (bundled copy)
pkg-config ............. no
PulseAudio ............. no
QPA backends:
DirectFB ............. no
EGLFS ................ no
KMS .................. no
LinuxFB .............. yes
XCB .................. no
Session management ..... yes
SQL drivers:
DB2 .................. no
InterBase ............ no
MySQL ................ no
OCI .................. no
ODBC ................. no
PostgreSQL ........... no
SQLite 2 ............. no
SQLite ............... qt-qt
TDS .................. no
udev ................... yes
xkbcommon .............. no
zlib ................... yes (bundled copy)
Info: creating super cache file /home/XXX/temp/source/.qmake.super
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论