C++ 編譯過程

joker_2255發表於2024-08-15

原始碼 ——> 前處理器 .i 檔案——> 編譯器 .s 檔案 ——> 彙編器 .o 檔案 ——> 連結器 ——> 執行程式

前處理器:讀取程式碼裡 #開頭的命令 ,並把他插入到程式文字里,生產已.i 為字尾名的檔案

編譯器:把.i 檔案 生成彙編檔案 .s

彙編器:把彙編檔案 生成 二進位制 檔案 .a

連結器:連結其他的二進位制 檔案 生成 最終 執行程式

靜態連結 和 動態連結

1.靜態連結(在裝載之前,完成所有符號的引用)
靜態連結:連結器在連結階段將各種庫檔案和相關檔案整合到可執行檔案中,在windows下靜態連結庫以.lib結尾,linux下以.a結尾

步驟:1,空間與地址的分配,掃描所有的目標檔案,合併相似段,收集當中所有的符號資訊,

2,符號解析與重定位,調整程式碼位置

優點:程式釋出時無需帶庫,可以獨立執行

缺點:1,浪費記憶體空間,多程序作業系統下,記憶體中可能會存在多個相同的庫

2,程式開發受限,有一個模組更新,要重新編譯打包整個程式碼

2.動態連結(在執行時才進行符號重定位)
動態連結:動態連結是把連結過程在執行時進行,動態連結在可執行檔案裝載或執行的時候,由作業系統的裝載程式載入庫檔案,windows下以.dll結尾,也有.lib的,但是這個是叫做匯入庫,和靜態連結的不一樣,linux下以.so結尾。。

步驟:編譯時透過記錄一系列符號與引數,在程式執行或載入時將這些資訊傳給作業系統,作業系統將需要的動態庫載入到記憶體中去,然後再程式執行到指定的程式碼時,去共享執行記憶體中已經載入的動

相關文章