嵌入式linux新手入門手記-準(zhǔn)備qt5.4.1開發(fā)平臺
這個手記寫到這里,am335x的軟件平臺已經(jīng)能夠正常工作了, tslib也已經(jīng)能夠進行正確的觸摸屏校正,自己編寫一個hello world的程序,并交叉編譯后,能夠在am335x上運行,并在超級終端上打印出“hello world”。
本文引用地址:http://2s4d.com/article/201603/287664.htm那么,我們正式開始搭建qt的開發(fā)平臺,我的ubuntu上安裝的是qt5.4.1,并已經(jīng)寫了一個hello world的qt程序,這個程序非常簡單,就是運行后在桌面上顯示一個窗口,窗口中顯示一行文字“hello world”,以及一個按鍵。鼠標(biāo)點擊按鍵退出程序。
ubuntu的qt安裝在/home/XXXX/qt5.4.1目錄下,QtCreator也安裝在相同目錄下,上述的qtdemo程序用QtCreator創(chuàng)建并編譯通過。
為保證和ubuntu平臺的一致性,決定am335x的平臺移植qt5.4.1,首先到qt的官網(wǎng)下載源代碼:http://download.qt.io/official_releases/qt/5.4/5.4.1/single/qt-everywhere-opensource-src-5.4.1.tar.gz。下載可以使用git,也可以用瀏覽器直接打開這個連接。將下載到的壓縮文件解壓縮到./source目錄下,進入到./source目錄下執(zhí)行configure工具生成編譯選項,這里要進行三步工作:
A、設(shè)置交叉編譯的環(huán)境變量。這里需要注意一點,我們在交叉編譯qt5.4.1的工具包時,涉及到2種不同的編譯:第一種是使用ubuntu安裝的GCC和G++編譯qmake工具,這些qmake工具將運行在ubuntu下,用于將后續(xù)自己編寫的qt應(yīng)用程序的源代碼編譯成能夠運行在arm平臺上的目標(biāo)可執(zhí)行程序;第二種是使用arm-linux-gnueabihf編譯器,將qt5.4.1的庫編譯成運行于arm平臺的靜態(tài)庫或者共享庫。
export QT_INSTALL_DIR=/home/XXXX/Qt541arm #設(shè)定編譯好的qt包的安裝路徑
export ARCH=arm #設(shè)定目標(biāo)cpu架構(gòu)
export LIBRARY_PATH=$LIBRARY_PATH:/usr/lib/i386-linux-gnu #為后續(xù)的編譯設(shè)定庫路徑
B、編輯./qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf。mkspecs目錄下有很多的保存.conf文件的目錄,分別對應(yīng)不同的操作系統(tǒng)和交叉編譯平臺,我這里使用linux-arm-gnueabi-g++平臺的配置文件進行交叉編譯。
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental gdb_dwarf_index
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
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=hard
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)
一定要正確設(shè)置QMAKE_INCDIR和QMAKE_LIBDIR,指向正確的編譯后tslib安裝目錄下的include和lib目錄。否則交叉編譯qt5.4.1時會出現(xiàn)找不到頭文件的錯誤。
LIBS的幾個設(shè)置比較重要,-lts是在后續(xù)的交叉編譯應(yīng)用時增加tslib庫。-fPIC用于在編譯時生產(chǎn)位置無關(guān)代碼,-ldl設(shè)置用顯示方法調(diào)用相關(guān)的函數(shù)調(diào)用。
這里額外提一句,交叉編譯器中有一個工具arm-linux-gnueabihf-readelf,非常實用,利用這個工具能夠查看應(yīng)用程序的可執(zhí)行文件的各種信息,例如使用arm-linux-gnueabihf-readelf -d qtdemo,可以查看qtdemo中包含并使用哪一些共享庫。
C、執(zhí)行./configure進行配置:
我編輯了一個sh文件,用于進行配置,這樣方便后續(xù)使用:
#!/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上,所以這個選項指定的qmake.conf中必須將編譯工具指向ubuntu的GCC和G++;
而-xplatform才是指定共享庫等,以及最終的qt應(yīng)用程序的運行平臺的。-xplatform告訴configure使用哪一個交叉編譯工具編譯qt5.4.1開發(fā)包的lib。這個選項指定的qmake.conf中必須將編譯工具指向arm的交叉編譯工具,并設(shè)定相關(guān)的編譯選項。
2、第一次編譯好arm的qt5.4.1開發(fā)包,并將這個qt5.4.1開發(fā)包中的lib和plugins目錄下的內(nèi)容全部拷貝到arm目標(biāo)平臺的nfs文件系統(tǒng)中的/opt/qt541arm目錄中。用這個包的qmake編譯我的qtdemo程序,然后將可執(zhí)行文件拷貝到arm板的nfs文件系統(tǒng)中。正確設(shè)定運行環(huán)境后,運行qtdemo出錯,提示could not
find or load a platform。不能打開顯示平臺,這個錯誤我大約花了2天時間,后來發(fā)現(xiàn)關(guān)鍵在上面的configure時,如果使用了-linuxfb,則必須-no-egl,-no-eglfs,-no-directfb,-no-opengl將其他的顯示平臺關(guān)閉,要不然后續(xù)編譯qtdemo并運行時,就會出現(xiàn)不能找到或者裝載顯示平臺,有效地顯示平臺是:......的錯誤。
當(dāng)然,運行qt應(yīng)用程序之前,需要保證你的qt的運行環(huán)境變量設(shè)置是正確的。使用上述的configure成功配置好編譯環(huán)境后,最后應(yīng)該顯示出qt5.4.1開發(fā)包的包含項,以及編譯后的安裝位置等:
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 gold linker....... 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
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
Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /home/XXXX/Qt541arm
Prior to reconfiguration, make sure you remove any leftovers from the previous build.
上述準(zhǔn)確無誤后,執(zhí)行make -j4編譯qt5.4.1開發(fā)包,這里的-j4是通知編譯器使用4線程編譯,這個數(shù)字根據(jù)當(dāng)前運行平臺的CPU核心數(shù)來設(shè)置。使用多線程編譯能夠極大提高編譯速度。我的i3-2350計算機,編譯一次qt5.4.1開發(fā)包的時間大約是40分鐘左右(不過這個也和需要編譯的qt5.4.1的包含項的多少有關(guān))。
編譯成功后,執(zhí)行make install將qt5.4.1開發(fā)包安裝到configure時-prefix指定的目錄中。然后將安裝目錄中的lib和plugins目錄拷貝到arm的nfs文件系統(tǒng)中的/opt/qt541arm目錄下(當(dāng)然,這個目錄的設(shè)置看個人的興趣愛好:) )。
評論