零基礎入門篇之Linux及Arm-Linux程式開發筆記 - 程式前沿
文章推薦指數: 80 %
開發arm-linux程式至少需要三種系統:. Windows系統。
主要用來檔案傳送和一些簡單的文字檔案編輯。
這個系統其實並非必需,只是因為目前PC機 ...
程式語言前端開發IOS開發Android開發雲端運算人工智慧伺服器搜尋資料庫軟體開發工具零基礎入門篇之Linux及Arm-Linux程式開發筆記2018.07.10前端開發ARM,linuxHOME前端開發零基礎入門篇之Linux及Arm-Linux程式開發筆記Advertisement前言:本文記錄了自己從一個完全不懂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-wareWorkStation。
建立虛擬工作站的目的就是為了使一臺機器同時執行多個不同型別的系統,方便開發人員進行跨平臺開發應用程式。
(關於VMware,可以到網上搜尋到詳細介紹和使用方法,在此不再贅述)2.2安裝Linux虛擬機器 安裝虛擬機器的過程和安裝實體機一樣,唯一的區別是,虛擬機器安裝是從VMware中開啟並安裝的。
先準備Linux安裝檔案,一般可以到網上下載到Linux的iso安裝檔案,然後從VMware中安裝此係統。
(關於虛擬機器安裝,在網上可以搜尋到詳細的步驟,在此不再贅述) 幾點建議: 1.安裝Fedora-10並選擇完全安裝,即把所以的包和選項都勾上。
這樣在安裝完畢後,系統就自帶了很多開發工具和相關的庫,避免自己去重新進行煩瑣的基本開發平臺搭建。
2.在VMware中為虛擬系統配置硬體資源。
建議分配硬碟空間16G,記憶體1G以上。
因為今後主要的Linux程式開發工作是在虛擬機器上進行了,所以為了保證虛擬機器流暢執行,需要分配比較豐富的硬體資源。
在第一次從ISO檔案中安裝完畢虛擬機器後,在安裝目錄下面會生成一系列的檔案,將這些檔案進行備份後,在其它機器上安裝虛擬機器的時候就花幾個小時去從ISO中安裝了,將這個目錄下的檔案複製到相應的目錄下面(在第一次從ISO中安裝的時候設定的目錄相同),然後只需要從VMware中開啟此目錄下的檔案就行了。
執行VMwareWorkstation中的【View】–【Home】,調出Home檢視,然後開啟虛擬工作站系統檔案。
開啟後,就可以看到一個虛擬機器的硬體資源配置了。
這些引數有一部分是在只能在初次使用iso安裝的時候配置的,比如硬碟大小。
另外一些引數比如記憶體大小、共享目錄等等可以在後期隨時人工更改的。
(詳細設定內容,到網上可以找到很多相關內容,在此不再贅述) 兩種方法的區別就是WinXp的安裝盤和Ghost盤的區別吧。
安裝完畢Fedora後,就可以從虛擬工作站中啟動FedoraLinux系統了。
系統桌面如下:2.3虛擬機器的一些基本配置 在第一次安裝完畢虛擬機器後開啟虛擬機器,預設的解析度是800*600,同時沒有全能共享目錄。
為了獲得比較好的操作介面,同時方便檔案共享和轉移,需要進行一些基本的配置。
2.3.1建立共享目錄 在同一個硬體PC機上執行的兩個系統。
Windows實體系統用來做一般的用途,比如聯網,處理文件等等;FedoraLinux虛擬系統則用來開發Linux程式並進行編譯生成可執行檔案。
先需要安裝vmwaretools 在VMware上面,選擇選單【VM】–【InstallVMtools】,然後在Linux虛擬機器上會生成目錄/media,同時裡面產生一個rpm檔案。
然後開啟控制終端並su登入超級使用者:cd/mediarpm–ivhVMwareTools-7.8.5-156735.i386.rpmcd/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嵌入式板上。
2.3.2調整桌面解析度 在VMware工作站中調整虛擬機器桌面解析度。
一般預設是800*600,而且現在的顯示器,一般是1024*768甚至更高,以我目前使用的電腦顯示器為例,解析度是1440*900。
需要將虛擬機器桌面解析度進行適當調整,然後全屏,那麼就可以獲得比較友好的操作介面。
在VMware中啟動虛擬機器,虛擬機器啟動後的登入介面如下: 然後登入系統,設定解析度,系統選單: 【System】–【Preferences】–【Hardware】–【ScreenResolution】 設定好解析度後,就可以在獲得全屏狀態的Linux操作介面了。
2.3.2其它設定 比如設定桌面背景,系統字型,還有資源管理器的模式等等,這些可以自己去實地操作並進行熟悉。
2.4安裝軟體 雖然Fedora已經自帶了一些必要的軟體,如OpenOffice辦公軟體,gedit記事本軟體,Firefox網頁瀏覽器等等。
但是既然是作業系統,我們也可以安裝一些我們需要的軟體。
比如中文輸入法(如:小企鵝輸入法),聊天工具(如QQ)等等。
注意:在Terminal終端中安裝程式的時候需要啟用su超級使用者許可權。
三、Fedora-linux系統 Fedora-linux虛擬機器安裝完畢並進行基本設定後,就可以開始了程式開發環節了。
在正式開始程式開發時,還需要對Linux的一些基本程式設計工具進行簡要介紹,當然如果已經有此基礎的,可以直接略過這一章。
3.1控制終端的基本操作命令 執行系統選單命令【Applications】–【SystemTools】–【Terminal】,開啟Terminal終端: 熟悉Windows系統的DOS操作介面的人肯定也會對此操作終端也不會陌生。
通過在Terminal中輸入命令,使用者可以很方便地完成Linux下的一系列操作,在正式進入自主程式設計之前,使用者有必要對下面一些最基本命令進行熟悉(其它的命令在專案需要的時候再到網上查詢相關資料)。
檔案操作命令檔案/資料夾的建立、修改、複製、刪除、移動等等。
(如rm/mv/vi/cat等等)網路設定命令個性IP、開啟FTP、開啟Telnet、開啟SSH等等。
(如ifconfig/telnetd等等)使用者管理命令系統使用者的新增、刪除、密碼修改等等。
(如,addusr/passwd等等)檔案編譯命令這個涉及到編譯環境的建立,將在後面正式進入到自主程式設計時進行詳細介紹。
這個涉及到編譯環境的建立,將在後面正式進入到自主程式設計時進行詳細介紹。
雖然目前Fedora為使用者提供了比較良好的操作介面,但是Linux最初是從命令列的作業系統發展起來的,很多強大的功能都是需要依靠Terminal控制終端來實現的,所以作為開發人員有必要先對這些基本命令進行熟悉並熟練操作。
3.2程式設計工具簡介 如果在安裝Fedora的時候,選擇的是完全安裝,系統會自帶很多開發工具。
其中Fedora-EclipseCDT和Qt庫及相關設計器QtDesigner是我們今後開發的主要工具。
當然,如果使用者沒有選擇安全安裝,則可以到網上下載到各類開發工具的安裝檔案,並自己進行安裝。
3.2.1Fedora-EclipseCDT 在Fedora中執行系統選單【Application】–【Programming】–【Eclipse】 然後就可以看到FedoraEclipse的啟動畫面 然後就是下面就是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進行研究)。
3.2.2Qt庫及Qt介面設計軟體 如果只是編寫C/C控制檯軟體,則只需要EclipseCDT就完全可以解決。
但是如果要進行窗體化程式設計,就需要引用一些開源的介面庫。
例如目前比較流行的Qt庫。
Qt是諾基亞開發的一個跨平臺的C圖形使用者介面應用程式框架。
它提供給應用程式開發者建立藝術級的圖形使用者介面所需的所用功能。
Qt是完全物件導向的,很容易擴充套件,並且允許真正地元件程式設計。
基本上,Qt同XWindow上的Motif,Openwin,GTK等圖形界面庫和Windows平臺上的MFC,OWL,VCL,ATL是同型別的東西,但Qt具有優良的跨平臺特性、物件導向、豐富的API、大量的開發文件等優點。
在Eclipse中對專案Build選項進行設定,對Qt庫進行連線,然後就可以進行Linux下的Qt程式進行開發了。
因為Eclipse沒有提供視覺化的窗體程式設計器,所以需要藉助第三方工具,QtDesigner可以很好的解決Qt的UI設計問題並編譯生成對應的*.h和*.cpp檔案(具體的操作步驟將在下面的內容中詳細介紹)。
所謂“工欲善其事,必先利其器”,前面花了大量篇幅來介紹,都是為了“磨刀”,現在開始進入“砍柴”環節。
下面將以EclipseCDT作為開發環境來介紹Linux和arm-linux程式開發的一般方法。
四、使用EclipseCDT開發Linux程式4.1建立控制檯程式 用EclipseCDT建立基於C的“HelloWorld”控制檯程式。
開啟Eclipse開發環境。
執行【File】–【New】–【CProject】 然後進入到CProject嚮導,有C的HelloWorld模板 點選Finish,然後Eclispe就會建立一個基於C的HelloWorld專案,執行程式後,能夠在控制檯中輸出“HelloWorld”: 說明:如果是開發控制檯程式,則不需要進行任何其它設計,只需要直接編寫C程式碼即可,不用對編譯庫和編譯器進行設定,Eclipse已經為我們自動完成了這些內容。
4.2建立Linux視窗程式 就像在Window環境下,如果要用C開發視窗程式,我們一般需要使用WindowsAPI或者MFC。
同樣,在Linux環境下,我們可能在C專案中引用Qt庫來進行Linux下的視窗程式開發。
在完整版的Fedora中,自帶了Qt的庫,在目錄/usr/lib下面: 系統預設自帶有兩個版本的Qt庫qt-3.3和qt4,一般我們用qt-3.3。
編寫視窗程式,我們只需要在建立了CProject的情況下,對C/CBuild路徑進行設定,指向qt-3.3的庫即可。
主要開發流程如下: 第一步:使用EclipseCDT建立CProject。
第二步:設定Build路徑指向Qt。
在專案管理器中右擊專案檔案設定專案屬性,在C/CBuild的Settings的ToolSettings中進行設定。
【GCCCCompiler】–【Directories】新增包含的檔案路徑:/usr/lib/qt-3.3/include。
這個是C的編譯器包含的標頭檔案路徑,因為是建立的CProject,所以一定要設定。
【GCCCCompiler】–【Directories】新增包含的檔案路徑:/usr/lib/qt-3.3/include。
這個是設定C語言編譯器包含的標頭檔案路徑,因為有時候C中會考慮到相容一些C語言的語法和關鍵字,所以最好也進行相關設定。
【GCCCLinker】–【Libraries】新增編譯時引用的庫路徑:/usr/lib/qt-3.3/lib(注意:不要寫成include了)。
並設定庫搜尋命令引數:qt-mt。
第三步:編寫引用了Qt庫的C程式。
第四步:執行程式。
程式執行效果如下圖: 總結:通過上面對Linux下面的控制檯程式及視窗程式的介紹,我們已經對Linux系統下的簡單程式開發流程有了簡單瞭解。
下面開始介紹arm-Linux程式的開發。
五、使用Eclipse開發Arm-linux程式5.1Arm-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機器的職能僅僅是編寫程式碼和編譯程式碼。
現在則使用EclipseCDT,可以在Linux機器上編寫C/C程式碼並進行除錯,Linux機器基本上可以模擬arm-linux系統上除了一些硬體相關度高的應用程式(如驅動程式)之外的絕大部分其它程式的執行環境。
5.2.1使用EclipseCDT編寫程式碼 其實和用EclipseCDT編寫Linux環境下的控制檯程式是完全一樣。
除了在一些特別的場合,比如編寫驅動程式,需要注意差別外,其餘的功能的實現方法基本上一樣。
這方面屬於程式設計的基本功,需要長期學習和積累,所以在此不再多述。
5.2.2建立交叉編譯環境 雖然生成程式的原始碼是一樣的,但是在Linux機器上編譯生成的可執行檔案是不能在arm-linux系統上執行的,需要用arm-linux專用的編譯器進行編譯後,才能生成可在arm-linux系統上執行的可執行檔案,當然此時應用程式又顯然不能在Linux系統上執行了。
將交叉編譯工具cross-2.95.3.tar.bz2(可以到網上下載,也可以到開發板附帶的光碟資源中找到)通過共享目錄傳送到Linux系統中,然後在Linux系統終端中先進入其檔案目錄,然後執行解壓命令:tarxjvfcross-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模式,再shiftzz表示儲存退出檔案,詳細的命令介紹可以到網上查閱相關資料):exportPATH=/usr/local/arm/2.95.3/bin:$PATH 可以通過echo$PATH來檢視環境變數是否設定成功:5.2.3編譯並執行程式 在編輯好了程式碼檔案並建立好了交叉編譯環境後,就開始編譯程式碼生成可執行程式,並移植到arm板上執行程式。
在Linux系統的終端中通過輸入arm-linux-gcc/arm-linux-g來編譯C/C檔案。
例如,我們對前面編寫的最簡單的CppHelloWorld.cpp檔案進行編譯:arm-linux-gCppHelloWorld.cpp–oCppHello 然後在對應目錄下會生成一個可在arm-linux系統上執行的應用程式CppHello。
然後通過SSH服務和FTP服務,將可執行檔案從Linux檔案系統網路傳送到arm-linux檔案系統(在此用到了兩個小軟體SSHSecure和LeapFTP,在後面再對軟體的功能進行一下簡要介紹)。
然後在Windows機器上遠端登入arm-linux系統開發板,並控制程式執行 注意:需要先通過chmodxCppHello來告訴系統此檔案是可執行檔案,然後再通過./CppHello來執行程式。
我們可以看到程式執行的結果:在螢幕上列印出一行字“HelloWorld”5.3一些常用的軟體介紹 在上面介紹的一些操作中,在進行檔案傳送的時候用到了一些軟體,在此進行簡要介紹。
LeapFtpLeapFtp一個基於Ftp協議的檔案互傳軟體。
一般情況下,我們對arm-linux機器上開啟Ftp服務,然後就可以實現Windows機器和arm-linux機器之間檔案互傳。
SSHSecureFileTransferClient一個基於SSH協議的檔案互傳軟體,可以實現FTP的功能。
雖然Linux機器和Windows機器之間可以通過共享目錄進行檔案互動,但是因為共享目錄實際上相當於Linux機器的一個虛擬的外接裝置,在每次編寫程式碼儲存後,系統都會重讀一次,給操作上造成一點小麻煩,所以建議使用SSH進行檔案傳送。
SSHSecureShellClient一個基於SSH的遠端登入軟體,可以實現telnet功能。
因為Fedora預設關閉了telnet功能,而採用更安全的SSH協議來實現telnet的相關功能。
三系統之間的主要網路架構如下: 注意: 1.如果arm-linux系統的ftp和telnet連線不上,一般情況下是arm-linux預設沒有開啟相應的服務或者預設ip和windows機器不在同一網段。
可以通過串列埠線將arm板連線到電腦上,然後開啟超級終端,輸入命令vsftpd&開啟ftp服務,輸入命令telnetd開啟telnet服務,ifconfigeth0192.168.1.16設定IP到同一網段。
2.如果Linux系統的SSH連線不上,則一般情況下是Linux系統開啟了SSH的防火牆,則只需要在Linux系統中對防火牆進行相關設定,關閉針對SSH的防火牆。
【System】–【Administration】–【Firewall】,然後勾選全能SSH。
還有一些其它軟體,比如小組協作時候,需要使用SVN進行程式碼管理;還有遠端桌面VNCViewer,可以進行遠端桌面控制(但是效果不太好,桌面顯示的延時好像比較嚴重)等等。
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,輸入:gedit.bash_profile& 用geidt開啟此檔案後,在最後面新增下面的環境變數設定:exportPATH=/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:$PATHexportQTDIR=/root/yizhi/qtopia-free-2.2.0/qt2exportQTEDIR=/root/yizhi/qtopia-free-2.2.0/qtopia/exportLD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATHexportCC=/usr/local/arm/2.95.3/bin/arm-linux-gccexportTMAKEDIR=/root/yizhi/qtopia-free-2.2.0/tmakeexportTMAKEPATH=$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有如下模板:
#############################################################################
#Makefileforbuildinghello
#Generatedbytmakeat20:58,2011/04/14
#Project:hello
#Template:app
#############################################################################
#######Compiler,toolsandoptions
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=.
#######Implicitrules
.SUFFIXES:.cpp.cxx.cc.C.c
.cpp.o:
$(CXX)-c$(CXXFLAGS)$(INCPATH)-o[email protected]$<
.cxx.o:
$(CXX)-c$(CXXFLAGS)$(INCPATH)-o[email protected]$<
.cc.o:
$(CXX)-c$(CXXFLAGS)$(INCPATH)-o[email protected]$<
.C.o:
$(CXX)-c$(CXXFLAGS)$(INCPATH)-o[email protected]$<
.c.o:
$(CC)-c$(CFLAGS)$(INCPATH)-o[email protected]$<
#######Buildrules
all:$(TARGET)
$(TARGET):$(OBJECTS)
$(LINK)$(LFLAGS)-o$(TARGET)$(OBJECTS)$(LIBS)
dist:
$(TAR)hello.tarhello.pro$(SOURCES)$(HEADERS)$(INTERFACES)$(DIST)
$(GZIP)hello.tar
clean:
-rm-f$(OBJECTS)$(OBJMOC)$(SRCMOC)$(UICIMPLS)$(UICDECLS)$(TARGET)
-rm-f*~core
#######Sub-libraries
######Combinedheaders
#######Compile
$(TARGET).o:$(TARGET).cpp 用zsm賬號登入(因為關於arm-Qt庫的編譯環境變數是在此賬號中設定的),然後執行如下步驟:1.將makefile模板檔案放置到src目錄下面2.用eclipse或者其它文字編輯器,修改makefile裡面的TARGET一項為當前專案名稱3.開啟Teminal控制終端,進入到src目錄,輸入make4.然後會在src目錄下面生成一個指定名稱相應的QtHello檔案,這個就是arm目標板上的執行程式了。
5.將QtHello檔案傳送到arm板並執行程式(詳細操作方法在4.2.3節中有介紹)。
在Windows機器上遠端登入arm板,控制程式執行,然後可以看到arm板上執行的結果了。
六、高階Linux程式設計 前面所介紹的不管是控制檯還是窗體程式,都屬於單檔案專案的範圍。
而當程式的功能比較複雜時,則往往需要很多模組和檔案,這樣在向arm-linux上移植程式時會更加繁瑣一些,需要開發人員自己寫makefile,建立多檔案的編譯規則。
因為我對此沒有進入深入一點的研究,所以只能提供下大致思路和在開發程式時遇到的一些常見問題及解決方案。
如果今後有機會有時間的話,則會對makefile進行深入一點的研究,最好是能以Eclipse自己生成的makefile模板為基礎進行簡單的修改,然後就可以編譯生成arm板上的可執行程式。
6.1多檔案控制檯專案 多檔案的控制檯程式的makefile可能會容易一些,自己也沒有研究過,以前在使用MagicC編寫C控制檯程式的時候,只需要對MagicC生成的makefile模組中的編譯器進行修改就可以輕鬆為多檔案生成基於arm-linux平臺上的控制檯程式。
(關於如何對Eclipse的makefile模板進行修改,目前還沒有研究過,今後有時間研究的話,再補充上吧。
)6.2多檔案Qt專案 目前只對簡單的多檔案專案進行了嘗試:一個main函式檔案,一個窗體標頭檔案,一個窗體實現檔案。
6.2.1使用QtDesigner設定介面 在Linux系統中開啟QtDesigner,然後進行視覺化視窗設計。
然後點選儲存為mydialog.ui檔案。
開啟mydialog.ui檔案,發現其實只是一個xml檔案: 顯然這個檔案是不能直接被C專案引用的,需要使用QtDesigner的編譯器進行編譯,生成和介面對應的h和cpp檔案。
在Terminal終端裡面執行以下命令:uicxxx.ui-oxxx.h生成.h檔案uicxxx.ui-ixxx.h-oxxx.cpp生成.cpp檔案 然後生成的mydialog.h和mydialog.cpp檔案就是和mydialog.ui相對應的程式程式碼檔案了。
可以在Eclipse專案中直接對此檔案進行引用,就可以顯示對應的窗體了。
6.2.2多檔案Qt開發時的一些經典錯誤 經典錯誤一:“undefinedreferenceto……” 這是在引用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七、學習資料 關於Linux下的Qt開發,在安裝了的Fedora裡面有相關的本地reference和相關的原始碼。
如:QtAssistant 關於arm-linux下的Qt開發,安裝交叉編譯環境時候,也有相關文件和原始碼://**************************************************************************結語:OK,寫到這裡了。
在上個學期就花過一段時間學習Linux,然後中斷了半年,這個學期又進行了深入的學習,把以前的內容和現在的內容串接起來了,終於有了比較清晰一點的思路和體會了,所以總結一下,也讓將來的自己再回頭學習時有一點借鑑吧。
感謝胡師兄的一點一滴的指導。
目錄1.您可能感興趣的文章:您可能感興趣的文章:armlinux利用alsa驅動並使用usb音訊裝置Advertisement写评论取消回覆很抱歉,必須登入網站才能發佈留言。
近期文章Spark入門(一)用SparkShell初嘗Spark滋味2019.12.08Spark入門(二)如何用Idea運行我們的Spark項目2019.12.08Spark入門(三)Spark經典的單詞統計2019.12.08Spark入門(四)Spark的map、flatMap、mapToPair2019.12.08Spark入門(五)Spark的reduce和reduceByKey2019.12.08Spark入門(六)Spark的combineByKey、sortBykey2019.12.08Spark入門(七)Spark的intersection、subtract、union和distinct2019.12.08Spark實戰尋找5億次訪問中,訪問次數最多的人2019.12.08Spark實戰搭建我們的Spark分佈式架構2019.12.08【機器學習】深度學習開發環境搭建2019.12.08AdvertisementAdvertisement
延伸文章資訊
- 1Linux 嵌入式系統開發Unit 1 設定開發環境
WinFast310_V20100427.tgz,為WinFast310開發板所需Linux. 作業系統的BSP (Board Support Package) 和應用程式。 ➢ arm-iwm...
- 2為何開發者應該轉向到Linux 環境做開發? | LinuxYes 競陽科技
最近一個新客戶在買筆電時非常猶豫要用哪一個作業系統,一開始他不想要預載Ubuntu 的Dell 筆電,希望改裝Windows 10,但是因爲要重新購買Win10 授權及安裝費,價錢多了 ...
- 3嵌入式Linux系統實作:初心者開發設計專業方略 - 博客來
書名:嵌入式Linux系統實作:初心者開發設計專業方略,語言:繁體中文,ISBN:9789865004538,頁數:393,出版社:上奇資訊,作者:方元,出版日期:2020/02/21, ...
- 4Linux - 维基百科,自由的百科全书
最早由肯·湯普遜(Ken Thompson),丹尼斯·里奇(Dennis Ritchie),道格拉斯·麥克羅伊(Douglas McIlroy),和喬伊·歐桑納于1969年在AT&T贝尔实验室开...
- 5Linux是什麼?從網站開發到物聯網無所不在的OS作業系統介紹。
而當中最重要的里程碑,就是在1991年,一名芬蘭大學生Linus Torvalds,就藉由GNU計劃的協助下,發展出了著名的Linux,一個讓大眾可以自由參與、集體協作的 ...