新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 牛人業(yè)話 > 嵌入式linux新手入門手記-準(zhǔn)備qt5.4.1開發(fā)平臺(tái)

嵌入式linux新手入門手記-準(zhǔn)備qt5.4.1開發(fā)平臺(tái)

作者: 時(shí)間:2016-03-01 來源:網(wǎng)絡(luò) 收藏

  這個(gè)手記寫到這里,的軟件平臺(tái)已經(jīng)能夠正常工作了, tslib也已經(jīng)能夠進(jìn)行正確的觸摸屏校正,自己編寫一個(gè)hello world的程序,并交叉編譯后,能夠在上運(yùn)行,并在超級(jí)終端上打印出“hello world”。

本文引用地址:http://m.butianyuan.cn/article/201603/287664.htm

  那么,我們正式開始搭建qt的開發(fā)平臺(tái),我的ubuntu上安裝的是qt5.4.1,并已經(jīng)寫了一個(gè)hello world的qt程序,這個(gè)程序非常簡(jiǎn)單,就是運(yùn)行后在桌面上顯示一個(gè)窗口,窗口中顯示一行文字“hello world”,以及一個(gè)按鍵。鼠標(biāo)點(diǎn)擊按鍵退出程序。

  ubuntu的qt安裝在/home/XXXX/qt5.4.1目錄下,QtCreator也安裝在相同目錄下,上述的qtdemo程序用QtCreator創(chuàng)建并編譯通過。

  為保證和ubuntu平臺(tái)的一致性,決定的平臺(tái)移植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,也可以用瀏覽器直接打開這個(gè)連接。將下載到的壓縮文件解壓縮到./source目錄下,進(jìn)入到./source目錄下執(zhí)行configure工具生成編譯選項(xiàng),這里要進(jìn)行三步工作:

  A、設(shè)置交叉編譯的環(huán)境變量。這里需要注意一點(diǎn),我們?cè)诮徊婢幾gqt5.4.1的工具包時(shí),涉及到2種不同的編譯:第一種是使用ubuntu安裝的GCC和G++編譯qmake工具,這些qmake工具將運(yùn)行在ubuntu下,用于將后續(xù)自己編寫的qt應(yīng)用程序的源代碼編譯成能夠運(yùn)行在arm平臺(tái)上的目標(biāo)可執(zhí)行程序;第二種是使用arm-linux-gnueabihf編譯器,將qt5.4.1的庫(kù)編譯成運(yùn)行于arm平臺(tái)的靜態(tài)庫(kù)或者共享庫(kù)。

  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è)定庫(kù)路徑

  B、編輯./qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf。mkspecs目錄下有很多的保存.conf文件的目錄,分別對(duì)應(yīng)不同的操作系統(tǒng)和交叉編譯平臺(tái),我這里使用linux-arm-gnueabi-g++平臺(tái)的配置文件進(jìn)行交叉編譯。

  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時(shí)會(huì)出現(xiàn)找不到頭文件的錯(cuò)誤。

  LIBS的幾個(gè)設(shè)置比較重要,-lts是在后續(xù)的交叉編譯應(yīng)用時(shí)增加tslib庫(kù)。-fPIC用于在編譯時(shí)生產(chǎn)位置無關(guān)代碼,-ldl設(shè)置用顯示方法調(diào)用相關(guān)的函數(shù)調(diào)用。

  這里額外提一句,交叉編譯器中有一個(gè)工具arm-linux-gnueabihf-readelf,非常實(shí)用,利用這個(gè)工具能夠查看應(yīng)用程序的可執(zhí)行文件的各種信息,例如使用arm-linux-gnueabihf-readelf -d qtdemo,可以查看qtdemo中包含并使用哪一些共享庫(kù)。

  C、執(zhí)行./configure進(jìn)行配置:

  我編輯了一個(gè)sh文件,用于進(jìn)行配置,這樣方便后續(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 

  這里重點(diǎn)地方是:

  1、用-platform指定交叉編譯的平臺(tái),這個(gè)是錯(cuò)誤的,這個(gè)選項(xiàng)是指定編譯qmake工具的平臺(tái),由于我的qmake是需要運(yùn)行在ubuntu上,所以這個(gè)選項(xiàng)指定的qmake.conf中必須將編譯工具指向ubuntu的GCC和G++;

  而-xplatform才是指定共享庫(kù)等,以及最終的qt應(yīng)用程序的運(yùn)行平臺(tái)的。-xplatform告訴configure使用哪一個(gè)交叉編譯工具編譯qt5.4.1開發(fā)包的lib。這個(gè)選項(xiàng)指定的qmake.conf中必須將編譯工具指向arm的交叉編譯工具,并設(shè)定相關(guān)的編譯選項(xiàng)。

  2、第一次編譯好arm的qt5.4.1開發(fā)包,并將這個(gè)qt5.4.1開發(fā)包中的lib和plugins目錄下的內(nèi)容全部拷貝到arm目標(biāo)平臺(tái)的nfs文件系統(tǒng)中的/opt/qt541arm目錄中。用這個(gè)包的qmake編譯我的qtdemo程序,然后將可執(zhí)行文件拷貝到arm板的nfs文件系統(tǒng)中。正確設(shè)定運(yùn)行環(huán)境后,運(yùn)行qtdemo出錯(cuò),提示could not

  find or load a platform。不能打開顯示平臺(tái),這個(gè)錯(cuò)誤我大約花了2天時(shí)間,后來發(fā)現(xiàn)關(guān)鍵在上面的configure時(shí),如果使用了-linuxfb,則必須-no-egl,-no-eglfs,-no-directfb,-no-opengl將其他的顯示平臺(tái)關(guān)閉,要不然后續(xù)編譯qtdemo并運(yùn)行時(shí),就會(huì)出現(xiàn)不能找到或者裝載顯示平臺(tái),有效地顯示平臺(tái)是:......的錯(cuò)誤。

  當(dāng)然,運(yùn)行qt應(yīng)用程序之前,需要保證你的qt的運(yùn)行環(huán)境變量設(shè)置是正確的。使用上述的configure成功配置好編譯環(huán)境后,最后應(yīng)該顯示出qt5.4.1開發(fā)包的包含項(xiàng),以及編譯后的安裝位置等:

  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線程編譯,這個(gè)數(shù)字根據(jù)當(dāng)前運(yùn)行平臺(tái)的CPU核心數(shù)來設(shè)置。使用多線程編譯能夠極大提高編譯速度。我的i3-2350計(jì)算機(jī),編譯一次qt5.4.1開發(fā)包的時(shí)間大約是40分鐘左右(不過這個(gè)也和需要編譯的qt5.4.1的包含項(xiàng)的多少有關(guān))。

  編譯成功后,執(zhí)行make install將qt5.4.1開發(fā)包安裝到configure時(shí)-prefix指定的目錄中。然后將安裝目錄中的lib和plugins目錄拷貝到arm的nfs文件系統(tǒng)中的/opt/qt541arm目錄下(當(dāng)然,這個(gè)目錄的設(shè)置看個(gè)人的興趣愛好:) )。 



關(guān)鍵詞: 嵌入式linux am335x

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