前一陣子在QQ上和朋友聊天的時候,總會看到有人說Linux上的應用程式開發是高手才可以完成的,而且這種“迷信”在目前似乎還很普遍。然而,情況並不是這樣的,從程式庫的支援方面,Linux平台為使用者級應用程式的開發提供了很多功能強大且豐富的程式庫,而且它們大部分是跨平台的Boost、OpenGL、STL、Qt、Java等)和基於POSIX標準的glibc等),同時Linux核心還為驅動程式的開發提供了功能完備的核心介面,從開發工具方面,Linux提供了功能強大的編譯器GCC和調試器GDB,藉助它們的協助,我們可以很輕鬆的在Linu x上開發出可移植性的應用程式。既然如此,“迷信”又源於何來呢?我想,一方面由於詳細介紹Linux各種開發的書籍較少,各種Linux應用在國內仍不普及,另一方面則是由於很多人在安裝好一個Linux後,苦於找不到一個得心應手的IDE環境,從而感到不知所措,畢竟,我們很多人都習慣了寫好程式後,按下F5,剩下的任務就讓IDE全權代理了。其實想在Linux下如此這般當然也沒問題。既然說到了IDE,就讓我們從它開始吧,相信選擇一個好的IDE環境是你整個學習過程的一個不錯的開始。
工欲善其事必先利其器——IDE篇
其實Linux下有許多功能強大的IDE環境,因為從某種意義上說,Linux是專為開發人員準備的作業系統,這個東西當然少不了,在這裡為讀者介紹一些比較常用的IDE。
KDevelop
這是一個用Qt開發的IDE,其主要支援的語言是C / C++,
Eclipse
近年來,eclipse可以說發展極為迅速,它不僅是一個以java為主的開發平台,其功能強大的外掛程式體繫結構使得它可以被當作各種應用程式來使用。作為各種外掛程式的載體,eclipse提供了完整的GUI介面,使用者完全可以藉助eclipse來只關心自己想做的工作。
Emacs
VIM
山高月曉水落石出——IDE背景故事GCC篇
前面我們簡要介紹了一些IDE環境,其中所有C/C++相關程式的編譯都是由GCC來完成的,而IDE只不過起到了一個收集編譯資訊和為我們的項目產生makefile等作用後面我們會提到)。出於目前Linux開發的特點,C仍是系統開發的主流語言。所以,對GCC有一個全面的瞭解是很有必要的,一旦IDE不能滿足你的需求,我們要有手工打造程式的能力,而且出於學習的目的,我們往往不需要IDE產生的那些複雜的檔案,為一個Hello world產生2M多的檔案顯然是多餘的。
GCC的全稱是GNU Compiler Collection,從這個名字我們不難看出,GCC代表著一個編譯器的集合,目前GCC可以支援C, C++, Objective-C, Objective-C++, Fortran, Java, and Ada等語言。但是出於一般性考慮,我們這裡只討論GCC中的C/C++部分。
目前GCC的最新發行版是4.0.0,但是這個版本由於使用了新技術和新的編碼規範,很多舊的代碼都需要修改才可以通過編譯,所以並不推薦使用這個版本。而相對穩定的新版本目前是3.4.4,大家可以到GNU的首頁上更新下載。那麼究竟GCC強大在哪裡,如何使用?下面我就通過幾個簡單而實際的例子帶你看看GCC提供的強大功能。
通過Helloworld的編譯熟悉GCC的基本使用方法
似乎為所有新語言提供一個Hello World樣本程式已經成為了一種不成文的標準,人們通過它來認識語言的一些基本要素。在這裡,我們使用一個Hello World來看看如何用GCC產生可執行檔。
把上面的檔案存成helloworld.c,之後開啟控制台,輸入如下的命令gcc helloworld.c –o helloworld如果一切正常的話,你的控制台上應該沒有任何輸出。用ls查看你的工作目錄,你會發現目錄下多了一個名為helloworld的可執行檔,之後,執行./hellworld
就會看到這個程式的輸出了
很簡單不是嗎?但是學過電腦的朋友都應該知道,程式的編譯過程要分為所示的過程而GCC的強大之處就在於它允許你在上面所示的任何一個過程中停下來查看中間結果,並對其加以控制。
1. 預先處理首先是預先處理過程,GCC的-E選項可以讓GCC在預先處理後停止編譯,並向標準輸出列印預先處理過後的檔案。下面的-o用於指定輸出檔案的檔案名稱。
gcc –E hellowrold.c –o helloworld.cpp下面是helloworld.cpp的一部分的內容,我們看到,檔案已經包含了stdio.h中的內容。
如果我們想執行下一步的編譯過程,可以繼續使用GCC的-x 選項,該選項用於顯示指定檔案的尾碼名而不是讓編譯器根據尾碼來自行判斷)。我們比較常用的language type有如下幾種,(如果讀者想獲得更為完整參數說名,請參考GCC manual):
l c c-header c-cpp-output
l c++ c++-header c++-cpp-output
l assembler assembler-with-cpp
另外,下表列出了常用的GCC尾碼名
當然,你也可以省略掉language type的部分,這時候GCC會根據檔案的尾碼名自行判斷,就像你沒有使用該選項一樣。