編譯過程簡介

2021-06-16 14:20:12 字數 1516 閱讀 9959

被隱藏的過程

預編譯:

處理所有的注釋,以空格代替

將所有的#define刪除刪除 ,並且展開所有的巨集定義

處理條件編譯指令#if, #ifdef, #elif, #else, #endif 

處理#include ,展開被包含的檔案

保留編譯器需要使用的#pragma指令指令

預處理指令:

編譯:對預處理檔案進行一系列詞法分析 ,語法分析和語義分析

詞法分析主要分析關鍵字 ,標示符,標示符 ,立即數等是否合法

語法分析主要分析表示式是否遵循語法規則

語義分析在語法分析的基礎上進一步分析表示式是否合法

分析結束後進行**優化生成相應的彙編**

彙編:彙編器將彙編**轉變為機器可以執行的指令

每個彙編語句幾乎都對應一條機器指令

鏈結器主要作用是把各個模組之間相互引用的部分處理好,使得各個模組之間能夠正確的銜接。

靜態鏈結

執行兩個程式有兩個同樣的拷貝,浪費記憶體空間。

動態鏈結

只要吧a.out裡面要呼叫的其他庫lib1.so、lib2.so裡面的函式告訴l鏈結器是存在的,如果要呼叫stub1裡面申明的函式,就知道是外部的lib1.so裡面定義的,在執行的時候如果呼叫到這個函式,就再去動態的鏈結過去即可。

.so庫檔案沒有跟應用程式繫結在一起,如果程式需要用到庫中的函式,程式會到記憶體中.so庫中找到函式的定義,這樣好處就是幾十執行多個程式,有一部分占用的記憶體是動態鏈結庫占用的,它是乙個公共的的部分,這樣可以節省記憶體。

動態鏈結雖然節省空間,但是效率相比靜態鏈結會低一點。要用max()的時候,還要有乙個定址操作,到記憶體找lib.so庫是否存在,如果存在,直接呼叫max(),如果不存在,作業系統還要去把lib.so裝載到記憶體中,裝載過程需要時間,在裝載過程中,應該程式將被掛起不會執行,只有當lib.so完全裝載成功,max()才會呼叫。

靜態鏈結在編譯期完成,動態鏈結在執行期完成。

到底用動態鏈結還是靜態3鏈結,要看實際工程本事需要。

編譯過程簡介

程式編譯和連線的過程如下所示 編譯器的工作包括 預編譯 編譯 彙編 預編譯 處理所有的注釋,以空格代替 將所有的 define刪除,並且展開所有的巨集定義 處理條件編譯指令 if,ifdef,elif,else,endif 處理 include,展開被包含的檔案 保留編譯器需要使用的 pragma指...

c 編譯過程簡介

編譯過程簡介 目標檔案 編譯後生成的檔案,以機器碼的形式包含了編譯單元裡所有的函式和資料 匯出符號表 未解決符號表 位址重定向表等 第二種是動態鏈結程式 動態庫 將它與另乙個可 執行檔案及其它的共享目標檔案結合到一起,建立乙個程序映象 可執行檔案 o檔案在編譯後就能獲得,但是庫檔案 可執行檔案都需要...

gcc簡介及編譯過程

1 編譯器 gcc 簡介 linux系統下的 gcc gnu c compiler 是gnu推出的功能強大 效能優越的多 平台編譯器,它是gnu的代表作品之一,gcc是可以在多種硬體平台上編譯出可 執行檔案的超級編譯器,其執行效率比一般的編譯器要高出20 30 編譯器能 將c c 語言源程式 組合語...