2010年1月20日 星期三

C語言- GCC, 程式compile流程, STL

GCC Gnu Compiler Collection(GCC),應該是GNU最有名的傑作了。很多研 究單位不想多花錢買商用的compiler就用gcc來compile。本來gcc的意思是 專指gnu c compiler,不過後來延伸出pascal,fortran等等只要是GNU負責的 都是,不過我們還是指有c/c++/object c 的gnu compiler package 。他的功能跟強大不是一般compiler比得上的。

它可以是個cross-compiler,也就是它可以在Intel的機器上編譯程式,但是這 個程式是Sun Sparc Solaris的執行檔,反之也可以,只要他有支援的機器,作 業系統,就可這樣亂七八糟的愛怎麼編就怎麼編。現在最流行的就是arm這顆 CPU,或者palm的程式寫作,用gcc實在是太好用了。

而且這個編譯器是免費的,不要說怎麼這麼陽春,沒有IDE,基本上寫作大程式, 是沒有這些東西的,寫程式寫到好幾萬行時,那些已經沒有一個清醒的頭 腦重要了。因此要會真正的C功力,要寫真正有用的程式,非gcc莫屬了。 這是一個免費的練習的好軟體。

通常一個編譯過程通常需要4道程序

1.preprocess 先處理那些#ifdef #define這些東西並做一些巨集代換
2.compile 做語意分析,翻譯成組合語言
3.assemble 翻成機器碼與OS有關的格式,做成relocatable obj檔。
4.link 找到symbol(函式,變數名)與程式庫(shared obj)中的副程式 ,做成可執行obj檔(executable obj)。[1]

其中,.h 檔存的就是相關 .c (或 .cpp) 裡面函式的原型 (也叫函式宣告). 而 .c (或 .cpp) 裡面存的是函式的定義.

而在C++中,有個所謂的標準函式庫(STL:Standard Template Library),其跟C主要差別在此就是個Template的概念。標準函式庫裡面各函式的定義早已預先編譯好了, 放在一或多個 .lib 檔裡 (Library 檔是 .obj 檔的總收集). 很多 IDE 或 linker 會自動的使用這些跟編譯器一起配套的, 常用的 .lib 檔. IDE 的專案設定裡有個設定可以關掉這個自動的使用, 如果你關掉的話, 你就會得到許許多多的 linker 錯誤.[2]

標準的C函式庫以及C++的STL可以到C++ Reference來做查詢
http://www.cppreference.com/wiki/


延伸閱讀:gcc參數指令 、 GNU Compiler Collection (GCC) 、 gcc(3.4.6) Optimize-Options

References:
[1]http://www.study-area.org/cyril/opentools/opentools/gcc.html#AEN848
[2]http://blog.yam.com/htshboy/article/13869891

沒有留言:

張貼留言