移植所需的工具linux
sudo apt-get install autoconf sudo apt-get install automake sudo apt-get install libtool
將「arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2」解壓到Ubuntu 系統的文件夾「/usr/local/arm」中。
而後修改環境變量,c++
輸入命令「~vim .bashrc」 (根據本身bash的不一樣)git
在環境變量中加入arm-gcc解壓的路徑:「export PATH=$PATH:/usr/local/arm/arm-2014.05/bin」
保存退出,輸入命令「source .bashrc」,更新一下環境變量(或者從新登錄或者重啓系統均可以)github
source .bashrc
測試sql
在Ubuntu 命令行中輸入命令」arm」, 按鍵盤」Tab」補全,出現編譯器「arm-none-linux-」的列表,說明編譯器路徑設置正確。vim
對觸摸屏信號的獲取、校訂、濾波處理,均採用開源的tslib,本文采用的tslib版本爲經典的tslib1.4。ruby
1.將下載好的tslib1.4拷貝到任意目錄下(能夠根據本身的系統選擇某一目錄),而後執行解壓縮命令bash
tar -vxf tslib-1.4.tar.gz
切換到tslib目錄:markdown
cd tslib
2.利用腳本寫編譯過程
在tslib文件夾下新建configTslib14.sh架構
vi configTslib14.sh
內容以下:(粗體部分根據本身的需求修改)
運行configTslib14.sh
./configTslib14.sh
若是出現bin,etc,include,lib這4個目錄,說明交叉編譯並安裝tslib成功。 (這個時候還沒移植tslib到arm板中)
解壓qt-everywhere-opensource-src:
tar -vxf qt-everywhere-opensource-src-5.9.1.tar.gz cd qt-everywhere-opensource-src-5.9.1
修改交叉編譯架構用到的信息:
vim qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
修改以下圖所示:(顏色不一樣的部分)
#
# qmake configuration for building with arm-linux-gnueabi-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = arm-none-linux-gnueabi-gcc
QMAKE_CXX = arm-none-linux-gnueabi-g++
QMAKE_LINK = arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++
# modifications to linux.conf
QMAKE_AR = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy
QMAKE_NM = arm-none-linux-gnueabi-nm -P
QMAKE_STRIP = arm-none-linux-gnueabi-strip
load(qt_config)#因爲我打算移植到A20開發板中,cpu架構是下面這樣的,所以這裏要根據實際狀況修改
COMPILER_FLAGS = -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mthumb
建立一個腳本文件,用於生成Makefile,執行命令
vim autoConfigure.sh
輸入下面內容並保存:
#!/bin/sh
sudo echo "可能須要執行權限"
output=/opt/arm/qt-5.9.1
tslib=/opt/arm/tslib1.4
./configure \
-v \
-prefix $output \
-release \
-opensource \
-confirm-license \
-no-accessibility \
-make libs \
-xplatform linux-arm-gnueabi-g++ \
-linuxfb \
-optimized-qmake \
-pch \
-qt-libjpeg \
-qt-libpng \
-sql-sqlite \
-qt-zlib \
-tslib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-cups \
-no-glib \
-no-pkg-config \
-recheck-all \
-no-separate-debug-info \
-I$tslib/include -L$tslib/lib
if [ $? -eq 0 ]; then
sudo make -j4 && sudo make install && ls $output
else
echo "配置失敗"
fi
上面的主要參數含義說明以下:
-embedded arm: 表示將編譯針對 arm 平臺的 embedded 版本;
-xplatform qws/linux-arm-g++: 表示使用 arm-linux 交叉編譯器進行編譯;
-qt-mouse-tslib: 表示將使用 tslib 來驅動觸摸屏;
其中
-prefix /opt/qt-5.7.0表明咱們編譯完QT5.4.1後要安裝地址;-tslib表明QT對觸摸板的支持,
-I 和 -L後面分別爲爲第一步編譯tslib的include和lib的安裝目錄。
執行命令:
chmod +x qt.configure.sh ./autoConfigure.sh
上述命令自動生成Makefile文件。
執行命令啓動編譯執行安裝命令
編譯大概2個小時。
將/opt/arm/qt-5.7.0和/opt/arm/tslib1.4 拷貝到開發板的文件系統中對應的目錄中。
安裝qtcreator
進入qtcreator開發環境
在菜單中選擇Tools——Options,在彈出的對話框中,選擇Build & Run,選擇標籤Compilers,按下圖設置,選擇C++交叉編譯器,以下圖所示:
切換到Qt Versions標籤,點擊「Add」按鈕,選擇qmake,如圖所示:
選擇完成,按「OK」按鈕,設置如圖所示:
切換到Kits標籤,點擊「Add」按鈕,而後設置以下圖所示:
把字庫Ubuntu_L.ttf 等字庫拷貝到 /opt/qt-5.7.0/lib/fonts
在開發板串口命令窗口中輸入:
vi /etc/profile
以下圖所示:
將其修改成如下內容
export TSLIB_ROOT=/opt/tslib1.4 export QT_ROOT=/opt/qt-5.7.0 export TSLIB_TSDEVICE=/dev/input/event2 export TSLIB_TSEVENTTYPE=input export TSLIB_CONFFILE=/opt/tslib1.4/etc/ts.conf export TSLIB_PLUGINDIR=/opt/tslib1.4/lib/ts export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export QWS_MOUSE_PROTO=tslib:/dev/input/event2 export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:$QT_ROOT/lib:$TSLIB_ROOT/lib:$TSLIB_ROOT/lib/ export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts export QT_QPA_GENERIC_PLUGINS=tslib
保存退出,執行命令(必定要執行,不然可能報錯):
source /etc/profile
而後在串口命令窗中輸入 vi /opt/tslib1.4/etc/ts.conf 來配置觸摸屏
把第二行的註釋去掉,把ts設置成輸入模式(注意把前面的空格也去掉)
下面編寫測試程序來測試開發板上
打開qtcreator,新建項目,拖幾個按鈕上去,以下圖所示
編譯獲得可執行程序untitled,查看一下,能夠看到其信息顯示爲arm平臺,以下圖所示
將untitled拷貝到開發板中文件系統的/bin目錄,運行該程序。
[root@iTOP-4412]# /bin/untitled
看一下板子:
附錄
常見移植問題彙總
1.Ubuntu64位系統在執行arm交叉編譯器可能會出現以下看似莫名的問題:
環境變量配置正確,目錄下也能找到相關編譯器,執行編譯時卻仍報找不到編譯器或目錄的錯誤。
緣由分析:這是因爲編譯器是32位的,在如Ubuntu64這樣的64位linux系統下運行會缺乏32位系統的運行庫。
解決:64位linux系統上安裝32位運行庫,執行以下命令:
sudo apt-get install ia-32 libs
2.Win下直接拷貝過去的腳本執行錯誤
緣由分析:
Linux系統的換行符爲\n,而win下爲\n\r,故直接拷貝到linux下執行會報錯。
解決:執行命令將腳本中全部以\r結束的字符替換爲空白:
sed -i ‘s/\r$//’ autoConfig.sh
3.Project ERROR:Unknown module(s) in QT: quick-private
在編譯過程當中出現錯誤:
Project ERROR:Unknown module(s) in QT: quick-private
make[2]: *[sub-quickwidgets-make_first-ordered] 錯誤 3
make[2]:正在離開目錄
/home/jason/work/qt-everywhere-opensource-src-5.3.0/qtdeclarative/src'
make[1]: ***[sub-src-make_first] 錯誤 2
make[1]:正在離開目錄
/home/jason/work/qt-everywhere-opensource-src-5.3.0/qtdeclarative’
make: *[module-qtdeclarative-make_first] 錯誤 2
緣由分析:在qt5.7中,quickwidgets模塊依賴quick模塊,quick模塊有依賴openGL,檢查配置參數,發如今./configure添加了參數-no -opengl,
解決:在./configure去掉參數-no -opengl
提示:相似的問題多半是由於依賴問題,因此在初次編譯時,格外須要注意./configure中的配置參數選取。
4.在編譯的時候提示:
cannot find –lxxxx
緣由分析:找不到libxxxx.so
解決:把libxxxx.so拷貝到交叉編譯工具鏈的庫目錄就能夠
例如:若是編譯觸摸屏出現找不到-lts,能夠在tslib/lib目錄下執行:
sudo cp libts-0.0.so.0.1.1
/usr/local/arm/arm-2014.05/arm-none-Linux-gnueabi/libc/thumb2/lib/libts.so
其中/usr/local/arm/arm-2014.05/是個人交叉編譯工具鏈的安裝目錄。
5.在開發板運行過程當中,假如運行有提示:
Illegal instruction (非法指令)
緣由分析:這裏極可能是由於對芯片的指令集沒有選擇好
解決:
在 /qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf文件加入對應的參數,例如
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a
6.運行時報錯:
‘GLIBC_2.9’not found:/lib/lib.so.6
緣由分析:linux系統和Qt庫不匹配致使,確切地說應該是交叉編譯鏈的版本不匹配致使。原則上應該用編譯Qt庫的編譯器交叉編譯Linux內核,製做相應的Linux最小系統。現提供一種間接解決方案。
解決:將編譯Qt庫的arm交叉編譯器下的對應lib文件夾拷貝到Linux系統根目錄下的lib,徹底覆蓋,arm編譯器下的lib是已經交叉編譯好的,能夠直接拷貝解決linux系統的運行庫問題。
7.運行時報錯找不到libstdc++.so.6
緣由分析:同理,找不到c++運行庫的問題。
解決:將arm編譯器下的lib找到拷貝到linux根文件系統的lib下。
8.運行時報錯
緣由分析:未更新ARM—Linux的環境變量或環境變量配置有誤。
解決:
1.檢查/etc/profile下的配置(參照移植步驟裏的配置)
2.更新環境變量,執行:
source /etc/profile