C C gcc編譯過程

2021-10-08 06:32:54 字數 1804 閱讀 5012

c/c++程式編譯流程: 預處理->編譯->彙編->鏈結

具體的就是:

源**(source coprede)→預處理器(processor)→編譯器(compiler)→匯程式設計序(assembler)→目標程式(object code)→鏈結器(linker)→可執行程式(executables)

gcc常用選項:

選項功能

-v檢視gcc 編譯器的版本,顯示gcc執行時的詳細過程

-o指定輸出檔名為file,這個名稱不能跟源檔名同名

-e只預處理,不會編譯、彙編、鏈結

-s只編譯,不會彙編、鏈結

-c彙編,不鏈結

示例:main.c;mymath.h;mymath.c

// main.c

#include

#include

"mymath.h"

// 自定義標頭檔案

intmain()

intsub

(int a,

int b)

一:預處理

預處理階段將根據已放置在檔案中的預處理指令來修改原始檔的內容。

1、把你所有引用的標頭檔案開啟來插入到我們本身的程式中。

2、預處理階段會把我們程式中的所有巨集進行替換掉,我們經常在程式開頭定義乙個巨集定義,那巨集定義的替換就是在預處理階段完成的。

3、我們在編寫程式的時候常常會寫入一些注釋,對程式並沒有作用,所以在預處理階段程式會把我們寫入的編譯刪除掉,機器是看不到我們寫的注釋的。

4、我們的條件編譯我們常常會寫#ifdef這時候我們不符合條件的那一部分我們機器也是不會看到的,他不會進入到編譯階段。

gcc -e mymath.c -o mymath.i

gcc -e main.c -o main.i

二:編譯

編譯階段主要完成的任務就是由編譯器來檢查一下你的程式是不是有問題是不是有一些語法錯誤,在ide下編寫程式的時候也會編譯一下看看我們的程式有沒有error或者warning再去執行。當你的程式沒有問題的時候編譯還會把c程式程式設計組合語言。

gcc -s mymath.i -o mymath.s

gcc -s main.i -o main.s

三:彙編

彙編階段就是把我們第二階段生成的彙編**變成我們的可執行檔案,也就是把我們的組合語言變成機器語言。

gcc -c mymath.s -o mymath.o

gcc -c main.s -o main.o

四:鏈結

鏈結截斷實現某個原始檔中的函式可能引用了另乙個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決,執行鏈結後生成的是程式的執行檔案。

gcc main.o -o main mymath.o

./main //執行

正常我們執行gcc main.c -o main mymath.c會經過上述過程

file.i: 預處理 c 源**後產生的中間檔案(intermediate file)

file.s: 彙編**檔案(assembly file)

file.o:目標檔案(object file)

編譯原理 編譯過程概述

編譯程式即是將高階語言書寫的源程式翻譯成與之等價的目標程式 組合語言或機器語言 其工作可分為六個階段,見下圖 對於編譯的各個階段,邏輯上可以劃分為前端和後端兩部分。前端包括詞法分析到中間 生成中各個階段的工作,後端則是優化及目標 生成的階段。以中間 為分水嶺的原因是把編譯過程分解為與機器有關和無關兩...

編譯選項 HarmonyOS編譯過程

全文約1300字,閱讀約需要4分鐘 編譯選項 編譯過程 python build.py wifiiot完成了hi3861開發板所需版本的編譯,這一篇具體說一下這個編譯過程。編譯選項 當前harmonyos一共支援四個引數 product 具體要編譯的專案 b build type release o...

編譯原理 編譯的過程

預處理 prepressing 展開巨集定義 處理 define,include 刪除注釋,新增行號和檔名標識。生成.i 預處理檔案 編譯 compilation 詞法分析 語法分析 語義分析 優化。預處理 編譯用ccl完成。生成.s 彙編 檔案 彙編 assembly 把彙編 轉成機器可執行的指令...