想要編寫C代碼,就必須得有一個編譯環境。簡單地說,程式從我們的大腦到實現,要經過一下過程:
顯然,我們的最終目標是4。但是我們所能操縱的是1。在1中,我們用各種各樣的編輯軟體,寫我們的C語言原始碼,並將其儲存為.c結尾的源檔案。形如:
裡面的內容形如:
接下來,想要把這部分原始碼變成.exe的可執行程式,是非常困難的。幸運的是,我們有一整套的編譯系統,可以協助我們完全自動化地完成這部分工作。
TCC就是這樣的一個編譯系統。當然Visual C++ 6.0也是這樣的一個編譯系統。所以我們經常說“你用的是什麼編譯器?”“哦,我用的是VC++ 6.0。”講的就是所用的編譯系統。
真正的編譯系統其實會做兩件事,第一件是所謂的“編譯”:把.c的原始碼檔案編譯成.obj結尾的目標檔案。
目標檔案已經是二進位檔案了,也就是說,你已經無法看懂裡面的內容了。在編譯的過程中,如果編譯系統發現任何原始碼錯誤(比如使用一個從未聲明過的變數),就會報錯,這時候,程式員,也就是你,就必須回過頭來修改自己的.c源檔案,希望能夠將來能夠通過編譯了。
如果你的.c源檔案已經通過了編譯,就會產生.obj的目標檔案。需要指出的是,根據平台的不同,.obj的副檔名可能發生變化,比如在windows下,可能產生的是.obj檔案,而在linux平台下,可能產生的是.o的檔案。但無論如何,這個所謂的“目標檔案”已經是二進位代碼的檔案了,而且是平台無關的。所謂的“平台無關”你可以理解成,這個二進位檔案既可以變成在windows平台下啟動並執行程式,也可以變成在linux等其他平台下啟動並執行程式。
要想將二進位的“目標程式”變成真正可以啟動並執行“可執行程式”還需要依靠編譯系統。這裡,用到的是編譯系統會做的第二件事:連結。連結,就是把目標程式變成真正可以(雙擊)執行的.exe可執行檔(windows環境)。
你可能會奇怪:為什麼要產生所謂的“目標檔案”,而不是直接產生.exe的“可執行檔”呢?原因是這樣的:有的程式員所寫的程式可能非常的牛,有機會在許許多多不同的平台下運行(從windows到linux到iphone到Android,不一而足)。這時候,這些程式員發布自己的程式時,很可能不會選擇發布原始碼(商用程式,要保密),而他自己也沒辦法為每一個可能的平台逐個產生可執行程式;那他就會選擇發布“目標檔案”的形式。使用者收到“目標檔案”之後,既可以隨心所欲地在任何平台上通過編譯系統的“連結”功能產生對應平台的“可執行程式”,也不會瞭解到程式員的原始碼是如何編寫的,從而保護了商業秘密。如所示:
在從2-->3的(連結)過程後,產生4的可執行程式看起來像這樣:(windows環境)
注意到該檔案的副檔名是.exe。這就是我們真正可以在windows下執行的程式。
有的同學在培訓的時候,看到我寫C代碼時,用的不是VC++ 6.0的編譯器,覺得很新鮮。請繼續看下面的2篇文章介紹:
1、編寫C原始碼的利器:Notepad2介紹:http://www.cnblogs.com/fzd19zx/archive/2011/01/22/1942192.html
2、TCC(Tiny C Compiler)介紹:http://www.cnblogs.com/fzd19zx/archive/2011/01/22/1942191.html