ubuntu 交叉編譯qt 5.7 程序到 arm 開發板


ubuntu 交叉編譯qt 5.7 程序到 arm 開發板
平台
1 ubuntu 12.04
2 arm-linux-gcc 4.5.1
3 QT 5.7
4 開發板210 armcortex-A8 


一 概述
QT5的ARM移植及其中文顯示


二 准備工具
1.交叉編譯工具(arm-linux-gnueabi-4.5.1.tar.bz2)
2.交叉編譯好的Qt庫(armqt5.5-gec.all.fonts.tar.bz2)
3.要用到的庫(Qt依賴的庫)(armlib-all.tar.bz2,字體,觸摸屏,總線)tslib庫,(armqt5.5-gec下載到開發板(只下載里面的(lib, plugins))


三 交叉編譯環境搭建
1 源碼編譯 (ARM版本 開發板運行環境搭建) 從 http://www.qt.io/download-open-source/下載 Qt 源代碼進行交叉編譯 


2 把源代碼到 qt-everywhere-opensource-src-5.5.0.tar.gz 下載到 linux 系統的某個目錄下面解壓, 進入 qt-everywhere-opensource-src-5.5.0 目錄交叉編譯 Qt 源代碼得到 ARM 平台的 Qt


3 准備:
4 arm 的工具鏈--這里用的是 arm-linux-gcc(4.5.1)
5 修改 qt-everywhere-opensource-src-5.5.0/qtbase/mkspeces/linux-arm-gnueabi-g++/qmake.conf
在文件最前面添加一行 QT_QPA_DEFAULT_PLATFORM=linuxfb 並且把 arm-linux-gnueabi-
改為自己系統中安裝的 arm 工具鏈名稱這里改為 arm-linux-
6 配置


./configure -v --prefix=/opt/armqt5.5-gec/ -release -make libs -xplatform linux-arm-gnueabi-g++
-optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-libjpeg -qt-zlib -qt-freetype -no-sse2
-no-opengl -no-openssl -no-nis -no-cups -no-glib -no-iconv -no-xcursor -no-xfixes -no-xrandr
-no-xrender -no-separate-debug-info -nomake tools -nomake examples
-I/home/tiydy/armlib/tslib/include -L/home/tiydy/armlib/tslib/lib


為了是 Qt5 支持 tslib 添加下路徑編譯觸摸插件
-I/home/tiydy/armlib/tslib/include 為 tslib 的頭文件路徑
-L/home/tiydy/armlib/tslib/lib 為 tslib 的庫文件路徑


配置后運行 make -j 4 (可以 4 個目標一起構建提高編譯速度)
編譯后運行 make install (就會把 Qt 安裝在/opt/armqt5.5-gec/目錄下了)


把/opt/armqt5.5-gec/目錄下的 lib 和 plugins 目錄拷貝到開發板/opt/armqt5.5-gec 目錄就可以並


且在開發板/etc/profile 文件中添加下面配置
export QTDIR=/opt/armqt5.5-gec
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export QT_QPA_PLATFORM=linuxfb
export QT_QPA_FONTDIR=$QTDIR/lib/fonts
export LD_PRELOAD=/tslib/lib/libts.so
export QT_QPA_GENERIC_PLUGINS=tslib
export LD_LIBRARY_PATH=/tslib/lib:$QTDIR/lib 


四 PC交叉編譯程序
1 安裝交叉編譯工具(4.5.1)
(安裝交叉編譯工具arm-linux-g++/gcc 把arm-linux-gnueabi-4.5.1.tar.bz2解壓到/opt目錄下)
# ~/armQt$ cp arm-linux-gnueabi-4.5.1.tar.bz2 /opt/
進入/opt目錄
# tar -jxf arm-linux-gnueabi-4.5.1.tar.bz2 
# mv usr/local/arm/4.5.1/ ./

2 安裝交叉編譯好的Qt庫
(安裝編譯好的Qt庫,把armqt5.5-gec.all.fonts.tar.bz2 解壓到/opt目錄下)
gec@ubuntu:~/armQt$  cp armqt5.5-gec.all.fonts.tar.bz2 /opt/
進入/opt目錄解壓
gec@ubuntu:/opt$ tar -jxf armqt5.5-gec.all.fonts.tar.bz2


3 設置交叉編譯工具環境變量 ,路徑據ubuntu實際
查看環境變量配置的路徑 # echo $PATH
3.1 方法1
gec@ubuntu:/opt$  export PATH=/opt/4.5.1/bin/:$PATH (放入配置文件/etc/bash.bashrc)


3.2 方法2 環境配置文件 編輯vi /etc/profile, 重啟 source /etc/profile  (注意:用source重啟只用本終端有效,編譯的哪個終端也要重啟,不然環境還沒改過來,)
export PATH=/opt/usr/local/arm/4.5.1/bin/:$PATH   //:$PATH (代表以前的)要寫在后面, 設置的要放在以前的前面,優先使用以前的
export PATH=/opt/armqt5.5-gec/bin/:$PATH

3.3 方法3 
編寫環境配置文件env.sh
export QTDIR=/opt/armqt5.5-gec
export PATH=$QTDIR:/opt/usr/local/arm/4.5.1/bin:$PATH  (據實際目錄設置)  //如QT安裝在ubuntu,  opt/Qt5.5.0/5.5/gcc/bin/qmake ,生成makefile,g++編譯在ubuntu運行的程序
//export PATH=$QTDIR:/usr/local/arm/4.5.1/bin:$PATH
把env.sh文件放入工程目錄下
source env.sh ----


4 交叉編譯程序


4.1 創建一個qmake別名
alias armqmake='/opt/armqt5.5-gec/bin/qmake'
進入qt項目目錄下
MyRun        MyRun.pro       mythread.cpp
Makefile       myrun.cpp    MyRun.pro.user  mythread.h
moc_myrun.cpp  myrun.h      myrun.ui        mythread.o
gec@ubuntu:/mnt/hgfs/C++-QT/Qt/004/code/MyRun$


4.2 使用Qt的qmake工具生成交叉編譯的makefile文件--make編譯/opt/armqt5.5-gec/bin/qmake
4.2.1 用指定的qmake生成Makefile文件
生成arm版本的Makefile ----》qmake
gec@ubuntu:/mnt/hgfs/C++-QT/Qt/004/code/MyRun$  armqmake  //別名alias armqmake='/opt/armqt5.5-gec/bin/qmake'


4.2.2 生成arm版本的程序----》make
gec@ubuntu:/mnt/hgfs/C++-QT/Qt/004/code/MyRun$  make


4.2.3 把生成的可執行文件下載到開發板(根目錄)運行


5 開發板Qt運行環境搭建
把交叉編譯好的qt庫下載到開發板


5.1 制作開發板文件系統, 
5.1.1 常用目錄
bin   //命令 ,把 armlib.tar.bz2下面的/dbus/bin 目錄下的文件拷貝進來
opt   //放qt庫存 ,從第二步的裁剪好的庫放進去,可按需要后續添加, 在QT軟件 幫助--索引可查詢函數所依賴的庫
ioT //驅動
tslib //觸屏
usr
/usr/share/fonts/ //字庫目錄,可從ubuntu拷貝過來
/usr/share/fonts/truetype  //把字體放到這個目錄
etc //配置文件
/etc/profile
lib //庫 ,把 armlib.tar.bz2下面的/dbus/lib 目錄下的文件拷貝進來(拷貝時加選項把鏈接文件也一起拷貝 -radf )


5.1.2 打包目錄成img文件, 把所有文件目錄放到總目錄 rootfs 下
# ./mkyaffs2image   rootfs  rootfs-v1.img
mkyaffs2image.rar

5.2 QT主要的庫, (放在開發板/opt下) armqt5.5-gec.all.fonts.tar.bz2,准備交叉編譯好的Qt庫(把交叉編譯好的Qt庫下載到開發板/opt/下)
5.2.1 qt庫存在開發板目錄 /opt/armqt5.5-gec/lib
//配置文件: /etc/profile 
//# cp unyaffs /bin/
//# unyaffs  rootfs.img


5.2.2 裁剪qt庫, 把armqt5.5-gec.all.fonts.tar.bz2 , 解壓得目錄 armqt5.5-gec


5.2.2.1 armqt5.5-gec 里可以刪去的目錄 rm bin/ doc/ include/  -r   //
5.2.2.2 armqt5.5-gec/lib 里必要的三個文件, 例: cp  libQt5Core.*  ./  -radf   //-radf和鏈接文件一起拷貝
libQt5Core.   //核心
libQt5Gui. //按鈕,圖形
libQt5Widgets. //圖形,界面


5.2.2.3 armqt5.5-gec/lib 里的其它文件
libQt5Network //網絡
libQt5Sql. //數據庫
libQt5DBus. //總線
libQt5PrintSuppon //打印機


5.2.2.4 把裁剪好的armqt5.5-gec拷貝開發板/opt下


5.3 QT依賴的庫,(armlib-all.tar.bz2,字體,觸摸屏(tslib庫),總線), 解壓得目錄armlib 
5.3.1拷貝armlib-all.tar.bz2到開發板/home/tiydy目錄下(如果沒有創建一個)
解壓 tar -jxf armlib-all.tar.bz2  //解壓得目錄armlib


5.3.2字庫拷貝到開發板
在開發板創建一個存入字庫的目錄mkdir /usr/share/fonts/truetype
在把字庫droid拷貝到這個目錄下


5.3.3 機器碼machine-id
把/dbus/lib中的庫拷貝到開發板/lib下(-radf包含鏈接文件)
# cp ./* /lib -radf
把/dbus/bin下的文件拷貝到開發板bin目錄  ,(或在環境變量 /etc/profile設置路徑)
# cp ./* /bin
在開發板運行(因dbus-uuidgen已拷貝到/bin , 所以在哪個目錄下運行都可以)
# dbus-uuidgen > /etc/machine-id   (重定向創建文件)


5.4設置開發板配置文件/etc/profile
方法1
把profile配置文件拷貝到開發板/etc/ 
把帶QPE的刪除或注釋


方法2 
#fonts   //字庫 , 開發板上,QT顯示漢字
export FONTDIR =/home/tiydy/armlib
export LD_LIBRARY_PATH =$LD_LIBRARY_PATH:$FONTDIR/fontconfig/lib:$FONTDIR/freetype/lib


#QT5 config  //QT5配置
export QTDIR =/opt/armqt5.5-gec  //QT路徑
export QT_QPA_PLATFORM_PLUGIN_PATH =$QTDIR/plugins//QT插件路徑
export QT_QPA_PLATFORM =linuxfb //QT顯示的一種方式
export QT_QPA_FONTDIR =$QTDIR/lib/fonts //QT字庫路徑
export LD_PRELOAD =/tslib/lib/libts.so:$QTDIR/plugins/platforms/libqlinuxfb.so//導入觸摸屏庫存,插件平台庫存(linuxfb對應的插件)
export QT_QPA_GENERIC_PLUGINS =tslib  //指定用tslib來實現
export LD_LIBRARY_PATH =/tslib/lib:$QTDIR/lib:$LD_LIBRARY_PATH//指定用tslib的庫  


五 Qt程序移植到開發板
1 在運行qt程序
# ./文件名


六 異常及解決
1 [root@GEC210 /]# ./a1025 
1.1 錯誤提示
./a1025: error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory  //找不到libfontconfig.so.1


1.2查找有沒有這個文件, 如果沒有這安裝相關庫存,或從其它拷貝
[root@GEC210 /]# find / -name "libfontconfig*"
/opt/armlib/fontconfig/lib/libfontconfig.so.1.4.1
/opt/armlib/fontconfig/lib/libfontconfig.so
/opt/armlib/fontconfig/lib/libfontconfig.so.1
/opt/armlib/fontconfig/lib/libfontconfig.a
/opt/armlib/fontconfig/lib/libfontconfig.la
/opt/armlib/fontconfigs/lib/libfontconfig.so
/opt/armlib/fontconfigs/lib/libfontconfig.so.1


1.3把文件的路徑添加到 /etc/profile
如, a) 另定義一個目錄路徑(FONTDIR_OPT)
export FONTDIR_OPT=/opt/armlib/fontconfigs   
b) 添加到路徑集里 (:$FONTDIR_OPT)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FONTDIR/fontconfig/lib:$FONTDIR/freetype/lib:$FONTDIR_OPT/lib  


