最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

嵌入式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ī)煳募鐀pushbutton.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源碼使用的交叉工具鏈(上面裝的那個工具鏈)和一些配置信息。
進入到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ù)自己的需求裁剪一些不必要的功能,編譯之后lib庫文件大小當(dāng)然也會相應(yīng)的縮小。
終端輸入 ./configure -help 可以查看配置選項
這里搞在弄一個shell腳本,進行配置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文件夾里面。
等待拷貝完成后,進入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

進入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,這次沒有問題。
進入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)。
進入qt的工程目錄下面,查找最后生成的可執(zhí)行文件:

進入到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)境變量

前面你把這些庫文件都添加進去了,不添加環(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啟動。

進入/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++實現(xiàn)校園導(dǎo)游系統(tǒng)

    C++實現(xiàn)校園導(dǎo)游系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++ 中this指針的用途詳解

    C++ 中this指針的用途詳解

    這篇文章主要給大家介紹了關(guān)于C++ 中this指針的用途,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)串(堆分配存儲表示法)實例詳解

    C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)串(堆分配存儲表示法)實例詳解

    這篇文章主要介紹了C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)串(堆分配存儲表示法)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++中的編譯與鏈接

    C++中的編譯與鏈接

    這篇文章主要介紹了C++中的編譯與鏈接,編譯型語言SHI?c++最大的優(yōu)點,相比于Python這種解釋型語言,C++在編譯階段就進行了許多處理,在執(zhí)行階段便具有高效性,下面我們就來詳細(xì)講解該內(nèi)容吧
    2021-12-12
  • 淺談c++中的stl中的map用法詳解

    淺談c++中的stl中的map用法詳解

    下面小編就為大家?guī)硪黄獪\談c++中的stl中的map用法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 用C語言實現(xiàn)掃雷游戲

    用C語言實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了用C語言實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++ vector模擬實現(xiàn)的代碼詳解

    C++ vector模擬實現(xiàn)的代碼詳解

    vector是表示可變大小數(shù)組的序列容器,就像數(shù)組一樣,vector也采用的連續(xù)存儲空間來存儲元素,本質(zhì)講,vector使用動態(tài)分配數(shù)組來存儲它的元素,本文將給大家詳細(xì)介紹一下C++ vector模擬實現(xiàn),需要的朋友可以參考下
    2023-07-07
  • Qt物聯(lián)網(wǎng)管理平臺之實現(xiàn)告警短信轉(zhuǎn)發(fā)

    Qt物聯(lián)網(wǎng)管理平臺之實現(xiàn)告警短信轉(zhuǎn)發(fā)

    系統(tǒng)在運行過程中,會實時采集設(shè)備的數(shù)據(jù),當(dāng)采集到的數(shù)據(jù)發(fā)生報警后,可以將報警信息以短信的形式發(fā)送給指定的管理員。本文將利用Qt實現(xiàn)告警短信轉(zhuǎn)發(fā),感興趣的可以嘗試一下
    2022-07-07
  • 基于Matlab實現(xiàn)俄羅斯方塊游戲

    基于Matlab實現(xiàn)俄羅斯方塊游戲

    俄羅斯方塊是一個最初由阿列克謝帕吉特諾夫在蘇聯(lián)設(shè)計和編程的益智類視頻游戲。本文將利用Matlab實現(xiàn)這一經(jīng)典的小游戲,需要的可以參考一下
    2022-03-03
  • C++編譯錯誤variable-sized?object?may?not?be?initiali問題

    C++編譯錯誤variable-sized?object?may?not?be?initiali問題

    這篇文章主要介紹了C++編譯錯誤variable-sized?object?may?not?be?initiali問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評論

金华市| 微山县| 泸溪县| 呼玛县| 华蓥市| 昌黎县| 铁岭市| 徐汇区| 宿州市| 兴安盟| 探索| 乌兰县| 巴马| 黑龙江省| 宁化县| 盐城市| 比如县| 铜川市| 聂拉木县| 广水市| 沅陵县| 洪江市| 海淀区| 威信县| 海伦市| 定日县| 洪湖市| 娄烦县| 乐陵市| 密云县| 昆山市| 上饶市| 思茅市| 仁布县| 玛沁县| 杭州市| 淮阳县| 河西区| 安福县| 武宁县| 社旗县|