C程式的編譯和連結過程

來源:互聯網
上載者:User

想要編寫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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.