2 [root@GEC210 /]# ./a1025 
./a1025: error while loading shared libraries: libQt5DBus.so.5: cannot open shared object file: No such file or directory   //沒找到文件
查找只有這個,原文件,可軟鏈接成多個版本, 如 *.so  ,  *.so.5  ,  *.so.5.5
libQt5Gui.so.5.5.0
軟鏈接 : ln 原文件  生成的鏈接文件  -s
ln libQt5DBus.so.5.5.0 libQt5DBus.so.5 -s


3 在開發板運行程序出現下面錯誤  (沒找機器碼machine-id)
3.1 錯誤提示
from:tiydy-2015-10-16
process 146: D-Bus library appears to be incorrectly set up;
failed to read machine uuid: Failed to open "/etc/machine-id": No such file or directory
See the manual page for dbus-uuidgen to correct this issue.
D-Bus not built with -rdynamic so unable to print a backtrace
Aborted


3.2 解決
3.2.1 添加dbus庫, (庫在armlib.tar.bz2下面的/dbus/lib里面)


3.2.2 解壓后,把/dbus/lib中的庫拷貝到開發板/lib下(-radf包含鏈接文件)
# cp ./* /lib -radf


3.2.3把/dbus/bin下的文件拷貝到開發板bin目錄  ,(或在環境變量 /etc/profile設置路徑)
# cp ./* /bin


3.2.4在開發板運行(因dbus-uuidgen已拷貝到/bin , 所以在哪個目錄下運行都可以)
# dbus-uuidgen > /etc/machine-id   (重定向創建文件)
---------------------
作者:catemo
來源:CSDN
原文:https://blog.csdn.net/catemo/article/details/53131571
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM