欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

嵌入式QT移植的實現(xiàn)

 更新時間:2022年05月19日 09:34:01   作者:別來無恙呀i  
本文主要介紹了嵌入式QT移植的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、軟件包、環(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/C++?單元自動化測試解決方案總結(jié)

    C/C++?單元自動化測試解決方案總結(jié)

    這篇文章主要介紹了C/C++?單元自動化測試解決方案總結(jié),通過利用GCC插件來實現(xiàn)提升C/C++開發(fā)者的單元效率工具解決方案,希望對大家在提升單元測試效率上有所啟發(fā)
    2022-06-06
  • C++游戲教程基本技巧之隨機化詳解

    C++游戲教程基本技巧之隨機化詳解

    在小游戲的制作中時常常會要用到隨機數(shù),這篇文章就來和大家談?wù)凜++中這個所謂的“隨機”。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-11-11
  • C語言編程簡單卻重要的數(shù)據(jù)結(jié)構(gòu)順序表全面講解

    C語言編程簡單卻重要的數(shù)據(jù)結(jié)構(gòu)順序表全面講解

    這篇文章主要為大家介紹了C語言編程中非常簡單卻又非常重要的數(shù)據(jù)結(jié)構(gòu)順序表的全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 關(guān)于C++中的友元函數(shù)的一些總結(jié)

    關(guān)于C++中的友元函數(shù)的一些總結(jié)

    以下是對C++中的友元函數(shù)進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++單例模式的實例詳解

    C++單例模式的實例詳解

    這篇文章主要介紹了C++單例模式的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C語言make和Makefile介紹及使用

    C語言make和Makefile介紹及使用

    這篇文章介紹了C語言make和Makefile以及使用方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • C++類的靜態(tài)成員初始化詳細(xì)講解

    C++類的靜態(tài)成員初始化詳細(xì)講解

    通常靜態(tài)數(shù)據(jù)成員在類聲明中聲明,在包含類方法的文件中初始化.初始化時使用作用域操作符來指出靜態(tài)成員所屬的類.但如果靜態(tài)成員是整型或是枚舉型const,則可以在類聲明中初始化
    2013-09-09
  • C語言版實現(xiàn)鏈隊列

    C語言版實現(xiàn)鏈隊列

    這篇文章主要為大家詳細(xì)介紹了C語言版實現(xiàn)鏈隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • C語言自增(++)和自減(--)實例詳解

    C語言自增(++)和自減(--)實例詳解

    本篇文章主要介紹了C語言的自增和自減的基本知識,并附有代碼示例,以便大家理解,有需要的朋友可以看下
    2016-07-07
  • C語言之包含min函數(shù)的棧實例詳解

    C語言之包含min函數(shù)的棧實例詳解

    這篇文章主要為大家詳細(xì)介紹了C語言之包含min函數(shù)的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論