嵌入式QT移植的實(shí)現(xiàn)
一、軟件包、環(huán)境說(shuō)明
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字體庫(kù)(qt支持中文)
DroidSansFallback.ttf
1.2 環(huán)境說(shuō)明
1、Ubuntu版本:16.04
2、Qt應(yīng)用程序版本:Q5.14.2
3、開發(fā)板:正點(diǎn)原子阿爾法開發(fā)板(I.MX6ULL)
4、觸摸屏:正點(diǎn)原子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鍵可補(bǔ)全)
出現(xiàn)這個(gè)則說(shuō)明通用的交叉編譯工具鏈安裝成功,版本為4.9.4
沒有的話,檢查/etc/profile里面添加的文件路徑是否正確
至此,通用的交叉編譯工具鏈安裝完成
2.2 ubuntu下編譯Qt源碼
2.2.1 編譯這個(gè)有什么用呢?
windows下面開發(fā)qt是不用編譯,因?yàn)樵谀鉸t軟件的安裝目錄下已經(jīng)有這個(gè)lib庫(kù)文件,直接運(yùn)行會(huì)自動(dòng)連接到去qt安裝目錄下找?guī)煳募?,如qpushbutton.h、qcombox.h等文件,在qt安裝目錄下E:\qt\Qt5.12.9\5.12.9\Src\qtbase\include\QtWidgets里面。
qt應(yīng)用程序移植到開發(fā)板上面運(yùn)行,也需要連接到lib庫(kù),編譯qt源碼就是處理lib庫(kù),方便qt在開發(fā)板上運(yùn)行不報(bào)xx文件找不到的錯(cuò)誤。
2.2.2 拷貝qt源碼到ubuntu
拷貝源碼到你Ubuntu指定的目錄下面,解壓。(后面這個(gè)路徑需要用到)
2.2.3 修改qmake.conf文件
主要配置你編譯qt源碼使用的交叉工具鏈(上面裝的那個(gè)工具鏈)和一些配置信息。
進(jìn)入到qt源碼目錄:
編輯 qtbase/mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf文件
添加紅色框里面的內(nèi)容:
/*硬件配置信息、armv7-a、估計(jì)不同arm內(nèi)核這里要改,具體沒研究過(guò)*/ 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 修改配置編譯選項(xiàng)
在qt源碼目錄下有一個(gè)configure的腳本,使用對(duì)qt源碼進(jìn)行配置的。可以根據(jù)自己的需求裁剪一些不必要的功能,編譯之后lib庫(kù)文件大小當(dāng)然也會(huì)相應(yīng)的縮小。
終端輸入 ./configure -help 可以查看配置選項(xiàng)
這里搞在弄一個(gè)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庫(kù)的頭文件路徑和庫(kù)文件路徑,根據(jù)自己的填入即可,tslib的編譯后面會(huì)講到。
這個(gè)是我使用的配置文件,測(cè)試是沒有問題的。直接復(fù)制的話注意每一行的那個(gè)(換行符)后面不要留空格,留空格的話執(zhí)行會(huì)報(bào)找不到命令錯(cuò)誤。
修改完成之后,給腳本加上可執(zhí)行權(quán)限
chmod +777 autoconfigure.sh
之后執(zhí)行腳本
./autoconfigure.sh
出現(xiàn)這種則說(shuō)明配置完成。
2.2.5 編譯qt源碼
接上面,配置后面提示、輸入make、現(xiàn)在就編譯源碼。
輸入make install,裝載編譯后源碼到執(zhí)行目錄。
這個(gè)的指定目錄就是autoconfigure.sh這個(gè)腳本第一行的路徑。
我這里是在qt源碼的根目錄下新建一個(gè)arm-qt目錄,大家也指定其他目錄。
終端輸入make、開始編譯qt源碼
等待編譯完成。
源碼編譯完成后,在終端輸入make install,將生成的lib庫(kù)文件拷貝到指定的目錄里面,我這指定的是qt源碼目錄下arm-qt文件夾里面。
等待拷貝完成后,進(jìn)入arm-qt文件夾里面,查看內(nèi)容:
至此,QT源碼編譯就完成了,后面會(huì)用到arm-qt文件夾里面的東西。
2.3 ubuntu下編譯tslib庫(kù)
2.3.1 拷貝解壓tslib到Ubuntu
開始之前,先安裝幾個(gè)工具,編譯tslib庫(kù)時(shí)需要用到。
sudo apt-get update sudo apt-get install autoconf automake libtool
tslib源碼包大家自行拷貝解壓到自己的目錄下:
我這里已經(jīng)拷貝解壓了,大家根據(jù)自己的目錄拷貝解壓即可。
2.3.2 配置tslib
進(jìn)入tslib文件夾里面,看到有一個(gè)configure的文件,和qt源碼根目錄里面的一樣,也是一個(gè)配置腳本。我們需要執(zhí)行這個(gè)腳本來(lái)指定使用交叉工具鏈和編譯后生成文件的存放路徑。
執(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)建一個(gè)arm-tslib文件夾用于 存放編譯后的文件。
mkdir arm-tslib
等待配置完成之后就可以執(zhí)行make.
終端輸入make回車,開始編譯tslib。
如果之前你已經(jīng)編譯過(guò),那make之前需要執(zhí)行make clean命令,把之前make編譯的文件刪除掉,不執(zhí)行好像也可以,個(gè)人感覺最好清一下。
等待make完成之后,執(zhí)行sudo make install指令(不加sudo好像不行,沒權(quán)限)。
make install時(shí)報(bào)這個(gè)錯(cuò)誤,我記得我第一次編譯沒問題的,很奇怪,百度找找了。
配置的時(shí)候參數(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交叉編譯工具改成了絕對(duì)路徑,大家根據(jù)自己實(shí)際情況修改。
好了,再次配置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),請(qǐng)檢查你的交叉編譯工具是否正確。
至此,tslib庫(kù)編譯已經(jīng)完成。
2.4 配置ARM架構(gòu)下Qt Creator環(huán)境
2.4.1 qt creator環(huán)境配置
安裝qt creator就不講了,大家不會(huì)的百度很容易找到。
打開qt creator軟件
在菜單欄中選擇工具->選項(xiàng)->kits->Qt Versions->addr
配置kits:
這里圖我就直接貼正點(diǎn)原子的了,感覺挺易懂明了的。
2.4.2 編譯測(cè)試qt程序
qt creator環(huán)境配置好之后,編譯qt測(cè)試應(yīng)用測(cè)試。
新建工程什么的,大家應(yīng)該都會(huì)了,新建工程的最后一步,大家需要特別注意,一定到勾選ARM平臺(tái)的開發(fā)套件(Kits)。
創(chuàng)建好工程后,編寫測(cè)試應(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); /*實(shí)例化對(duì)象*/ pPushButton_Test1 = new QPushButton(this); pPushButton_Test1->setText("測(cè)試按鈕1"); pPushButton_Test2 = new QPushButton(this); pPushButton_Test2->setText("測(cè)試按鈕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); /*字體庫(kù)路徑設(shè)置、ubuntu里面不用打開,arm里面需要打開,否則會(huì)找不到字庫(kù)的位置 * /etc/fonts/DroidSansFallback.ttf - 是我開發(fā)板文件系統(tǒng)里面字庫(kù)的位置 */ #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)信號(hào)與槽*/ 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("測(cè)試按鈕1被點(diǎn)擊!"); } void MainWindow::pPushButton_Test2_clicked(void) { pTestBrowser->append("測(cè)試按鈕2被點(diǎn)擊!"); }
編寫完成之后,Debug那里選擇要使用kits。
選擇ARM架構(gòu)的開發(fā)套件編譯之后的可執(zhí)行文件是ARM架構(gòu),可以在arm開發(fā)板上運(yùn)行,選擇x86架構(gòu)的開發(fā)套件可執(zhí)行文件是x86架構(gòu),直接可以在ubuntu里面或者windows里面運(yùn)行,這里我們選擇ARM架構(gòu)的套件。
選好之后,在菜單欄構(gòu)建->build All Projects;
最下面狀態(tài)欄點(diǎn)擊4編譯輸出,出現(xiàn)下列提示,則說(shuō)明編譯成功。
個(gè)人感覺可以先選擇x86的開發(fā)套件,在windos下直接運(yùn)行,看看效果,然后在選擇arm架構(gòu)的套件編譯。
注意:選擇arm架構(gòu)的開發(fā)套件生成的可執(zhí)行文件是無(wú)法直接運(yùn)行的,因?yàn)槟愕臋C(jī)器(電腦)是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í)行文件,那就沒錯(cuò)了。
至此,Qt測(cè)試應(yīng)用程序就做好了。
2.5 移植qt到開發(fā)板文件系統(tǒng)
2.5.1 拷貝庫(kù)文件到開發(fā)板文件系統(tǒng)
我這里用的是SD卡啟動(dòng),內(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庫(kù)文件也拷貝到開發(fā)板根文件系統(tǒng)/usr/lib/下面
arm-qt、arm-tslib都是前面編譯好的文件。
3、將font字體文件拷貝到開發(fā)板根文件系統(tǒng)/etc/font文件夾下面
/etc/下沒有這個(gè)文件夾你就創(chuàng)建一個(gè)。
4、將qt測(cè)試應(yīng)用程序拷貝到開發(fā)板根文件系統(tǒng)/temp文件夾下面
其他文件夾應(yīng)該也行,我這里是拷貝到/temp
特別注意:這里是指開發(fā)板的根文件目錄下面,不要拷貝你ubuntu的根目錄下面,不然就尷尬了。
2.5.2 修改開發(fā)板/etc/profile,添加環(huán)境變量
前面你把這些庫(kù)文件都添加進(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)容,簡(jiǎn)單說(shuō)一吧,其實(shí)我也剛接觸不是了解太多,不正確的地址請(qǐng)指正哈。
export TSLIB_ROOT=/usr/lib/arm-tslib //tslib的放的位置
export TSLIB_TSDEVICE=/dev/input/event1 //觸摸屏的設(shè)備文件
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf //tslib庫(kù)的配置文件
export QT_ROOT=/usr/lib/arm-qt //qt源碼庫(kù)的位置
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1 //qt程序觸摸對(duì)應(yīng)的設(shè)備文件,我就是因?yàn)闆]有加這個(gè)導(dǎo)致qt程序運(yùn)行起來(lái)后,無(wú)法觸摸點(diǎn)擊,鼠標(biāo)是可以動(dòng)
export QT_QPA_FONTDIR=/etc/fonts/ //字體庫(kù)的位置、其他位置應(yīng)該也可以
好了,到這里差不多了。
三、測(cè)試
將SD插入開發(fā)板中,設(shè)置開發(fā)板從SD啟動(dòng)。
進(jìn)入/temp目錄里面,執(zhí)行test_demo
cd /temp/
./test_demo & /&是后臺(tái)運(yùn)行/
可以看到中文顯示和觸摸點(diǎn)擊都o(jì)k!大功告成。
還有一點(diǎn):
你編譯qt編碼的交叉編譯器必須和編譯qt測(cè)試程序的編譯器一致,不然可能會(huì)有問題。
到此這篇關(guān)于嵌入式QT移植的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)嵌入式QT移植內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++?單元自動(dòng)化測(cè)試解決方案總結(jié)
這篇文章主要介紹了C/C++?單元自動(dòng)化測(cè)試解決方案總結(jié),通過(guò)利用GCC插件來(lái)實(shí)現(xiàn)提升C/C++開發(fā)者的單元效率工具解決方案,希望對(duì)大家在提升單元測(cè)試效率上有所啟發(fā)2022-06-06C語(yǔ)言編程簡(jiǎn)單卻重要的數(shù)據(jù)結(jié)構(gòu)順序表全面講解
這篇文章主要為大家介紹了C語(yǔ)言編程中非常簡(jiǎn)單卻又非常重要的數(shù)據(jù)結(jié)構(gòu)順序表的全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10關(guān)于C++中的友元函數(shù)的一些總結(jié)
以下是對(duì)C++中的友元函數(shù)進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09C語(yǔ)言之包含min函數(shù)的棧實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言之包含min函數(shù)的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02