一鍵燒寫QT程式到開發板
之前我們寫好一個程式,都是先交叉編譯完,然後在透過nfs/tftp或者其他的方法複製到開發板,然後在手動執行,如果我們除錯程式很頻繁,那我們每次都重新複製到開發板,那這樣就太麻煩了,有沒有方便一點的辦法呢,這個就是接下來我們要介紹的一種方法,一鍵燒寫QT程式到開發板,我們只需要在qtcreater上點選一下編譯,那麼QT程式會自動到開發板上來執行,是不是非常的方便?
一.在開發板上移植ssh
要想實現一鍵燒寫,那麼我們必須就先要在開發板上移植一個ssh,本次實驗我們使用的是busybox檔案系統,這個檔案系統並不支援ssh,所以我們要先移植一個上去。接下來,我們一起來移植一下。
移植環境:
編譯器保持和編譯檔案系統和QT的編譯器一致:
arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
Ubuntu版本:Ubuntu16
(1)移植zlib
從迅為提供的資料中複製“ zlib-1.2.3.tar.gz” 到 Ubuntu 系統, 使用命令“ tar -vxf zlib-1.2.3.tar.gz” 解壓, 得到“zlib-1.2.3” 資料夾, 使用命令“cd zlib-1.2.3” 進入“ zlib-1.2.3”資料夾, 如下圖
"mkdir ssh_install"
接著使用命令“./configure --prefix=/home/ssh/ssh_install/zlib-1.2.3” , 設
置配置檔案,
其中--prefix=/home/ssh/ssh_install/zlib-1.2.3指定了zlib的安裝路徑。
如下圖所示 :
使用命令“ vim Makefile” 修改編譯引數, 將所有 gcc 修改為“ arm-none-linux-gnueabi-gcc”
如下圖所示
接著使用編譯命令“make” , 如下圖所示
執行 make 無報錯後, 接著使用安裝命令“make install” , 如下圖所示
現在已經安裝好了 zlib 庫, 在後面編譯 SSH 的時候, 需要用到 zlib 庫, 作者這裡的路徑是“/home/ssh/ssh_install/zlib-1.2.3” , 後面配置的時候需要對應生成的庫檔案, 如下圖所示
(2)移植 openssl
接著來移植 openssl 庫, 複製“openssl-0.9.8h.tar.gz” 到 Ubuntu 系統, 使用命令“tar -vxf openssl-0.9.8h.tar.gz” 解壓, 得到“openssl-0.9.8h” 資料夾, 使用命令“cd openssl-0.9.8h”進入“openssl-0.9.8h” 資料夾, 如下圖所示。
接著使用命令“./Configure linux-elf-arm -DB_ENDIAN linux:'arm-none-linux-gnueabi-gcc' --prefix=/home/ssh/ssh_install/openssl-0.9.8h” 配置編譯檔案, 如
下圖所示。
使用編譯命令“make” 編譯完成, 如下圖所示
最後使用安裝命令“make install” , 如果在安裝過程提示以下錯誤,如下圖所示:
執行命令rm -f /usr/bin/pod2man可以解決,如下圖所示:
然後再次執行make install即可安裝成功,如下圖所示:
(3)移植 ssh
接著來移植 openssh, 複製“ openssh-4.6p1.tar.gz” 到 Ubuntu 系統, 使用命令“ tar -vxfopenssh-4.6p1.tar.gz” 解壓, 得到“openssh-4.6p1” 資料夾, 使用命令“cd openssh-4.6p1/” 進入“openssh-4.6p1” 資料夾, 如下圖所示
這裡看一下 ssh 的 configure 的幫助檔案, 如下圖所示, 使用“ ./configure --help"
ssh 的 configure 檔案中需要配置的引數
--host 表示編譯出來要執行的平臺
--with-libs 表示需要的額外的庫檔案;
--with-zlib 表示庫檔案 zlib 的 instal 路徑 l;
--with-ssl-dir 表示 OpenSSl 檔案的 install 路徑;
--disable-etc-default-login 表示不使用當前環境變數的編譯器, 所以後面配置引數時, 最後直接配置
CC 和 AR 這兩個編譯器;
CC 表示設定使用的編譯器;
AR 表示設定使用的編譯器的路徑(蠻奇怪, 配置檔案中似乎沒有這個引數, 使用者可以執
行驗證下)
接著使用配置命令, 命令比較長, 作者使用顏色給大家分段:
./configure --host=arm-none-linux --with-libs --with-zlib=/home/ssh/ssh_install/zlib-1.2.3 --with-ssl-dir=/home/ssh/ssh_install/openssl-0.9.8h --disable-etc-default-login CC=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc AR=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-ar
如下圖所示:
執行成功如下圖所示:
使用編譯命令“make” , 編譯完成, 如下圖所示
編譯完成, 最後肯定是需要安裝到開發板上的, 如下圖所示。 最後在目錄下
“/home/ssh/openssh-4.6p1” 有這幾個二進位制檔案“scp 、 sftp 、 ssh、 sshd、
ssh-add、 ssh-agent、 ssh-keygen、 ssh-keyscan” 需要安裝到開發板上。 最終編譯出來的二進位制檔案, 可以使用 file 命令檢視檔案屬性, 如下圖所示, 使用命令“file scp” , 可以看到“scp” 檔案是 32 位 ARM上使用的可執行檔案
二.安裝ssh
我們把之前我們做好的QT的檔案系統複製到Ubuntu上,然後新建一個名為root的資料夾,在這個資料夾下解壓我們複製到Ubuntu的QT的檔案系統或者將沒有打包的檔案系統放進去。因為我們要把編譯好的ssh安裝到檔案系統裡面。如下圖所示:
在解壓或者複製到的檔案系統“/usr/libexec“、 “/usr/local/etc ” 、 “/usr/local/bin ” 三個目錄, 使用命令“mkdir -p ./usr/libexec ./usr/local/etc ./usr/local/bin” , 如下圖所示
在虛擬機器 Ubuntu 上, 將 openssh-6.6p1 下的生成“scp 、 sftp、 ssh、 sshd、 ssh-
add、 ssh-agent、 ssh-keygen、 ssh-keyscan” 可執行檔案複製到檔案系統“/usr/local/bin” 目錄下,複製完成, 如下圖所示
"cp ../openssh-4.6p1/scp ./usr/local/bin/
cp ../openssh-4.6p1/sftp ./usr/local/bin/
cp ../openssh-4.6p1/ssh ./usr/local/bin/
cp ../openssh-4.6p1/sshd ./usr/local/bin/
cp ../openssh-4.6p1/ssh-add ./usr/local/bin/
cp ../openssh-4.6p1/ssh-agent ./usr/local/bin/
cp ../openssh-4.6p1/ssh-keygen ./usr/local/bin/
cp ../openssh-4.6p1/ssh-keyscan ./usr/local/bin/"
將“moduli、 ssh_config、 sshd_config” 複製到開發板的“/usr/local/etc” 目錄下,
複製完成, 如下圖所示。
"cp ../openssh-4.6p1/moduli ./usr/local/etc/
cp ../openssh-4.6p1/ssh_config ./usr/local/etc/
cp ../openssh-4.6p1/sshd_config ./usr/local/etc/"
將“sftp-server、 ssh-keysign” 複製到開發板的“/usr/libexec” 目錄下, 複製完成,
"cp ../openssh-4.6p1/sftp-server ./usr/libexec/
cp ../openssh-4.6p1/ssh-keysign ./usr/libexec/"
如下圖所示
(四)生成KEY檔案,並安裝
使用“ssh-keygen” 生成個四個 key 檔案“ssh_host_rsa_key” “ssh_host_dsa_key”
“ssh_host_ecdsa_key” 和“ssh_host_ed25519_key” 。
1 在虛擬機器 Ubuntu 控制檯, “ /home/ssh/openssh-4.6p1” 目錄下, 使用命
令“ssh-keygen -t rsa -f ssh_host_rsa_key -N ""” , 可以生成“ssh_host_rsa_key ” 檔案
如下圖所示:
2 接著使用剩下的三條命令:
ssh-keygen -t dsa -f ssh_host_dsa_key -N ""
ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N ""
ssh-keygen -t dsa -f ssh_host_ed25519_key -N ""
執行完成之後, 將生成的“ssh_host_rsa_key” “ssh_host_dsa_key” “ssh_host_ecdsa_key” 和
“ssh_host_ed25519_key” 檔案, 複製到檔案系統的“/usr/local/etc/” 目錄下, 然後將其許可權修改為 600, 如下圖所示:
"cp ssh_host_rsa_key ../root/usr/local/etc/
cp ssh_host_dsa_key ../root/usr/local/etc/
cp ssh_host_ecdsa_key ../root/usr/local/etc/
cp ssh_host_ed25519_key ../root/usr/local/etc/"
然後我們回到檔案系統的解壓目錄,使用tar命令將檔案系統打包,如果是其他格式的檔案系統,如img,按照具體開發板使用手冊的工具打包即可。如下圖所示:
然後我們將打包完的檔案系統燒寫到開發板。
二.修改目標板秘鑰檔案
在檔案系統中, 使用命令“vi /etc/passwd” , 開啟 ssh 金鑰檔案, 在 “/etc/passwd” 檔案底行添
加以下內容:
sshd:x:74:74:Privilege-separated
SSH:/var/empty/sshd:/sbin/nologin
新增完成之後, 如下圖所示, 然後儲存, 金鑰檔案修改完成
三.測試
保證開發板和虛擬機器是可以ping通的前提下,在開發板上新建 root 賬戶, 如下圖所示, 使用命令“passwd root” , 它會提示輸入密碼, 需要重複輸入兩次以防輸錯
然後在開發板上執行 sshd 二進位制檔案, 使用命令“/usr/local/bin/sshd” , 提示如下
雖然提示出錯了,但是作者實際測試並不影響使用, 所以我們先跳過這個錯誤。
然後使用工具 ssh 測試是否和 PC 聯通能否正常通訊,我們開啟ssh工具,然後輸入開發板的IP和使用者名稱,如下圖所示:
根據軟體的提示輸入我們之前設定的密碼:
可以發現我們已經成功的連線上了開發板。如下圖所示,這樣我們的ssh就移植成功了。
二.在Ubuntu上搭建QT開發環境。
為了避免由於開發環境的版本差異導致的不必要的問題, 推薦使用者下載和使用手冊中安裝的相同版本“qtcreator-3.5.1” 。 使用者有兩種方式可以下載。 這裡需要注意的是, 如果使用者想要在上位機上除錯, 則需要下載對應環境的外掛。 我們提供的是“qt-opensource-linux-x64-5.5.1.run” , 裡面包含了在 Ubuntu 中執行的外掛, 也就是編譯出來的應用程式, 可以在 Ubuntu16.04.6 中執行。 然後經過簡單的移植, 就可以在開發板上執行。
官網下載地址 http://download.qt.io/archive/qt/5.5/5.5.1/,
(1)安裝qtcreator-3.5.1
我們將qt-opensource-linux-x64-5.5.1.run安裝包透過ssh傳到Ubuntu的/opt目錄裡面,如下圖所示:
(2) 然後我們在 ubuntu 下開啟終端, 切換為 root 使用者, 我們使用命令“chmod 777 qt-opensource-linux-x64-5.5.1.run” 修改安裝包許可權。 如下圖所示
(3) 接下來使用命令“./qt-opensource-linux-x64-5.5.1.run” 執行安裝。 如下圖所示
(4) 歡迎介面點選“next” 繼續。 如下圖:
(5)然後到輸入賬號密碼介面, 點選“ skip” 跳過。 如下圖
(5) 繼續點選“ next” 下一步。 如下圖:
(6)然後選擇安裝路徑, 我們不用修改( 後面我們好多地方會用到這個路徑, 儘量不要修改) , 點選“next” 下一步。
(7)接下來我們選擇安裝的元件, 勾選圖中幾個選項即可, 如下圖所示:
(8)然後選擇第一項已同意並閱讀條款。 再點選下一步。 如下圖
(9)然後點選“install” 安裝 qt, 如下圖
(10)等待裝完成, 點選“ finish” 結束安裝即可。 如下圖
(11) 安裝完成後我們可以透過“ search your computer” 搜尋 qt。 如
(12) 開啟QT之前,我們需要安裝一些必要的庫檔案。
apt-get install libqt4-dev
apt-get install libgstreamer0.10-dev
apt-get install libgstreamer-plugins-base0.10-dev
(13) 安裝好依賴以後,我們開啟QTcreator,然後新建一個工程,建立工程的方法和在Windows上使用QTcreator建立的方法一樣,這裡就不在贅述了。建立一個以後,我們點選一下編譯,如果可以編譯成功,則說明我們的環境搭建正確,如下圖所示:
三.配置編譯套件
(1)點選選單欄中的Tools->選擇Options,如下圖所示:
(2)然後點選Build&Run,選擇QT Versions,點選add,如下圖所示
(3)在彈出來的視窗,我們選擇編譯QT原始碼生成的qmake,選中以後點選open,如果大家不清楚要怎麼編譯QT原始碼,請看交叉編譯QT原始碼章節,如下圖所示:
(4)然後點選Apply,QT版本就設定完成了。
(5)接著我們點選Compilers,點選裡面的Add,如下圖所示:
(6)接著我們選擇裡面的GCC,如下所示:
(7)接著我們在Name那些寫上arm-linux-gcc,編譯器目錄選擇編譯QT5.7原始碼的編譯器裡面的g++,然後點選Apply,如下圖所示:
(8)接著來設定gdb,我們點選Debuggers,選擇add,然後把Name寫上arm-linu-gdb,PATH的路徑選擇我們編譯QT原始碼的編譯器所在的路徑,並選擇這個編譯器的gdb,如下圖所示:然後點選Apply。
(9)然後我們點選Kits,點選裡面的add,在彈出的設定介面,我們把Name改成ARM-QT5.7,Compiler選項裡面選擇我們之前設定arm-linux-g++,Debugger裡面選擇我們之前設定的arm-linux-gdb,QT version裡面選擇我們新新增的QT版本QT5.7,如下圖所示:
(10)接著我們把Device type設定成Generic Linux Device,然後點選Device裡面的Manage,如下圖所示:
(11)然後在彈出來的介面我們點選add,選擇Generic Linux Device,選擇完成以後點選Start Wizard,如下圖所示:
(12)在彈出來的介面我們把IP設定成開發板的IP,username設定成root,密碼設定成我們在移植ssh裡面設定的密碼,然後點選next,如下圖所示:
(13)在彈出來的介面,我們點選finish,如圖出現成功的字樣,則說明已經設定成功,如果不成功,請檢查使用ssh軟體是不是可以跟開發板連線,還有上一步的設定是不是正確的。如下圖所示:
(14)點選ok,退出編譯器設定介面,如下圖所示:
(15)然後我們點選qtcreator裡面的Projects,把編譯器切換成我們的剛才設定的編譯器,如下圖所示:
(16)然後我們開啟在我們要編譯的QT程式碼的pro檔案裡面新增以下程式碼,
這倆行程式碼的意思是說把我們的可執行程式下載到開發板的/opt目錄下並執行。
target.path=/opt
INSTALLS+=target
如下圖所示:
![img](file:///C:/Users/機械革命/AppData/Local/Temp/msohtmlclip1/01/clip_image113.png)
(17)然後取消掉構建的路徑,接在我們點選一下編譯,可以在我們的開發板的螢幕上看到我們QT程式直接在開發板執行了,