這個手記寫到這里,am335x的軟件平臺已經能夠正常工作了, tslib也已經能夠進行正確的觸摸屏校正,自己編寫一個hello world的程序,并交叉編譯后,能夠在am335x上運行,并在超級終端上打印出“hello world”。 那么,我們正式開始搭建qt的開發平臺,我的ubuntu上安裝的是qt5.4.1,并已經寫了一個hello world的qt程序,這個程序非常簡單,就是運行后在桌面上顯示一個窗口,窗口中顯示一行文字“hello world”,以及一個按鍵。鼠標點擊按鍵退出程序。 ubuntu的qt安裝在/home/XXXX/qt5.4.1目錄下,QtCreator也安裝在相同目錄下,上述的qtdemo程序用QtCreator創建并編譯通過。 為保證和ubuntu平臺的一致性,決定am335x的平臺移植qt5.4.1,首先到qt的官網下載源代碼: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目錄下執行configure工具生成編譯選項,這里要進行三步工作: 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++/qmake.conf。mkspecs目錄下有很多的保存.conf文件的目錄,分別對應不同的操作系統和交叉編譯平臺,我這里使用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) 一定要正確設置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上,所以這個選項指定的qmake.conf中必須將編譯工具指向ubuntu的GCC和G++; 而-xplatform才是指定共享庫等,以及最終的qt應用程序的運行平臺的。-xplatform告訴configure使用哪一個交叉編譯工具編譯qt5.4.1開發包的lib。這個選項指定的qmake.conf中必須將編譯工具指向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 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. 上述準確無誤后,執行make -j4編譯qt5.4.1開發包,這里的-j4是通知編譯器使用4線程編譯,這個數字根據當前運行平臺的CPU核心數來設置。使用多線程編譯能夠極大提高編譯速度。我的i3-2350計算機,編譯一次qt5.4.1開發包的時間大約是40分鐘左右(不過這個也和需要編譯的qt5.4.1的包含項的多少有關)。 編譯成功后,執行make install將qt5.4.1開發包安裝到configure時-prefix指定的目錄中。然后將安裝目錄中的lib和plugins目錄拷貝到arm的nfs文件系統中的/opt/qt541arm目錄下(當然,這個目錄的設置看個人的興趣愛好:) )。 |