嵌入式QT移植的實現(xiàn)
一、軟件包、環(huán)境說明
1.1 軟件包
1.1.1 通用交叉編譯工具鏈
gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
1.1.2 qt源碼
qt-everywhere-src-5.12.9.tar.xz
下載地址:https://download.qt.io/archive/qt/5.12/5.12.9/single/
1.1.3 tslib(觸摸屏校準(zhǔn)插件)
tslib-1.21.tar.bz2
下載git地址:https://github.com/libts/tslib
1.1.4 fonts字體庫(qt支持中文)
DroidSansFallback.ttf
1.2 環(huán)境說明
1、Ubuntu版本:16.04
2、Qt應(yīng)用程序版本:Q5.14.2
3、開發(fā)板:正點原子阿爾法開發(fā)板(I.MX6ULL)
4、觸摸屏:正點原子RGB觸摸屏4.3寸、800*480
二、環(huán)境搭建
2.1 ubuntu下安裝通用的交叉編譯器
1、將交叉編譯工具包(gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz)拷貝到ubuntu的/usr/local/arm/目錄下。
2、在當(dāng)前目錄解壓交叉編譯工具包
3、解壓完成后,將路徑加入到環(huán)境變量中/etc/profile文件
sudo vim /etc/profile
在末尾加入:
4、重新使能環(huán)境變量
source /etc/profile
5、查看交叉編譯工具是否添加成功
arm-linux-gnueabihf-gcc -v (tab鍵可補全)
出現(xiàn)這個則說明通用的交叉編譯工具鏈安裝成功,版本為4.9.4
沒有的話,檢查/etc/profile里面添加的文件路徑是否正確
至此,通用的交叉編譯工具鏈安裝完成
2.2 ubuntu下編譯Qt源碼
2.2.1 編譯這個有什么用呢?
windows下面開發(fā)qt是不用編譯,因為在你qt軟件的安裝目錄下已經(jīng)有這個lib庫文件,直接運行會自動連接到去qt安裝目錄下找?guī)煳募?,如qpushbutton.h、qcombox.h等文件,在qt安裝目錄下E:\qt\Qt5.12.9\5.12.9\Src\qtbase\include\QtWidgets里面。
qt應(yīng)用程序移植到開發(fā)板上面運行,也需要連接到lib庫,編譯qt源碼就是處理lib庫,方便qt在開發(fā)板上運行不報xx文件找不到的錯誤。
2.2.2 拷貝qt源碼到ubuntu
拷貝源碼到你Ubuntu指定的目錄下面,解壓。(后面這個路徑需要用到)
2.2.3 修改qmake.conf文件
主要配置你編譯qt源碼使用的交叉工具鏈(上面裝的那個工具鏈)和一些配置信息。
進(jìn)入到qt源碼目錄:
編輯 qtbase/mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf文件
添加紅色框里面的內(nèi)容:
/*硬件配置信息、armv7-a、估計不同arm內(nèi)核這里要改,具體沒研究過*/ 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 /*編譯qt源碼使用的交叉編譯工具鏈*/ arm-linux-gnueabihf
修改之后保存。
2.2.4 修改配置編譯選項
在qt源碼目錄下有一個configure的腳本,使用對qt源碼進(jìn)行配置的??梢愿鶕?jù)自己的需求裁剪一些不必要的功能,編譯之后lib庫文件大小當(dāng)然也會相應(yīng)的縮小。
終端輸入 ./configure -help 可以查看配置選項
這里搞在弄一個shell腳本,進(jìn)行配置qt源碼:
終端輸入 vim autoconfigure.sh
輸入下面指令:
./configure -prefix /home/wx/linux/qt/source-code/qt-everywhere-src-5.12.9/arm-qt \ -opensource \ -confirm-license \ -release \ -strip \ -shared \ -xplatform linux-arm-gnueabi-g++ \ -optimized-qmake \ -c++std c++11 \ --rpath=no \ -pch \ -skip qt3d \ -skip qtactiveqt \ -skip qtandroidextras \ -skip qtcanvas3d \ -skip qtconnectivity \ -skip qtdatavis3d \ -skip qtdoc \ -skip qtgamepad \ -skip qtlocation \ -skip qtmacextras \ -skip qtnetworkauth \ -skip qtpurchasing \ -skip qtremoteobjects \ -skip qtscript \ -skip qtscxml \ -skip qtsensors \ -skip qtspeech \ -skip qtsvg \ -skip qttools \ -skip qttranslations \ -skip qtwayland \ -skip qtwebengine \ -skip qtwebview \ -skip qtwinextras \ -skip qtx11extras \ -skip qtxmlpatterns \ -make libs \ -make examples \ -nomake tools -nomake tests \ -gui \ -widgets \ -dbus-runtime \ --glib=no \ --iconv=no \ --pcre=qt \ --zlib=qt \ -no-openssl \ --freetype=qt \ --harfbuzz=qt \ -no-opengl \ -linuxfb \ --xcb=no \ -tslib \ --libpng=qt \ --libjpeg=qt \ --sqlite=qt \ -plugin-sql-sqlite \ -I/home/wx/linux/qt/tslib/tslib-1.21/arm-tslib/include \ -L/home/wx/linux/qt/tslib/tslib-1.21/arm-tslib/lib \ -recheck-all
倒數(shù)第三行、第二行是tslib庫的頭文件路徑和庫文件路徑,根據(jù)自己的填入即可,tslib的編譯后面會講到。
這個是我使用的配置文件,測試是沒有問題的。直接復(fù)制的話注意每一行的那個(換行符)后面不要留空格,留空格的話執(zhí)行會報找不到命令錯誤。
修改完成之后,給腳本加上可執(zhí)行權(quán)限
chmod +777 autoconfigure.sh
之后執(zhí)行腳本
./autoconfigure.sh
出現(xiàn)這種則說明配置完成。
2.2.5 編譯qt源碼
接上面,配置后面提示、輸入make、現(xiàn)在就編譯源碼。
輸入make install,裝載編譯后源碼到執(zhí)行目錄。
這個的指定目錄就是autoconfigure.sh這個腳本第一行的路徑。
我這里是在qt源碼的根目錄下新建一個arm-qt目錄,大家也指定其他目錄。
終端輸入make、開始編譯qt源碼
等待編譯完成。
源碼編譯完成后,在終端輸入make install,將生成的lib庫文件拷貝到指定的目錄里面,我這指定的是qt源碼目錄下arm-qt文件夾里面。
等待拷貝完成后,進(jìn)入arm-qt文件夾里面,查看內(nèi)容:
至此,QT源碼編譯就完成了,后面會用到arm-qt文件夾里面的東西。
2.3 ubuntu下編譯tslib庫
2.3.1 拷貝解壓tslib到Ubuntu
開始之前,先安裝幾個工具,編譯tslib庫時需要用到。
sudo apt-get update sudo apt-get install autoconf automake libtool
tslib源碼包大家自行拷貝解壓到自己的目錄下:
我這里已經(jīng)拷貝解壓了,大家根據(jù)自己的目錄拷貝解壓即可。
2.3.2 配置tslib
進(jìn)入tslib文件夾里面,看到有一個configure的文件,和qt源碼根目錄里面的一樣,也是一個配置腳本。我們需要執(zhí)行這個腳本來指定使用交叉工具鏈和編譯后生成文件的存放路徑。
執(zhí)行下列命令:
./configure --host=arm-linux-gnueabihf ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache -prefix=/home/wx/linux/qt/tslib/tslib-1.21/arm-tslib
這里/home/wx/linux/qt/tslib/tslib-1.21/arm-tslib路徑是我的存放路徑,你也可以在你tslib根目錄下創(chuàng)建一個arm-tslib文件夾用于 存放編譯后的文件。
mkdir arm-tslib
等待配置完成之后就可以執(zhí)行make.
終端輸入make回車,開始編譯tslib。
如果之前你已經(jīng)編譯過,那make之前需要執(zhí)行make clean命令,把之前make編譯的文件刪除掉,不執(zhí)行好像也可以,個人感覺最好清一下。
等待make完成之后,執(zhí)行sudo make install指令(不加sudo好像不行,沒權(quán)限)。
make install時報這個錯誤,我記得我第一次編譯沒問題的,很奇怪,百度找找了。
配置的時候參數(shù)改成上面那樣就沒有問題,所以有一些告警,可以忽略。
./configure --host=arm-linux --prefix=`pwd`/arm-tslib CC=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
gcc交叉編譯工具改成了絕對路徑,大家根據(jù)自己實際情況修改。
好了,再次配置tslib,
make clean make sudo make install
ok,這次沒有問題。
進(jìn)入arm-tslib目錄下, ls下,該有文件都已經(jīng)有了。
看一下文件的類型:是不是ARM架構(gòu)下的文件
file bin/ts_calibrate
是arm架構(gòu),沒問題,如果你的是x86架構(gòu),請檢查你的交叉編譯工具是否正確。
至此,tslib庫編譯已經(jīng)完成。
2.4 配置ARM架構(gòu)下Qt Creator環(huán)境
2.4.1 qt creator環(huán)境配置
安裝qt creator就不講了,大家不會的百度很容易找到。
打開qt creator軟件
在菜單欄中選擇工具->選項->kits->Qt Versions->addr
配置kits:
這里圖我就直接貼正點原子的了,感覺挺易懂明了的。
2.4.2 編譯測試qt程序
qt creator環(huán)境配置好之后,編譯qt測試應(yīng)用測試。
新建工程什么的,大家應(yīng)該都會了,新建工程的最后一步,大家需要特別注意,一定到勾選ARM平臺的開發(fā)套件(Kits)。
創(chuàng)建好工程后,編寫測試應(yīng)用程序。
/*mainwindow.h文件*/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPushButton> #include <QTextBrowser> #include <QFontDatabase> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; QPushButton *pPushButton_Test1; QPushButton *pPushButton_Test2; QTextBrowser *pTestBrowser; private slots: void pPushButton_Test1_clicked(void); void pPushButton_Test2_clicked(void); }; #endif // MAINWINDOW_H
/*mainwindow.cpp文件*/ #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); /*實例化對象*/ pPushButton_Test1 = new QPushButton(this); pPushButton_Test1->setText("測試按鈕1"); pPushButton_Test2 = new QPushButton(this); pPushButton_Test2->setText("測試按鈕2"); pTestBrowser = new QTextBrowser(this); /*設(shè)置位置*/ pPushButton_Test1->setGeometry(10,10,150,50); pPushButton_Test2->setGeometry(10,80,150,50); pTestBrowser->setGeometry(200,10,500,250); /*字體庫路徑設(shè)置、ubuntu里面不用打開,arm里面需要打開,否則會找不到字庫的位置 * /etc/fonts/DroidSansFallback.ttf - 是我開發(fā)板文件系統(tǒng)里面字庫的位置 */ #if 1 int id = QFontDatabase::addApplicationFont("/etc/fonts/DroidSansFallback.ttf"); QString msyh = QFontDatabase::applicationFontFamilies (id).at(0); QFont font(msyh,10); font.setPointSize(20); this->setFont(font); #endif /*關(guān)聯(lián)信號與槽*/ connect(pPushButton_Test1,SIGNAL(clicked()),this,SLOT(pPushButton_Test1_clicked())); connect(pPushButton_Test2,SIGNAL(clicked()),this,SLOT(pPushButton_Test2_clicked())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::pPushButton_Test1_clicked(void) { pTestBrowser->append("測試按鈕1被點擊!"); } void MainWindow::pPushButton_Test2_clicked(void) { pTestBrowser->append("測試按鈕2被點擊!"); }
編寫完成之后,Debug那里選擇要使用kits。
選擇ARM架構(gòu)的開發(fā)套件編譯之后的可執(zhí)行文件是ARM架構(gòu),可以在arm開發(fā)板上運行,選擇x86架構(gòu)的開發(fā)套件可執(zhí)行文件是x86架構(gòu),直接可以在ubuntu里面或者windows里面運行,這里我們選擇ARM架構(gòu)的套件。
選好之后,在菜單欄構(gòu)建->build All Projects;
最下面狀態(tài)欄點擊4編譯輸出,出現(xiàn)下列提示,則說明編譯成功。
個人感覺可以先選擇x86的開發(fā)套件,在windos下直接運行,看看效果,然后在選擇arm架構(gòu)的套件編譯。
注意:選擇arm架構(gòu)的開發(fā)套件生成的可執(zhí)行文件是無法直接運行的,因為你的機器(電腦)是x86架構(gòu)。
進(jìn)入qt的工程目錄下面,查找最后生成的可執(zhí)行文件:
進(jìn)入到build-test_demo-ARM_Qt5_12_9-Debug目錄里面:
ls file test_demo
當(dāng)然,你也可以使用qmake 、make,生成可執(zhí)行文件。
文件類型是32位ARM結(jié)構(gòu)的可執(zhí)行文件,那就沒錯了。
至此,Qt測試應(yīng)用程序就做好了。
2.5 移植qt到開發(fā)板文件系統(tǒng)
2.5.1 拷貝庫文件到開發(fā)板文件系統(tǒng)
我這里用的是SD卡啟動,內(nèi)核、設(shè)備樹、根文件系統(tǒng)都在SD卡里面。
1、將qt源碼目錄下arm-qt文件拷貝到開發(fā)板根文件系統(tǒng)/usr/lib/下面。
sudo cp -rvf arm-qt /media/wx/rootfs/usr/lib/
我這里SD卡的分區(qū)2(存放的根文件系統(tǒng))已經(jīng)掛載到ubuntu的/media/wx/rootfs/下面了,故這里直接拷貝即可,注意要加上sudo權(quán)限。
2、將tslib庫文件也拷貝到開發(fā)板根文件系統(tǒng)/usr/lib/下面
arm-qt、arm-tslib都是前面編譯好的文件。
3、將font字體文件拷貝到開發(fā)板根文件系統(tǒng)/etc/font文件夾下面
/etc/下沒有這個文件夾你就創(chuàng)建一個。
4、將qt測試應(yīng)用程序拷貝到開發(fā)板根文件系統(tǒng)/temp文件夾下面
其他文件夾應(yīng)該也行,我這里是拷貝到/temp
特別注意:這里是指開發(fā)板的根文件目錄下面,不要拷貝你ubuntu的根目錄下面,不然就尷尬了。
2.5.2 修改開發(fā)板/etc/profile,添加環(huán)境變量
前面你把這些庫文件都添加進(jìn)去了,不添加環(huán)境變量系統(tǒng)是找不到的。
#!/bin/sh LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH export TERM=vt100 export TERMINFO=/usr/share/terminfo export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_ROOT=/usr/lib/arm-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=/lib/ts export TSLIB_CALIBFILE=/etc/pointercal export QT_ROOT=/usr/lib/arm-qt export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1 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 export QML2_IMPORT_PATH=$QT_ROOT/qml export QT_QPA_FB_TSLIB=1 export ALSA_CONFIG_PATH=/usr/share/arm-alsa/alsa.conf export XDG_RUNTIME_DIR=/usr/lib/ export RUNLEVEL=3 export QT_QPA_FONTDIR=/etc/fonts/
上面是我profile里面的內(nèi)容,簡單說一吧,其實我也剛接觸不是了解太多,不正確的地址請指正哈。
export TSLIB_ROOT=/usr/lib/arm-tslib //tslib的放的位置
export TSLIB_TSDEVICE=/dev/input/event1 //觸摸屏的設(shè)備文件
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf //tslib庫的配置文件
export QT_ROOT=/usr/lib/arm-qt //qt源碼庫的位置
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1 //qt程序觸摸對應(yīng)的設(shè)備文件,我就是因為沒有加這個導(dǎo)致qt程序運行起來后,無法觸摸點擊,鼠標(biāo)是可以動
export QT_QPA_FONTDIR=/etc/fonts/ //字體庫的位置、其他位置應(yīng)該也可以
好了,到這里差不多了。
三、測試
將SD插入開發(fā)板中,設(shè)置開發(fā)板從SD啟動。
進(jìn)入/temp目錄里面,執(zhí)行test_demo
cd /temp/
./test_demo & /&是后臺運行/
可以看到中文顯示和觸摸點擊都o(jì)k!大功告成。
還有一點:
你編譯qt編碼的交叉編譯器必須和編譯qt測試程序的編譯器一致,不然可能會有問題。
到此這篇關(guān)于嵌入式QT移植的實現(xiàn)的文章就介紹到這了,更多相關(guān)嵌入式QT移植內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言編程簡單卻重要的數(shù)據(jù)結(jié)構(gòu)順序表全面講解
這篇文章主要為大家介紹了C語言編程中非常簡單卻又非常重要的數(shù)據(jù)結(jié)構(gòu)順序表的全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10關(guān)于C++中的友元函數(shù)的一些總結(jié)
以下是對C++中的友元函數(shù)進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下2013-09-09