前言
說實話,很多人做了很久的c/c++,也用了很多ide,但是對於可執行程式的底層生成一片茫然,這無疑是一種悲哀,可以想象到大公司面試正好被問到這樣的問題,有多悲催不言而喻,這裡正由於換工作的緣故,所以打算系統的把之前用到的c/c++補一補。
總述
從乙個原始檔(.c)到可執行程式到底經歷了哪幾步,我想大多數的人都知道,到時到底每一步都做了什麼,我估計也沒多少人能夠說得清清楚楚,明明白白。
其實總的流程是這樣的。
預處理過程實質上是處理「#」,將#include包含的標頭檔案直接拷貝到hell.c當中;將#define定義的巨集進行替換,同時將**中沒用的注釋部分刪除等
具體做的事兒如下:
(1)將所有的#define刪除,並且展開所有的巨集定義。說白了就是字元替換
(2)處理所有的條件編譯指令,#ifdef #ifndef #endif等,就是帶#的那些
(3)處理#include,將#include指向的檔案插入到該行處
(4)刪除所有注釋
(5)新增行號和檔案標示,這樣的在除錯和編譯出錯的時候才知道是是哪個檔案的哪一行
(6)保留#pragma編譯器指令,因為編譯器需要使用它們。
gcc -e hello.c -o a.c可以生成預處理後的檔案。通過檢視檔案內容和檔案大小可以得知a.c講stdio.h和stdlib.h包含了進來。
編譯的過程實質上是把高階語言翻譯成機器語言的過程,即對a.c做了這些事兒
(1)詞法分析,
(2)語法分析
(3)語義分析
(4)優化後生成相應的彙編**
從 高階語言->組合語言
gcc -s hello.c -o a.s可以生成彙編**
彙編**如下。
彙編就是將組合語言轉成機器語言
組合語言->機器語言(二進位制)
gcc -c hello.c -o a.o將原始檔翻譯成二進位制檔案。類uinx系統編譯的結果生生成.o檔案,windows系統是生成.obj檔案。
編譯的過程就是把hello.c翻譯成二進位制檔案。
就像剛才的hello.c它使用到了c標準庫的東西「printf」,但是編譯過程只是把原始檔翻譯成二進位制而已,這個二進位制還不能直接執行,這個時候就需要做乙個動作,
gcc hello.c -o a可以生成可執行程式。即gcc不帶任何引數。ldd就可以看到你的可執行程式依賴的庫。
可以看到a.o的大小是1.1k,畢竟他只是把原始檔翻譯成二進位制檔案。a卻有7k,應該是他多了很多「繩子」吧。在執行的時候這些「繩子」就將對應的庫函式「牽過來」。很形象的比喻是不是?哈哈。libc.so.6 中就對咱們用的printf進行了定義
加c/c++學習交.流群獲取c語言、c++、windows高階程式設計,mfc框架程式設計、qt框架程式設計,linux應用程式開發,linux核心研究等系統學習路線,更有高階乾貨的直播免費學習許可權 ,都是大牛帶飛 讓你少走很多的彎路的 群…號是 787190917
專案管理 五大過程
獲得授權,定義乙個新專案或是當前現有專案的乙個新階段,正式開始該專案或階段的一組過程。1 制定專案章程 制定專案章程是制定乙份正式專案或階段的檔案,並記錄能夠反映干係人的需要和期望的初步要求。在多段專案中,這一過程可用於確認或優化在以前的制定專案章程過程中所做的相關決策。2 識別干係人 是指識別所有...
軟體測試的五大過程
軟體測試的五大過程 分析計畫 設計實現 執行什麼是測試需求 測試需求主要是解決 測什麼 的問題,即指明被測物件中什麼需要測試,測試需求通常是以軟體開發需求為基礎進行分析,通過對開發需求的細化和分解,形成可測試的內容 主要參考質量模型 測試需求應全部覆蓋已定義的業務流程,以及功能和非功能方面的需求 測...
專案管理五大過程組有感
目前,在傳統行業實行專案管理已很普遍,而在計算機資訊系統整合行業,人們越來越認識到實行專案管理的重要性。由於資訊產業的技術含量高,計算機資訊系統整合專案經常會遇到需求多變 技術更新和所處環境變化快速 人員流動頻繁等情況,所以計算機資訊系統整合行業更加需要科學規範的專案管理。因此,只有對計算機資訊系統...