arm-linux 程序开发入门(QT窗口应用程序、编码、交叉编译、调试)(三机器和双机器搭建方法)(笔记)
Linux及Arm-Linux程序開發筆記(零基礎入門篇)
文章目錄
- 前言
- 一、Arm-Linux程序開發平臺簡要介紹
- 1.1程序開發所需系統及開發語言
- 1.2系統平臺搭建方式
- 二、Linux開發平臺搭建(略)
- 2.1安裝虛擬工作站
- 2.2 安裝Linux虛擬機
- 三、Fedora-linux系統(略)
- 四、使用Eclipse CDT開發Linux程序(略)
- 五、使用Eclipse開發Arm-linux程序
- 5.2開發控制臺程序
- 5.2.1使用Eclipse CDT編寫代碼
- 5.2.2建立交叉編譯環境
- 5.2.3編譯并運行程序
- 5.3一些常用的軟件介紹
- 5.4開發arm-linux窗口程序
- 5.4.2編譯生成可執行窗體程序
- 六、高級Linux程序設計
- 6.1多文件控制臺項目
- 6.2 多文件Qt項目
- 6.2.1 使用Qt Designer設置界面
- 6.2.2 多文件Qt開發時的一些經典錯誤
- 6.3 關于makefile
前言
本文記錄了自己從一個完全不懂Linux的人如何一步步學會Linux程序開發的過程。當然也希望本文能夠達到它的目的,讓那些和我一樣沒有任何基礎的人也能快速入門Linux程序開發。
一、Arm-Linux程序開發平臺簡要介紹
Arm-Linux程序的開發并不像我們以前接觸的Windows程序開發那樣,關于平臺的搭建就繁瑣很多,所以在正式進入程序開發之前先對這種開發模式進行簡要介紹,讓一個即使沒有任何Linux開發經驗的程序員也能夠看懂后面的內容。
1.1程序開發所需系統及開發語言
開發arm-linux程序至少需要三種系統:
-
Windows系統。
主要用來文件傳送和一些簡單的文本文件編輯。這個系統其實并非必需,只是因為目前PC機上最流行的系統仍然是Windows系統,我們的很多關于PC的文件和數據的操作習慣都是在Windows系統上養成的,已經對其形成了嚴重的依賴,所以Windows系統扮演著的“輔助開發系統”的角色。 -
PC-Linux系統。
在此系統上安裝arm-Linux交叉編譯器后,就可以對代碼文本文件進行編譯,生成可在arm-Linux系統中運行可執行程序。此系統被稱為“Linux宿主機”,我們對Linux程序的開發工作(包括代碼編寫、調試和編譯生成可執行文件)基本上就是在此系統上進行的。 -
Arm-Linux系統。
Arm-Linux程序運行的平臺。此系統的硬件載體是一塊小型的嵌入式arm板,我們在Linux宿主機上開發好程序并編譯生成arm-linux可執行程序后,將可執行程序文件傳送到嵌入式arm板中,然后就可以在arm板上直接運行此程序了。
三種系統的職能和聯系如下圖:
關于每個系統的職能及操作還有文件如何傳送交流都在后面詳細介紹。
關于開發語言,因為目前購買的Arm-Linux嵌入式板提供的編譯庫都是C/C++的,所以一般選擇C/C++進行程序設計。
1.2系統平臺搭建方式
關于“三系統”的搭建方式,有兩種方法:三臺分立的單系統機器組合或者一臺雙系統PC機和一臺單系統Arm板機器。但是不管采用哪種組合方式,各種系統的職能都是一樣的,而且都是通過FTP、Telnet或者SSH等網絡協議進行文件傳輸交流。
-
“三機器”組合模式。將三個系統分別安裝在三臺機器上并將三臺機器組建局域網。
-
“兩機器”組合模式。在PC機上利用虛擬工作站可以同時運行兩個系統,虛擬機上的Linux系統基本可以完成所有的實體PC-Linux機器的所有任務,當然也能夠組建局域網。
“三機器”組合模式圖
“兩機器”組合模式圖
如果開發人員對機器性能要求比較高,那么建議采用“三機器”組合模式。因為“兩機器”組合模式要求一臺機器運行雙系統,每個系統都需要分配一定的硬件資源,可能會對每個系統運行的流暢程序都造成影響。
如果開發人員只進行一些簡單的程序開發,則建議采用“兩機器”組合模式。這樣可以節省硬件設備的投資,而且開發環境的搭建、開發的流程等等都會簡單一些。而且下面的內容都是基于這種“兩機器”組合的開發模式。
二、Linux開發平臺搭建(略)
2.1安裝虛擬工作站
目前比較流行的虛擬工作站比較多,推薦使用VM-ware WorkStation。建立虛擬工作站的目的就是為了使一臺機器同時運行多個不同類型的系統,方便開發人員進行跨平臺開發應用程序。
(關于VMware,可以到網上搜索到詳細介紹和使用方法,在此不再贅述)
2.2 安裝Linux虛擬機
略
略略略
三、Fedora-linux系統(略)
四、使用Eclipse CDT開發Linux程序(略)
五、使用Eclipse開發Arm-linux程序
Arm-Linux機器采用的是飛凌嵌入式技術公司的FL2440開發板。在飛凌公司購買開發板的時候,會隨開發板一起贈送的相關入門教程《飛凌開發板配套教程》并附有一張光盤,里面有各種寫FL2440相關的開發資源。
在正式進入程序開發之前,先對FL2440開發板及arm-linux系統進行熟悉。
Fl2440開發板:熟悉Bootloader的使用方法、學會燒寫內核、燒寫文件系統等等。
Arm-linux系統:熟悉利用一些文件系統和網絡設置相關的命令。如果你對Linux命令已經有了一定了解,那么arm-linux上的命令也基本一樣。
(詳細操作過程請參考《飛凌開發板配套教程》一書)
5.2開發控制臺程序
主要開發流程圖如下:
在早期的開發環境方式中,是先用文本編輯器編寫c或者cpp文件,然后再直接在Linux機器上通過交叉編譯命令,編譯代碼文本文件并生成可執行程序,然后將可執行程序傳送到arm-linux板上,然后就可以在arm-linux機器上運行程序了。
現在的開發模式和早期的開發模式一樣,只是在編寫代碼的工具上進行了改進。早期編寫代碼的工具只要是能編輯文本的軟件就可以,甚至在Linux中通過終端的vi命令就可以搞定,Linux機器的職能僅僅是編寫代碼和編譯代碼。現在則使用Eclipse CDT,可以在Linux機器上編寫C/C++代碼并進行調試,Linux機器基本上可以模擬arm-linux系統上除了一些硬件相關度高的應用程序(如驅動程序)之外的絕大部分其它程序的運行環境。(攝像頭不可模擬嗎?)
5.2.1使用Eclipse CDT編寫代碼
其實和用Eclipse CDT編寫Linux環境下的控制臺程序是完全一樣。除了在一些特別的場合,比如編寫驅動程序,需要注意差別外,其余的功能的實現方法基本上一樣。
這方面屬于程序設計的基本功,需要長期學習和積累,所以在此不再多述。
5.2.2建立交叉編譯環境
雖然生成程序的源碼是一樣的,但是在Linux機器上編譯生成的可執行文件是不能在arm-linux系統上運行的,需要用arm-linux專用的編譯器進行編譯后,才能生成可在arm-linux系統上運行的可執行文件,當然此時應用程序又顯然不能在Linux系統上運行了。
將交叉編譯工具cross-2.95.3.tar.bz2(可以到網上下載,也可以到開發板附帶的光盤資源中找到)通過共享目錄傳送到Linux系統中,然后在Linux系統終端中先進入其文件目錄,然后執行解壓命令:
tar xjvf cross-2.95.3.tar.bz2然后在/usr/local/arm文件目錄下可以看到解壓后的2.95.3的庫了,或者如果你解壓的是cross-3.4.1.tar.bz2的版本,那么將會在對應目錄下生成3.4.1的目錄。
然后設置環境變量。因為Linux機器上存在不止一種編譯器,為了避免環境變量沖突,最好新建一個賬號(用戶【大概是有的編譯器指令相同,需要避免環境變量沖突,所以需要新建用戶?】),比如新建賬號arm-linux-gcc,然后在對應的賬號目錄中找到.bash_profile文件,設置環境變量,編輯.bash_profile,在最后一行增加路徑(vi打開文本文件,按i表示insert修改文本文件,然后Esc退出insert模式,再shift zz表示保存退出文件,詳細的命令介紹可以到網上查閱相關資料):
可以通過echo $PATH來查看環境變量是否設置成功:
5.2.3編譯并運行程序
在編輯好了代碼文件并建立好了交叉編譯環境后,就開始編譯代碼生成可執行程序,并移植到arm板上運行程序。
在Linux系統的終端中通過輸入arm-linux-gcc/arm-linux-g++來編譯C/C++文件。例如,我們對前面編寫的最簡單的CppHelloWorld.cpp文件進行編譯:
arm-linux-g++ CppHelloWorld.cpp –o CppHello
然后在對應目錄下會生成一個可在arm-linux系統上運行的應用程序CppHello。
然后通過SSH服務和FTP服務,將可執行文件從Linux文件系統網絡傳送到arm-linux文件系統(在此用到了兩個小軟件SSH Secure和LeapFTP,在后面再對軟件的功能進行一下簡要介紹)。
然后在Windows機器上遠程登錄arm-linux系統開發板,并控制程序運行
注意:需要先通過chmod +x CppHello來告訴系統此文件是可執行文件,然后再通過./CppHello來運行程序。
我們可以看到程序運行的結果:在屏幕上打印出一行字“Hello World”
5.3一些常用的軟件介紹
在上面介紹的一些操作中,在進行文件傳送的時候用到了一些軟件,在此進行簡要介紹。(經過數十年的發展,新出了一些軟件,比如Xshell之類的)
三系統之間的主要網絡架構如下:
注意:
1.如果arm-linux系統的ftp和telnet連接不上,一般情況下是arm-linux默認沒有開啟相應的服務或者默認ip和windows機器不在同一網段。可以通過串口線將arm板連接到電腦上,然后打開超級終端,輸入命令vsftpd&開啟ftp服務,輸入命令telnetd開啟telnet服務,ifconfig eth0 192.168.1.16設置IP到同一網段。
2.如果Linux系統的SSH連接不上,則一般情況下是Linux系統開啟了SSH的防火墻,則只需要在Linux系統中對防火墻進行相關設置,關閉針對SSH的防火墻。【System】–【Administration】–【Firewall】,然后勾選全能SSH。
還有一些其它軟件,比如小組協作時候,需要使用SVN進行代碼管理;還有遠程桌面VNC Viewer,可以進行遠程桌面控制(但是效果不太好,桌面顯示的延時好像比較嚴重)等等。
5.4開發arm-linux窗口程序
5.4.1建立Qt交叉編譯環境
在Linux系統中新建目錄/root/yizhi,然后將已經編譯好的arm-QT庫復制到此目錄下面。
然后將上面那六個tar.gz壓縮文件解壓到/root/yizhi目錄。
在進行arm-linux下的Qt編譯的時候,也涉及到環境變量設置問題,所以我們也最好再新建一個賬戶,專門用于編譯arm-Qt程序。
例如,在Linux系統終端中添加用戶zsm,然后進入到/home/zsm中,對.bash_profile進行修改,設置環境變量:
(為什么要管環境變量,這關環境變量什么事?)
在命令終端中ls –a 顯示隱藏的所有文件 找到.bash_profile,輸入:
用geidt打開此文件后,在最后面添加下面的環境變量設置:
export PATH=/root/yizhi/qtopia-free-2.2.0/qtopia/bin:/root/yizhi/qtopia-free-2.2.0/tmake/bin:/root/yizhi/qtopia-free-2.2.0/qt2/bin:/usr/local/arm/2.95.3/bin:$PATHexport QTDIR=/root/yizhi/qtopia-free-2.2.0/qt2export QTEDIR=/root/yizhi/qtopia-free-2.2.0/qtopia/export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATHexport CC=/usr/local/arm/2.95.3/bin/arm-linux-gccexport TMAKEDIR=/root/yizhi/qtopia-free-2.2.0/tmakeexport TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++設置好后最好重新登錄此賬號,然后在終端中輸入echo $PATH來檢驗環境變量是否設置成功:
如果出現上面的輸出,則表示arm-linux平臺下的Qt交叉編譯環境的環境變量已經設置成功。接下來就可以進行Qt程序開發了。
5.4.2編譯生成可執行窗體程序
在3.2節中已經寫好了一個單文件的項目QtHello,并在項目的src目錄下生成了一個QtHello.cpp文件,然后我們要做的就是利用arm-linux下的Qt編譯器對其進行編譯。
編譯Qt窗體項目比編譯普通控制臺項目要稍微麻煩一點,需要自己寫makefile來建立編譯規則,編譯如上的QtHello.cpp的makefile有如下模板:
############################################################################## Makefile for building hello# Generated by tmake at 20:58, 2011/04/14# Project: hello# Template: app#################################################################################### Compiler, tools and optionsCC = arm-linux-gccCXX = arm-linux-g++CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUGCXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_DEBUGINCPATH = -I. -I$(QTDIR)/includeLINK = arm-linux-gccLFLAGS =LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm -lqteMOC = $(QTDIR)/bin/mocUIC = $(QTDIR)/bin/uicTAR = tar -cfGZIP = gzip -9f####### FilesTARGET = QtHelloHEADERS = $(TARGET).hSOURCES = $(TARGET).cppOBJECTS = $(TARGET).oDIST =INTERFACE_DECL_PATH = .####### Implicit rules.SUFFIXES: .cpp .cxx .cc .C .c.cpp.o:$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<.cxx.o:$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<.cc.o:$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<.C.o:$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<.c.o:$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<####### Build rulesall: $(TARGET)$(TARGET): $(OBJECTS)$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)dist:$(TAR) hello.tar hello.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST)$(GZIP) hello.tarclean:-rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(UICIMPLS) $(UICDECLS) $(TARGET)-rm -f *~ core####### Sub-libraries###### Combined headers####### Compile$(TARGET).o: $(TARGET).cpp用zsm賬號登錄(因為關于arm-Qt庫的編譯環境變量是在此賬號中設置的),然后執行如下步驟:
1.將makefile模板文件放置到src目錄下面
2.用eclipse或者其它文本編輯器,修改makefile里面的TARGET一項為當前項目名稱
3.打開Teminal控制終端,進入到src目錄,輸入make
4.然后會在src目錄下面生成一個指定名稱相應的QtHello文件,這個就是arm目標板上的運行程序了。
5.將QtHello文件傳送到arm板并運行程序(詳細操作方法在4.2.3節中有介紹)。
在Windows機器上遠程登錄arm板,控制程序運行,然后可以看到arm板上運行的結果了。
六、高級Linux程序設計
前面所介紹的不管是控制臺還是窗體程序,都屬于單文件項目的范圍。而當程序的功能比較復雜時,則往往需要很多模塊和文件,這樣在向arm-linux上移植程序時會更加繁瑣一些,需要開發人員自己寫makefile,建立多文件的編譯規則。
因為我對此沒有進入深入一點的研究,所以只能提供下大致思路和在開發程序時遇到的一些常見問題及解決方案。如果今后有機會有時間的話,則會對makefile進行深入一點的研究,最好是能以Eclipse自己生成的makefile模板為基礎進行簡單的修改,然后就可以編譯生成arm板上的可執行程序。
6.1多文件控制臺項目
多文件的控制臺程序的makefile可能會容易一些,自己也沒有研究過,以前在使用Magic C++編寫C++控制臺程序的時候,只需要對Magic C++生成的makefile模塊中的編譯器進行修改就可以輕松為多文件生成基于arm-linux平臺上的控制臺程序。
(關于如何對Eclipse的makefile模板進行修改,目前還沒有研究過,今后有時間研究的話,再補充上吧。)
6.2 多文件Qt項目
目前只對簡單的多文件項目進行了嘗試:一個main函數文件,一個窗體頭文件,一個窗體實現文件。
6.2.1 使用Qt Designer設置界面
在Linux系統中打開Qt Designer,然后進行可視化窗口設計。然后點擊保存為mydialog.ui文件。
打開mydialog.ui文件,發現其實只是一個xml文件:
顯然這個文件是不能直接被C++項目引用的,需要使用Qt Designer的編譯器進行編譯,生成和界面對應的h和cpp文件。
在Terminal終端里面運行以下命令:
uic xxx.ui -o xxx.h 生成.h文件uic xxx.ui -i xxx.h -o xxx.cpp 生成.cpp文件
然后生成的mydialog.h和mydialog.cpp文件就是和mydialog.ui相對應的程序代碼文件了。可以在Eclipse項目中直接對此文件進行引用,就可以顯示對應的窗體了。
6.2.2 多文件Qt開發時的一些經典錯誤
- 經典錯誤一:
這是在引用Qt的庫時,產生了某些歧義,需要進行一些預先處理,生成和界面文件相對應的moc文件,關于問題的詳細介紹可以參考下面的帖子:
http://hi.baidu.com/asky007/blog/item/7aad95ccbee5ba1601e928d7.html
(靠,太多年了,已經打不開了!)
解決方案:
在Linux控制終端中進入到項目代碼文件目錄,執行
qmake –projectqmakemake然后此目錄下會生成一系列的文件,如moc_xx.cpp,moc_xx.o,src,src_pro等等。然后再到Eclipse中編譯此項目,則錯誤消失。
- 經典錯誤二:
在Linux機器上能運行的Qt窗口程序,在arm-linux下的Qt編譯器下無法通過。
可能的問題是Qt庫版本問題,或者是有些Qt運行環境在Linux機和arm-linux機上有所不同,這就需要重新尋找新的代替解決方案。正是因為這些很多不確定的因素,所以在進行arm-linux界面程序開發時,需要經常在編寫一段新代碼就要在arm板上進行測試,可以避免做太多無用功。
6.3 關于makefile
關于多文件Qt項目向arm-linux系統上的移植,比較核心的技術應該就在makefile上吧,目前自己了解太少,只限于對模板的應用,所以下面的就寫不下去了。
下面有一篇到網上找到的關于makefile結構分析的帖子,今后有機會再研究吧。
http://blog.csdn.net/liang13664759/archive/2007/09/04/1771246.aspx
https://blog.csdn.net/liang13664759/article/details/1771246
(WoW,2021年的帖子引用2011年的帖子,2011年的帖子引用2007年的帖子,牛掰!CSDN萬古長青)
七、學習資料
關于Linux下的Qt開發,在安裝了的Fedora里面有相關的本地reference和相關的源碼。如:Qt Assistant
關于arm-linux下的Qt開發,安裝交叉編譯環境時候,也有相關文檔和源碼:
總結
以上是生活随笔為你收集整理的arm-linux 程序开发入门(QT窗口应用程序、编码、交叉编译、调试)(三机器和双机器搭建方法)(笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中的函数名称粉碎机制和它的逆向应用
- 下一篇: linux 下如何升级CMAKE?(安装