Linux及Arm-Linux程序開發筆記(零基礎入門篇) html
做者:一點一滴的Beer http://beer.cnblogs.com/mysql
本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.htmllinux
目錄程序員
1、Arm-Linux程序開發平臺簡要介紹... 3sql
1.1程序開發所需系統及開發語言... 3數據庫
1.2系統平臺搭建方式... 4編程
2、Linux開發平臺搭建... 5windows
2.1安裝虛擬工做站... 5瀏覽器
2.2安裝Linux虛擬機... 5tomcat
2.3虛擬機的一些基本配置... 7
2.3.1創建共享目錄... 8
2.3.2調整桌面分辨率... 9
2.4安裝軟件... 11
3、Fedora-linux系統... 11
3.1控制終端的基本操做命令... 12
3.2編程工具簡介... 12
3.2.1 Fedora-Eclipse CDT. 13
3.2.2 Qt庫及Qt界面設計軟件... 14
4、使用Eclipse CDT開發Linux程序... 15
4.1創建控制檯程序... 15
4.2創建Linux窗口程序... 16
5、使用Eclipse開發Arm-linux程序... 19
5.1 Arm-linux硬件平臺... 19
5.2開發控制檯程序... 20
5.2.1使用Eclipse CDT編寫代碼... 20
5.2.2創建交叉編譯環境... 20
5.2.3編譯並運行程序... 22
5.3一些經常使用的軟件介紹... 23
5.4開發arm-linux窗口程序... 24
5.4.1創建Qt交叉編譯環境... 25
5.4.2編譯生成可執行窗體程序... 26
6、高級Linux程序設計... 28
6.1多文件控制檯項目... 29
6.2多文件Qt項目... 29
6.2.1使用Qt Designer設置界面... 29
6.2.2多文件Qt開發時的一些經典錯誤... 31
6.3關於makefile. 32
7、學習資料... 32
前言:本文記錄了本身從一個徹底不懂Linux的人如何一步步學會Linux程序開發的過程。固然也但願本文可以達到它的目的,讓那些和我同樣沒有任何基礎的人也能快速入門Linux程序開發。
Arm-Linux程序的開發並不像咱們之前接觸的Windows程序開發那樣,關於平臺的搭建就繁瑣不少,因此在正式進入程序開發以前先對這種開發模式進行簡要介紹,讓一個即便沒有任何Linux開發經驗的程序員也可以看懂後面的內容。
開發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++進行程序設計。
關於「三系統」的搭建方式,有兩種方法:三臺分立的單系統機器組合或者一臺雙系統PC機和一臺單系統Arm板機器。可是無論採用哪一種組合方式,各類系統的職能都是同樣的,並且都是經過FTP、Telnet或者SSH等網絡協議進行文件傳輸交流。
「三機器」組合模式。將三個系統分別安裝在三臺機器上並將三臺機器組建局域網。
「兩機器」組合模式。在PC機上利用虛擬工做站能夠同時運行兩個系統,虛擬機上的Linux系統基本能夠完成全部的實體PC-Linux機器的全部任務,固然也可以組建局域網。
「三機器」組合模式圖
「兩機器」組合模式圖
若是開發人員對機器性能要求比較高,那麼建議採用「三機器」組合模式。由於「兩機器」組合模式要求一臺機器運行雙系統,每一個系統都須要分配必定的硬件資源,可能會對每一個系統運行的流暢程序都形成影響。
若是開發人員只進行一些簡單的程序開發,則建議採用「兩機器」組合模式。這樣能夠節省硬件設備的投資,並且開發環境的搭建、開發的流程等等都會簡單一些。並且下面的內容都是基於這種「兩機器」組合的開發模式。
目前比較流行的虛擬工做站比較多,推薦使用VM-ware WorkStation。創建虛擬工做站的目的就是爲了使一臺機器同時運行多個不一樣類型的系統,方便開發人員進行跨平臺開發應用程序。
(關於VMware,能夠到網上搜索到詳細介紹和使用方法,在此再也不贅述)
安裝虛擬機的過程和安裝實體機同樣,惟一的區別是,虛擬機安裝是從VMware中打開並安裝的。先準備Linux安裝文件,通常能夠到網上下載到Linux的iso安裝文件,而後從VMware中安裝此係統。
(關於虛擬機安裝,在網上能夠搜索到詳細的步驟,在此再也不贅述)
幾點建議:
1.安裝Fedora-10並選擇徹底安裝,即把因此的包和選項都勾上。這樣在安裝完畢後,系統就自帶了不少開發工具和相關的庫,避免本身去從新進行煩瑣的基本開發平臺搭建。
2.在VMware中爲虛擬系統配置硬件資源。建議分配硬盤空間16G,內存1G以上。由於從此主要的Linux程序開發工做是在虛擬機上進行了,因此爲了保證虛擬機流暢運行,須要分配比較豐富的硬件資源。
在第一次從ISO文件中安裝完畢虛擬機後,在安裝目錄下面會生成一系列的文件,將這些文件進行備份後,在其它機器上安裝虛擬機的時候就花幾個小時去從 ISO中安裝了,將這個目錄下的文件複製到相應的目錄下面(在第一次從ISO中安裝的時候設定的目錄相同),而後只須要從VMware中打開此目錄下的文 件就好了。
執行VMware Workstation中的【View】--【Home】,調出Home視圖,而後打開虛擬工做站系統文件。
打開後,就能夠看到一個虛擬機的硬件資源配置了。這些參數有一部分是在只能在初次使用iso安裝的時候配置的,好比硬盤大小。另一些參數好比內存大小、共享目錄等等能夠在後期隨時人工更改的。
(詳細設置內容,到網上能夠找到不少相關內容,在此再也不贅述)
兩種方法的區別就是WinXp的安裝盤和Ghost盤的區別吧。
安裝完畢Fedora後,就能夠從虛擬工做站中啓動Fedora Linux系統了。系統桌面以下:
在第一次安裝完畢虛擬機後開啓虛擬機,默認的分辨率是800*600,同時沒有全能共享目錄。爲了得到比較好的操做界面,同時方便文件共享和轉移,須要進行一些基本的配置。
在同一個硬件PC機上運行的兩個系統。Windows實體系統用來作通常的用途,好比聯網,處理文檔等等;Fedora Linux虛擬系統則用來開發Linux程序並進行編譯生成可執行文件。
先須要安裝vmware tools
在VMware上面,選擇菜單【VM】--【Install VM tools】,而後在Linux虛擬機上會生成目錄/media,同時裏面產生一個rpm文件。
而後打開控制終端並su登陸超級用戶:
cd /media
rpm –ivh VMwareTools-7.8.5-156735.i386.rpm
cd /usr/bin
而後在/usr/bin下面看到wmware-config-tools.pl
再在Teminal中輸入wmware-config-tools.pl
而後一路回車下去。而後從此就能夠創建共享目錄。
(詳細過程也能夠在網上搜索相關內容)
共享目錄的好處是能夠將這些文件在Windows系統中提取出來,而後能夠經過咱們熟悉的windows系統進行網絡傳輸和一些其它命令操做。這個設置在後面程序開發的時候會提到其使用方法。
在VMware中創建共享目錄,執行菜單命令【VM】--【Settings…】
而後在Linux虛擬機文件系統中能夠找到對應的共享目錄:/mnt/hgfs/xplinux
創建共享目錄能夠方便虛擬機和實體機進行文件交流。例如,咱們能夠將在Linux機器上編譯生成好執行文件放置到共享目錄中,而後能夠經過Windows機器提取出來並經過網絡傳送到arm-linux嵌入式板上。
在VMware工做站中調整虛擬機桌面分辨率。通常默認是800*600,並且如今的顯示器,通常是1024*768甚至更高,以我目前使用的電腦顯示器 爲例,分辨率是1440*900。須要將虛擬機桌面分辨率進行適當調整,而後全屏,那麼就能夠得到比較友好的操做界面。
在VMware中啓動虛擬機,虛擬機啓動後的登陸界面以下:
而後登陸系統,設置分辨率,系統菜單:
【System】--【Preferences】--【Hardware】--【Screen Resolution】
設置好分辨率後,就能夠在得到全屏狀態的Linux操做界面了。
2.3.2其它設置
好比設置桌面背景,系統字體,還有資源管理器的模式等等,這些能夠本身去實地操做並進行熟悉。
雖然Fedora已經自帶了一些必要的軟件,如Open Office辦公軟件,gedit記事本軟件,Firefox網頁瀏覽器等等。可是既然是操做系統,咱們也能夠安裝一些咱們須要的軟件。好比中文輸入法(如:小企鵝輸入法),聊天工具(如QQ)等等。
注意:在Terminal終端中安裝程序的時候須要啓用su超級用戶權限。
Fedora-linux虛擬機安裝完畢並進行基本設置後,就能夠開始了程序開發環節了。在正式開始程序開發時,還須要對Linux的一些基本編程工具進行簡要介紹,固然若是已經有此基礎的,能夠直接略過這一章。
執行系統菜單命令【Applications】--【System Tools】--【Terminal】,打開Terminal終端:
熟悉Windows系統的DOS操做界面的人確定也會對此操做終端也不會陌生。經過在Terminal中輸入命令,用戶能夠很方便地完成Linux下的一 系列操做,在正式進入自主程序設計以前,用戶有必要對下面一些最基本命令進行熟悉(其它的命令在項目須要的時候再到網上查找相關資料)。
文件操做命令 |
文件/文件夾的建立、修改、複製、刪除、移動等等。(如rm/mv/vi/cat等等) |
網絡設置命令 |
個性IP、開啓FTP、開啓Telnet、開啓SSH等等。(如ifconfig/telnetd等等) |
用戶管理命令 |
系統用戶的添加、刪除、密碼修改等等。(如,addusr/passwd等等) |
文件編譯命令 |
這個涉及到編譯環境的創建,將在後面正式進入到自主程序設計時進行詳細介紹。 |
雖然目前Fedora爲用戶提供了比較良好的操做界面,可是Linux最初是從命令行的操做系統發展起來的,不少強大的功能都是須要依靠Terminal控制終端來實現的,因此做爲開發人員有必要先對這些基本命令進行熟悉並熟練操做。
若是在安裝Fedora的時候,選擇的是徹底安裝,系統會自帶不少開發工具。其中Fedora -Eclipse CDT和Qt庫及相關設計器Qt Designer是咱們從此開發的主要工具。
固然,若是用戶沒有選擇安全安裝,則能夠到網上下載到各種開發工具的安裝文件,並本身進行安裝。
在Fedora中執行系統菜單【Application】--【Programming】--【Eclipse】
而後就能夠看到Fedora Eclipse的啓動畫面
而後就是下面就是Eclispe的IDE環境了,有過Windows下的Java編程經驗的人來講,這個界面是再熟悉不過了,徹底能夠直接過渡到Linux下的C/C++程序開發上來,這樣就極大地減小了程序員的學習週期。
Eclipse的好處,第一就是開源,第二就是免費,第三就跨平臺。
由於開源,因此可擴展性很強,Eclipse實際上就是一個萬能的程序開發環境,只須要在設置中對相關語言的庫進行引用並鏈接相應的編譯器,就能夠對基於 任何語言的程序進行開發;由於免費,因此省去了註冊軟件等等雜事。由於跨平臺,因此當用戶進行跨平臺程序設計的時候,能夠極大減小學習週期。
Eclispe在Windows平臺下通常都是做爲Java的開發環境,用來開發Java桌面應用程序和Jsp網頁應用程序甚至目前比較流行的 Android手機終端軟件。在Linux下面對C/C++的庫編譯器進行了鏈接後,則成爲Linux下的C/C++開發環境,在Linux下安裝JDK 後則能夠進行Linux下的Java程序設計,若是給Linux系統安裝tomcat網頁服務器,則能夠進行Linux下的網頁應用程序開發,若是給 Linux安裝mysql數據庫服務,則能夠進行數據庫鏈接操做等等(由於目前咱們的目標主要是arm-linux窗口程序開發,因此主要對C/C++進 行研究)。
若是隻是編寫C/C++控制檯軟件,則只須要Eclipse CDT就徹底能夠解決。可是若是要進行窗體化編程,就須要引用一些開源的界面庫。例如目前比較流行的Qt庫。
Qt是諾基亞開發的一個跨平臺的C++圖形用戶界面應用程序框架。它提供給應用程序開發者創建藝術級的圖形用戶界面所需的所用功能。Qt是徹底面向對象 的,很容易擴展,而且容許真正地組件編程。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等圖形界 面庫和 Windows 平臺上的 MFC,OWL,VCL,ATL 是同類型的東西,但Qt具備優良的跨平臺特性、面向對象 、豐富的API、大量的開發文檔等優勢。
在Eclipse中對項目Build選項進行設置,對Qt庫進行鏈接,而後就能夠進行Linux下的Qt程序進行開發了。
由於Eclipse沒有提供可視化的窗體程序設計器,因此須要藉助第三方工具,QtDesigner能夠很好的解決Qt的UI設計問題並編譯生成對應的*.h和*.cpp文件(具體的操做步驟將在下面的內容中詳細介紹)。
所謂「工欲善其事,必先利其器」,前面花了大量篇幅來介紹,都是爲了「磨刀」,如今開始進入「砍柴」環節。下面將以Eclipse CDT做爲開發環境來介紹Linux和arm-linux程序開發的通常方法。
用Eclipse CDT創建基於C++的「Hello World」控制檯程序。
打開Eclipse開發環境。執行【File】--【New】--【C++ Project】
而後進入到C++ Project嚮導,有C++的Hello World模板
點擊Finish,而後Eclispe就會創建一個基於C++的HelloWorld項目,運行程序後,可以在控制檯中輸出「Hello World」:
說明:若是是開發控制檯程序,則不須要進行任何其它設計,只須要直接編寫C++代碼便可,不用對編譯庫和編譯器進行設置,Eclipse已經爲咱們自動完成了這些內容。
就像在Window環境下,若是要用C++開發窗口程序,咱們通常須要使用Windows API或者MFC。一樣,在Linux環境下,咱們可能在C++項目中引用Qt庫來進行Linux下的窗口程序開發。
在完整版的Fedora中,自帶了Qt的庫,在目錄/usr/lib下面:
系統默認自帶有兩個版本的Qt庫qt-3.3和qt4,通常咱們用qt-3.3。
編寫窗口程序,咱們只須要在創建了C++ Project的狀況下,對C/C++ Build路徑進行設置,指向qt-3.3的庫便可。主要開發流程以下:
第一步:使用Eclipse CDT創建C++ Project。
第二步:設置Build路徑指向Qt。在項目管理器中右擊項目文件設置項目屬性,在C/C++ Build的Settings的Tool Settings中進行設置。
【GCC C++ Compiler】--【Directories】添加包含的文件路徑:/usr/lib/qt-3.3/include。這個是C++的編譯器包含的頭文件路徑,由於是創建的C++ Project,因此必定要設置。
【GCC C Compiler】--【Directories】添加包含的文件路徑:/usr/lib/qt-3.3/include。這個是設置C語言編譯器包含的 頭文件路徑,由於有時候C++中會考慮到兼容一些C語言的語法和關鍵字,因此最好也進行相關設置。
【GCC C++ Linker】--【Libraries】添加編譯時引用的庫路徑:/usr/lib/qt-3.3/lib(注意:不要寫成include了)。並設置庫搜索命令參數:qt-mt。
第三步:編寫引用了Qt庫的C++程序。
第四步:運行程序。
程序運行效果以下圖:
總結:經過上面對Linux下面的控制檯程序及窗口程序的介紹,咱們已經對Linux系統下的簡單程序開發流程有了簡單瞭解。下面開始介紹arm-Linux程序的開發。
5、使用Eclipse開發Arm-linux程序
5.1 Arm-linux硬件平臺
Arm-Linux機器採用的是飛凌嵌入式技術公司的FL2440開發板。在飛凌公司購買開發板的時候,會隨開發板一塊兒贈送的相關入門教程《飛凌開發板配套教程》並附有一張光盤,裏面有各類寫FL2440相關的開發資源。
在正式進入程序開發以前,先對FL2440開發板及arm-linux系統進行熟悉。
Fl2440開發板:熟悉Bootloader的使用方法、學會燒寫內核、燒寫文件系統等等。
Arm-linux系統:熟悉利用一些文件系統和網絡設置相關的命令。若是你對Linux命令已經有了必定了解,那麼arm-linux上的命令也基本同樣。
(詳細操做過程請參考《飛凌開發板配套教程》一書)
主要開發流程圖以下:
在早期的開發環境方式中,是先用文本編輯器編寫c或者cpp文件,而後再直接在Linux機器上經過交叉編譯命令,編譯代碼文本文件並生成可執行程序,而後將可執行程序傳送到arm-linux板上,而後就能夠在arm-linux機器上運行程序了。
如今的開發模式和早期的開發模式同樣,只是在編寫代碼的工具上進行了改進。早期編寫代碼的工具只要是能編輯文本的軟件就能夠,甚至在Linux中經過終端 的vi命令就能夠搞定,Linux機器的職能僅僅是編寫代碼和編譯代碼。如今則使用Eclipse CDT,能夠在Linux機器上編寫C/C++代碼並進行調試,Linux機器基本上能夠模擬arm-linux系統上除了一些硬件相關度高的應用程序 (如驅動程序)以外的絕大部分其它程序的運行環境。
其實和用Eclipse CDT編寫Linux環境下的控制檯程序是徹底同樣。除了在一些特別的場合,好比編寫驅動程序,須要注意差異外,其他的功能的實現方法基本上同樣。
這方面屬於程序設計的基本功,須要長期學習和積累,因此在此再也不多述。
雖然生成程序的源碼是同樣的,可是在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表示保存退出文件,詳細的命令介紹能夠到網上查閱相關資料):
export PATH=/usr/local/arm/2.95.3/bin:$PATH
能夠經過echo $PATH來查看環境變量是否設置成功:
在編輯好了代碼文件並創建好了交叉編譯環境後,就開始編譯代碼生成可執行程序,並移植到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」
在上面介紹的一些操做中,在進行文件傳送的時候用到了一些軟件,在此進行簡要介紹。
LeapFtp |
一個基於Ftp協議的文件互傳軟件。通常狀況下,咱們對arm-linux機器上開啓Ftp服務,而後就能夠實現Windows機器和arm-linux機器之間文件互傳。 |
SSH Secure File Transfer Client |
一個基於SSH協議的文件互傳軟件,能夠實現FTP的功能。雖然Linux機器和Windows機器之間能夠經過共享目錄進行文件交互,可是由於共 享目錄實際上至關於Linux機器的一個虛擬的外接設備,在每次編寫代碼保存後,系統都會重讀一次,給操做上形成一點小麻煩,因此建議使用SSH進行文件 傳送。 |
SSH Secure Shell Client |
一個基於SSH的遠程登陸軟件,能夠實現telnet功能。由於Fedora默認關閉了telnet功能,而採用更安全的SSH協議來實現telnet的相關功能。 |
三系統之間的主要網絡架構以下:
注意:
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,能夠進行遠程桌面控制(可是效果不太好,桌面顯示的延時好像比較嚴重)等等。
在Linux系統中新建目錄/root/yizhi,而後將已經編譯好的arm-QT庫複製到此目錄下面。
而後將上面那六個tar.gz壓縮文件解壓到/root/yizhi目錄。
在進行arm-linux下的Qt編譯的時候,也涉及到環境變量設置問題,因此咱們也最好再新建一個帳戶,專門用於編譯arm-Qt程序。
例如,在Linux系統終端中添加用戶zsm,而後進入到/home/zsm中,對.bash_profile進行修改,設置環境變量:
在命令終端中ls –a 顯示隱藏的全部文件 找到.bash_profile,輸入:
gedit .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:$PATH export QTDIR=/root/yizhi/qtopia-free-2.2.0/qt2 export QTEDIR=/root/yizhi/qtopia-free-2.2.0/qtopia/ export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH export CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc export TMAKEDIR=/root/yizhi/qtopia-free-2.2.0/tmake export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++ |
設置好後最好從新登陸此帳號,而後在終端中輸入echo $PATH來檢驗環境變量是否設置成功:
若是出現上面的輸出,則表示arm-linux平臺下的Qt交叉編譯環境的環境變量已經設置成功。接下來就能夠進行Qt程序開發了。
在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 options CC = arm-linux-gcc CXX = arm-linux-g++ CFLAGS = -pipe -Wall -W -O2 -DNO_DEBUG CXXFLAGS= -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -DNO_DEBUG INCPATH = -I. -I$(QTDIR)/include LINK = arm-linux-gcc LFLAGS = LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm -lqte MOC = $(QTDIR)/bin/moc UIC = $(QTDIR)/bin/uic TAR = tar -cf GZIP = gzip -9f ####### Files TARGET = QtHello HEADERS = $(TARGET).h SOURCES = $(TARGET).cpp OBJECTS = $(TARGET).o DIST = 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 rules all: $(TARGET) $(TARGET): $(OBJECTS) $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) dist: $(TAR) hello.tar hello.pro $(SOURCES) $(HEADERS) $(INTERFACES) $(DIST) $(GZIP) hello.tar clean: -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板上運行的結果了。
前面所介紹的無論是控制檯仍是窗體程序,都屬於單文件項目的範圍。而當程序的功能比較複雜時,則每每須要不少模塊和文件,這樣在向arm-linux上移植程序時會更加繁瑣一些,須要開發人員本身寫makefile,創建多文件的編譯規則。
由於我對此沒有進入深刻一點的研究,因此只能提供下大體思路和在開發程序時遇到的一些常見問題及解決方案。若是從此有機會有時間的話,則會對 makefile進行深刻一點的研究,最好是能以Eclipse本身生成的makefile模板爲基礎進行簡單的修改,而後就能夠編譯生成arm板上的可 執行程序。
多文件的控制檯程序的makefile可能會容易一些,本身也沒有研究過,之前在使用Magic C++編寫C++控制檯程序的時候,只須要對Magic C++生成的makefile模塊中的編譯器進行修改就能夠輕鬆爲多文件生成基於arm-linux平臺上的控制檯程序。
(關於如何對Eclipse的makefile模板進行修改,目前尚未研究過,從此有時間研究的話,再補充上吧。)
目前只對簡單的多文件項目進行了嘗試:一個main函數文件,一個窗體頭文件,一個窗體實現文件。
在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項目中直接對此文件進行引用,就能夠顯示對應的窗體了。
經典錯誤一:
「undefined reference to ……」
這是在引用Qt的庫時,產生了某些歧義,須要進行一些預先處理,生成和界面文件相對應的moc文件,關於問題的詳細介紹能夠參考下面的帖子:
http://hi.baidu.com/asky007/blog/item/7aad95ccbee5ba1601e928d7.html
解決方案:
在Linux控制終端中進入到項目代碼文件目錄,執行
qmake –project
qmake
make
而後此目錄下會生成一系列的文件,如moc_xx.cpp,moc_xx.o,src,src_pro等等。而後再到Eclipse中編譯此項目,則錯誤消失。
經典錯誤二:
在Linux機器上能運行的Qt窗口程序,在arm-linux下的Qt編譯器下沒法經過。
可能的問題是Qt庫版本問題,或者是有些Qt運行環境在Linux機和arm-linux機上有所不一樣,這就須要從新尋找新的代替解決方案。正是由於這些 不少不肯定的因素,因此在進行arm-linux界面程序開發時,須要常常在編寫一段新代碼就要在arm板上進行測試,能夠避免作太多無用功。
關於多文件Qt項目向arm-linux系統上的移植,比較核心的技術應該就在makefile上吧,目前本身瞭解太少,只限於對模板的應用,因此下面的就寫不下去了。
下面有一篇到網上找到的關於makefile結構分析的帖子,從此有機會再研究吧。
http://blog.csdn.net/liang13664759/archive/2007/09/04/1771246.aspx
關於Linux下的Qt開發,在安裝了的Fedora裏面有相關的本地reference和相關的源碼。如:Qt Assistant
關於arm-linux下的Qt開發,安裝交叉編譯環境時候,也有相關文檔和源碼: