標籤:

Linux開發入門需要具備哪些條件?

本人剛畢業,在一家國企上班,從事工廠的自動化應用設計這一塊,對Linux比較感興趣(以前在學校接觸過一點點,學過C語言,但是C++基本算沒學過),想空閑時間多了解下Linux下的編程開發,希望各位知友能給點建議,比如推薦入門書籍或者學習方法什麼的,非常感謝。


Linux下開發入門書籍大概是萬年不變的 Advanced Programming in the Unix Environment

語言用C足夠 The C Programming Language

學習方法上沒什麼技巧,就是寫程序,比Windows這類閉源系統多出來的就是你可以有很多源代碼可以看,但是選擇要慎重,開源代碼良莠不齊,最好找公認的清晰的代碼去看,我還是推薦*BSD的base系統的源代碼,有嚴格的代碼風格規範,對初學者養成良好的習慣很有幫助。


@yu xia 說的《Advanced Programming in the UNIX Environment》確實是必讀的好書

不過有些內容意義不大了(依然有用,但是用到的地方很少)

  • Complex File I/O (現代傾向於用Berkeley DB、SQLite之類的無宿主資料庫來代替複雜的文件I/O)
  • Process Environment Programming
  • Signal Handling
  • Terminal I/O

如果要寫高性能應用伺服器的話(大多數Linux編程的意義),《UNIX Network Programming》是必讀的;C10K問題也要知道


更新

應評論要求,不知道國內訪問github page是不是順利,這裡特意貼上翻譯團隊提供的百度雲鏈接

中英文地址: http://pan.baidu.com/s/1pJ4zcVL

中文地址: http://pan.baidu.com/s/1i3rKcEL

以下原答案:

----

對剛剛接觸Linux的新手 依照我的經驗 寫了一點見解 希望讀完之後多少可以少走一些彎路。

0. 剛開始像和我一樣有點完美主義強迫症的同學,難免會陷入 選哪個發行版 的問題中. 什麼Ubuntu的unity運行效率低, Arch的pacman更厲害, 等等. 別猶豫了, 你還在糾結的時候, 就說明其實pacman和apt除了打上去長度有差之外,其他都沒什麼區別. 選ubuntu吧, 社區好, 遇到問題也好解決. 什麼, 你要裝kde, 先忍忍, 等做完我說的幾步, 你已經看破紅塵, 對於x這種東西沒啥興趣了.

1. 首先,學習Linux必須要玩熟練的就是它強大的shell系統,也就是我們常說的命令行。推薦我的入門書 The Linux Command Line by William E. Shotts, Jr. ,這本書寫的通俗易懂,基本是從0開始教你使用每一個命令,既可以當做教程來學習,又可以留著今後查閱使用。而且,作者已經把免費的電子版放在網上供大家閱讀。如果不熟悉英文書,這個版本 HaoqiCat (好奇貓團隊)將其漢化TLCL(中文版),在這裡感謝無私提供免費版的作者和翻譯團隊。

2. 熟悉了命令行,可以繼續深入學習一些提高知識以及Linux下各種著名的工具,包括版本控制軟體,編輯器,文字處理,等等。這裡推薦一本The Pragmatic Programmer,非常經典的書,尤其有一章專門講tools,非常適合有一定經驗積累的Linux用戶。

3. 在把以上兩門內功修鍊到一個層次之後,你應該已經可以脫離滑鼠,只開一個terminal熟練進行文件打開,查找,複製等操作了,至少掌握vim/emacs之一,並逐漸感覺除了想打遊戲的時候,基本已經不想念Windows了。這時候,你的選擇就多了,可以繼續深入研究C/C++,熟悉Linux內部架構以及Syscall和系統編程,或者,你也可以用更加友好的編程語言,來做一些小的side project,用java寫個安卓小應用,用python在樹莓派上弄個微博機器人,或者學習網路編程,用任何你喜歡的網路架構做個網站等等等等。總之,Linux是開發的理想環境,無論配置還是各種開源軟體以及社區,都讓你能夠愛不釋手。


關於經典參考書大家已經說過了,我覺得那幾本書雖「老」但真的堪稱經典,完全夠用了。

我還想補充一點,雖然正如票數最高的回答所說的,Linux很容易不小心進入了「折騰」的無底洞,但是真的要提高Linux開發技術,還是需要真正使用Linux——不必完全使用Linux,但至少能夠熟練地使用Linux開發和完成一些周邊工作。別笑,我真的見過有的地方用Visual Studio寫Linux代碼然後開一個瀏覽器看man page的……

稍微了解一下Linux開發工具鏈,熟練使用man和info,對你的開發一定會有不少幫助的。


分享一篇文章。

一、Arm-Linux程序開發平台簡要介紹... 3

1.1程序開發所需系統及開發語言... 3

1.2系統平台搭建方式... 4

二、Linux開發平台搭建... 5

2.1安裝虛擬工作站... 5

2.2安裝Linux虛擬機... 5

2.3虛擬機的一些基本配置... 7

2.3.1建立共享目錄... 8

2.3.2調整桌面解析度... 9

2.4安裝軟體... 11

三、Fedora-linux系統... 11

3.1控制終端的基本操作命令... 12

3.2編程工具簡介... 12

3.2.1 Fedora-Eclipse CDT. 13

3.2.2 Qt庫及Qt界面設計軟體... 14

四、使用Eclipse CDT開發Linux程序... 15

4.1建立控制台程序... 15

4.2建立Linux窗口程序... 16

五、使用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

六、高級Linux程序設計... 28

6.1多文件控制台項目... 29

6.2多文件Qt項目... 29

6.2.1使用Qt Designer設置界面... 29

6.2.2多文件Qt開發時的一些經典錯誤... 31

6.3關於makefile. 32

七、學習資料... 32

前言:本文記錄了自己從一個完全不懂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虛擬機

安裝虛擬機的過程和安裝實體機一樣,唯一的區別是,虛擬機安裝是從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系統了。系統桌面如下:

2.3虛擬機的一些基本配置

在第一次安裝完畢虛擬機後開啟虛擬機,默認的解析度是800*600,同時沒有全能共享目錄。為了獲得比較好的操作界面,同時方便文件共享和轉移,需要進行一些基本的配置。

2.3.1建立共享目錄

在同一個硬體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嵌入式板上。

2.3.2調整桌面解析度

在VMware工作站中調整虛擬機桌面解析度。一般默認是800*600,而且現在的顯示器,一般是1024*768甚至更高,以我目前使用的電腦顯示器為例,解析度是1440*900。需要將虛擬機桌面解析度進行適當調整,然後全屏,那麼就可以獲得比較友好的操作界面。

在VMware中啟動虛擬機,虛擬機啟動後的登錄界面如下:

然後登錄系統,設置解析度,系統菜單:

【System】--【Preferences】--【Hardware】--【Screen Resolution】

設置好解析度後,就可以在獲得全屏狀態的Linux操作界面了。

2.3.2其它設置

比如設置桌面背景,系統字體,還有資源管理器的模式等等,這些可以自己去實地操作並進行熟悉。

2.4安裝軟體

雖然Fedora已經自帶了一些必要的軟體,如Open Office辦公軟體,gedit記事本軟體,Firefox網頁瀏覽器等等。但是既然是操作系統,我們也可以安裝一些我們需要的軟體。比如中文輸入法(如:小企鵝輸入法),聊天工具(如QQ)等等。

注意:在Terminal終端中安裝程序的時候需要啟用su超級用戶許可權。

三、Fedora-linux系統

Fedora-linux虛擬機安裝完畢並進行基本設置後,就可以開始了程序開發環節了。在正式開始程序開發時,還需要對Linux的一些基本編程工具進行簡要介紹,當然如果已經有此基礎的,可以直接略過這一章。

3.1控制終端的基本操作命令

執行系統菜單命令【Applications】--【System Tools】--【Terminal】,打開Terminal終端:

熟悉Windows系統的DOS操作界面的人肯定也會對此操作終端也不會陌生。通過在Terminal中輸入命令,用戶可以很方便地完成Linux下的一系列操作,在正式進入自主程序設計之前,用戶有必要對下面一些最基本命令進行熟悉(其它的命令在項目需要的時候再到網上查找相關資料)。

雖然目前Fedora為用戶提供了比較良好的操作界面,但是Linux最初是從命令行的操作系統發展起來的,很多強大的功能都是需要依靠Terminal控制終端來實現的,所以作為開發人員有必要先對這些基本命令進行熟悉並熟練操作。

3.2編程工具簡介

如果在安裝Fedora的時候,選擇的是完全安裝,系統會自帶很多開發工具。其中Fedora -Eclipse CDT和Qt庫及相關設計器Qt Designer是我們今後開發的主要工具。

當然,如果用戶沒有選擇安全安裝,則可以到網上下載到各類開發工具的安裝文件,並自己進行安裝。

3.2.1 Fedora-Eclipse CDT

在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++進行研究)。

3.2.2 Qt庫及Qt界面設計軟體

如果只是編寫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開發Linux程序

4.1建立控制台程序

用Eclipse CDT建立基於C++的「Hello World」控制台程序。

打開Eclipse開發環境。執行【File】--【New】--【C++ Project】

然後進入到C++ Project嚮導,有C++的Hello World模板

點擊Finish,然後Eclispe就會建立一個基於C++的HelloWorld項目,運行程序後,能夠在控制台中輸出「Hello World」:

說明:如果是開發控制台程序,則不需要進行任何其它設計,只需要直接編寫C++代碼即可,不用對編譯庫和編譯器進行設置,Eclipse已經為我們自動完成了這些內容。

4.2建立Linux窗口程序

就像在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程序的開發。

五、使用Eclipse開發Arm-linux程序

5.1 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表示保存退出文件,詳細的命令介紹可以到網上查閱相關資料):

export PATH=/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-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一些常用的軟體介紹

在上面介紹的一些操作中,在進行文件傳送的時候用到了一些軟體,在此進行簡要介紹。

三系統之間的主要網路架構如下:

注意:

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,輸入:

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程序開發了。

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 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板上運行的結果了。

六、高級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開發時的一些經典錯誤

經典錯誤一:

「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板上進行測試,可以避免做太多無用功。

6.3關於makefile

關於多文件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開發,安裝交叉編譯環境時候,也有相關文檔和源碼:

//**************************************************************************

結語:OK,寫到這裡了。在上個學期就花過一段時間學習Linux,然後中斷了半年,這個學期又進行了深入的學習,把以前的內容和現在的內容串接起來了,終於有了比較清晰一點的思路和體會了,所以總結一下,也讓將來的自己再回頭學習時有一點借鑒吧。感謝胡師兄的一點一滴的指導。

來源:Linux及Arm-Linux程序開發筆記(零基礎入門篇) - 一點一滴的Beer - 博客園


你想更深入了解學習Linux知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:

【超全整理】《Linux雲計算從入門到精通》linux學習入門教程系列實戰筆記全放送


Linux 是一個無底洞,一旦對其產生了興趣,那麼你就會受到魔鬼般的誘惑,你有60%的可能會投入無限的時間和精力去折騰這個系統。我例舉一個可能的路徑吧:

1. 對 Linux 產生了興趣,想要學習如何在 Linux 上開發。

2. 折騰編輯器。選擇 vim 還是 emacs 呢?

3. 選擇 vim 吧,emacs 太難了,手指抽筋。

4. kao,xxx 大神用的就是 emacs!我也試著用一下。

5. emacs 無敵!

6. 開始折騰 emacs lisp。。。

7. lisp 無敵,開始折騰 LISP。。。

8. 代碼有點亂了,來個版本控制吧,選 git 羅!(李努克斯寫的呢!)

9. 折騰 git 。。。

11. 某大神說不會 bash 不算真正的 unix 程序員,開始折騰 bash

12. 深入 用 shell script 管理系統。。。

13. kao!不會 C 說個p!開始深入研究 Linux 的 C 代碼。

14. 暈。 來個 gcc 編譯吧,makefile 怎麼寫。。。

15. 折騰 makefile。順帶了解了 BSD make,cmake, 各種 make。。。

16. 編譯器可以優化呢!開始深入 gcc。。。

17 。。。。

好吧。差不多可能的路徑...


Linux 學習路線

這是我畫的一幅圖,大家可以按此路線循序漸進地學習。

不過需要說明的是,第五項驅動開發和第六項嵌入式系統開發是並列的,也就是說,學習完內核之後,你可以選擇從事不同的領域,當然嵌入式開發有時會包含驅動開發。

還有就是嵌入式開發包括硬體,軟體和系統開發,假如只做硬體的話,你沒有必要按照上述路線進行,系統級開發的話,前面的是必備。

熟悉 Linux 系統,基本命令

安裝 Linux 系統,學會基本操作,熟悉文件系統,shell 腳本以及常用命令。

了解程序開發過程

搭建開發環境,了解 Linux 上程序開發過程。

學會使用文本編輯工具 Vim,編譯工具 gcc, as, 連接工具 ld, 調試工具 gdb, make 工具,會寫 makefile。

用 C 語言實現並編譯自己的測試程序。

嘗試系統編程

試著在 Linux 上用 C 語言進行系統編程,

其中需要調用 Linux 系統庫函數 (API)。

例如,實現一個需要進行網路通信、操作文件的多線程/進程程序。

以此深入了解 Linux 系統運行機制。

學習內核

上面學的差不多了,感興趣的同學可以接著學習 Linux 內核。

Linux 內核模塊如下圖

這一部分內容比較深,能把它學透的基本就是大牛了,寫個 OS 就不在話下了。

驅動開發

從這裡開始,就不是必須的了。

有興趣的朋友可以深入學習。

但是學習驅動開發無疑要把前面的都要學好。

嵌入式系統開發

學好 Linux 是嵌入式系統開發的基礎。

嵌入式開發包括很多方向,有硬體、軟體,以及系統級別。

硬體要學單片機,ARM、MIPS,DSP 等各種 MCU,Verilog, RTL, 具體就不多說了,跟 Linux 關係不太大。

軟體的話,需要了解交叉編譯,以及嵌入式環境下 C 語言的特殊用法,例如 volatile、 位操作、寄存器操作、大小端、程序跳轉等。

系統級,要了解 Linux 內核裁剪、移植、編譯、調試,還有 Bootloader 、設備驅動等。

有人讓我推薦相關的學習書籍,其實我覺得看什麼書本身不是問題,很多書的內容都差不多的,只要按照路線或者體系進行學習,就不會有太大偏差。


Linux 下的開發,目前來看有兩個比較火的方向,一是嵌入式 Linux 開發,二是高性能伺服器開發。兩個方向的場景差別巨大,所需做的積累也自然大為不同。

兩個方向同時需要的知識包括:

1. Linux 環境下基本命令、工具的使用。感覺《鳥哥的Linux私房菜》一直是這方面非常經典的著作,從中可以了解 Linux 的基本命令的用法,一些 Linux 不同於 Windows 系統的概念,如符號鏈接、硬鏈接、管道之類的。還可以學習一下 shell 編程,感覺《學習bash》不錯,可以學學腳本怎麼寫,awk、sed行編輯器、正則表達式之類方便字元串處理的工具。還有《Unix編程藝術》也很值得看一下,裡面講了許多Linux下編程的約定,比如命令行的什麼參數通常代表什麼含義等等,這可以降低整體學習Linux命令的難度

2. 編程語言的話,主要是 C 和 C++。這兩門語言差異巨大。C 有經典的四書五經,C++ 的話,有《C++編程思想》、《C++ Primer》、《Effective C++》和《Exceptional C++》,外加一本介紹 C++11 的書,這些書讀完就差不多能寫代碼了。

3. Linux 環境編程。最經典的當然還是《Unix環境高級編程》(APUE)。

4. 開發工具鏈。這包括編譯工具 GCC 和 g++,鏈接工具 ld,調試工具 gdb,二進位文件分析工具 readelf、objdump,打包工具 ar等,好包括 makefile 等。《程序員的自我修養》講鏈接、裝載和庫的,很值得好好看一下。

5. 代碼編輯器。可以用 Linux 下的 vim、emacs,也可以用 Eclipse 這樣的 IDE。

就嵌入式 Linux 而言,需要的 Linux 內核底層,以及硬體有關的知識會多一點。《Linux 設備驅動程序》(ldd)是一本非常不錯的介紹 Linux 內核設備驅動開發的書。《Linux內核設計與實現》、《UNIX操作系統設計》對內核原理的介紹比較好。哈利南的《嵌入式Linux基礎教程》和韋東山的《嵌入式Linux應用開發完全手冊》是兩本比較不錯的介紹嵌入式 Linux 的書。嵌入式 Linux 通常都是跑在 ARM 設備上的,關於 ARM,感覺講的最好的就是斯洛斯的《ARM嵌入式系統開發》,特別是其中講解 MMU 的部分,揭開了我心中關於複雜的內存管理單元的許多疑問。

多寫代碼,多閱讀優秀的源碼向來是學習軟體開發非常好的方法。Linux 內核源碼完全開源,可以從其中內核啟動、中斷管理、系統調用和設備驅動子系統等地方切入研究 Linux 內核源碼。Android 源碼也完全開發,其中包含大量非常值得學習的模塊,如嵌入式系統的標準 C 庫實現 bionic 等等。此外最好能買一塊開發板,或 Google 系手機,如 Pixel 等設備來為它們寫寫代碼玩一下。

高性能伺服器方向,所需要的網路 IO 方面的知識比較多一些。《用TCP/IP進行網際互連》卷3,UNP等等都不錯。目前非常火爆的容器 Docker,是基於 Linux 的 namespace 和 control group 實現的,相關的內容可以看一下。這個方面也有非常多優秀的開源項目可以學習,nginx、redis、memcached,libev 等等的代碼質量很好,讀起來都還傷心悅目。

暫時先寫這麼多,想到再更。


謝邀:

雖然很突兀 不過我覺得學學PYTHON會是不錯的選擇

看到有人說 「Linux 是一個無底洞」 我也想說說我對相關行業的看法 如果想玩玩就隨便了 如果想工作 務必要對某技術弄的深入

工具相關的東西可以邊做邊學


  1. 興趣

  2. 會用search engine.

有這兩條學linux就可以了。


1.Linux系統基礎,安裝分區,raid陣列,相關網路的配置,基本的目錄結構。

2.Linux常用的命令,文件管理,文本處理,grep,sed和awk工具,shell基礎。

3.資料庫首選MySQL,因為linux用得最多絕對是MySQL,增刪改查必學,特別要學熟查,查看mysql運行狀態等等。

更多:Linux運維工程師的幾點要求_PHP程序員,雷雪松的個人博客


1.有願意折騰驅動的意願

2.有願意被驅動折騰致死的意願

3.有願意解決死也解決不了的驅動的意願

然後就。沒了

只要你在windows下有良好的unix習慣(主要是願意用命令行),然後會發現,linux真的,非常好用。

還有就是不能對windows產生依賴。

//當然來**BSD也歡迎


1、熟悉下bash的基本操作及常用命令,遇到不會的,常google,並做筆記;

2、推薦APUE這本書,尤其是其中講進程環境及進程間通信的相關章節;

3、學習網路編程,推薦UNP,重點是I/O多路復用的那一章;

4、看開源代碼,推薦nginx。


Linux高級程序設計,

找些名字類似這樣的書或視頻什麼的,隨便看看,,,


英語!


APUE與UNP的確是經典,但是畢竟年代比較久遠的了,比較偏UNIX。

在Linux下進行系統編程,推薦看《The Linux Programming Interface: A Linux and UNIX System Programming Handbook》(翻譯《

Linux/UNIX系統編程手冊

》),對Linux 2.6以後添加的特有介面有解釋。如果是剛入門建議直接看這本。


推薦閱讀:

linux系統哪個版本好?
既然 Windows 在用戶量和生態體系上都能碾壓 Linux,為什麼還有人說 Linux 比 Windows 好?
Linux為什麼在桌面領域還是小眾範圍的?
Linux 內核的操作系統是不是得一直運行著?
你會在linux伺服器上安裝遠程桌面嗎?

TAG:Linux |