国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

GCC編譯過程:預(yù)處理->編譯->匯編->鏈接

這篇具有很好參考價(jià)值的文章主要介紹了GCC編譯過程:預(yù)處理->編譯->匯編->鏈接。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

引言

?概括介紹

一、預(yù)處理

二、編譯

三、匯編

四、鏈接

總結(jié)


引言

當(dāng)使用集成開發(fā)環(huán)境(IDE)進(jìn)行C語言編程時(shí),點(diǎn)擊"編譯"按鈕后,整個(gè)C程序從源代碼到可執(zhí)行文件的生成過程會(huì)自動(dòng)完成。IDE會(huì)在后臺(tái)為我們執(zhí)行C語言的編譯過程,將源代碼轉(zhuǎn)換為最終的可執(zhí)行文件。雖然IDE隱藏了底層的細(xì)節(jié),但理解編譯過程對(duì)于程序員來說仍然是很有價(jià)值的。

?概括介紹

gccg++都是GNU編譯器套件(GNU Compiler Collection,簡(jiǎn)稱GCC)的一部分,其中gcc用于編譯C語言代碼,而g++用于編譯C++語言代碼。它們的編譯過程在大部分情況下是類似的,但根據(jù)輸入文件的擴(kuò)展名和一些默認(rèn)選項(xiàng)的不同,它們會(huì)調(diào)用不同的編譯器前端,即C前端或C++前端。

下面是gccg++的編譯過程的概述

  1. 預(yù)處理(Preprocessing):首先,對(duì)源文件進(jìn)行預(yù)處理。預(yù)處理器將處理源代碼中的預(yù)處理指令,比如以#開頭的指令,如#include、#define等,并展開宏定義。預(yù)處理后的代碼會(huì)生成一個(gè).i文件,通常是在臨時(shí)目錄中。

  2. 編譯(Compiling):接下來,編譯器前端會(huì)將預(yù)處理后的源代碼編譯成匯編代碼(.s文件)。此階段會(huì)檢查語法和語義錯(cuò)誤,并進(jìn)行優(yōu)化,但不會(huì)生成可執(zhí)行代碼。

  3. 匯編(Assembling):匯編器(as)將匯編代碼轉(zhuǎn)換成機(jī)器代碼,并生成目標(biāo)文件(.o文件)。

  4. 鏈接(Linking):最后,鏈接器(ld)將目標(biāo)文件與所需的庫文件鏈接在一起,生成最終的可執(zhí)行文件。

GCC編譯過程:預(yù)處理->編譯->匯編->鏈接,C++,Linux,匯編,c++,嵌入式硬件

下面讓我們?cè)贚inux環(huán)境下簡(jiǎn)單示例C程序編譯過程加深理解

代碼示例(main.c):

#include<stdio.h>

int main(){
    printf("Hello Linux\n");
    return 0;
}

一、預(yù)處理

預(yù)處理是編譯過程的第一步,它處理以#開頭的預(yù)處理指令,并展開宏定義。預(yù)處理器會(huì)執(zhí)行以下主要任務(wù):

  • 處理#include指令:將指定的頭文件內(nèi)容插入到源代碼中。這樣,可以在源文件中使用其他函數(shù)或變量的聲明和定義。

  • 處理宏定義:將代碼中定義的宏展開為對(duì)應(yīng)的表達(dá)式或語句。例如,#define MAX_VALUE 100將會(huì)在源代碼中把所有MAX_VALUE替換為100。

  • 處理?xiàng)l件編譯指令:如#ifdef、#ifndef、#if等,這些指令根據(jù)條件判斷是否編譯部分代碼塊。

預(yù)處理后的代碼會(huì)生成一個(gè).i文件,這是一個(gè)展開了所有宏和包含了所有頭文件的中間文件。

語法示例

gcc -E main.c -o main.i

GCC編譯過程:預(yù)處理->編譯->匯編->鏈接,C++,Linux,匯編,c++,嵌入式硬件

?命令中-E是讓編譯器在預(yù)處理之后就退出,不進(jìn)行后續(xù)編譯過程,-o是指定輸出文件名。

使用該指令的結(jié)果是將stdio.h文件全部?jī)?nèi)容插入到main.c形成main.i文件。

可以看到預(yù)處理之后的main.i文件顯然比main.c文件大得多。我們查看一下main.i文件,因?yàn)榇藭r(shí)main.i依然是文本文件。

(使用head指令查看main.i文件)

GCC編譯過程:預(yù)處理->編譯->匯編->鏈接,C++,Linux,匯編,c++,嵌入式硬件

二、編譯

編譯是預(yù)處理后代碼的第二個(gè)階段。編譯器前端(例如cc1cc1plus)接收預(yù)處理后的代碼,并將其轉(zhuǎn)換成匯編代碼。在編譯階段,編譯器執(zhí)行以下主要任務(wù):

  • 語法和語義檢查:編譯器檢查代碼是否符合C/C++語法規(guī)則,并進(jìn)行語義分析,以確保代碼沒有邏輯錯(cuò)誤。

  • 生成中間表示:編譯器將代碼轉(zhuǎn)換成中間表示形式,通常是一種低級(jí)的、與特定硬件無關(guān)的表示。

  • 優(yōu)化:編譯器可能對(duì)中間表示進(jìn)行優(yōu)化,以提高程序的執(zhí)行效率和代碼質(zhì)量。

編譯階段不會(huì)生成可執(zhí)行文件,而是將代碼轉(zhuǎn)換成匯編代碼,通常保存為.s文件。

語法示例

gcc -S main.i -o main.s

GCC編譯過程:預(yù)處理->編譯->匯編->鏈接,C++,Linux,匯編,c++,嵌入式硬件

命令中-S讓編譯器在編譯之后停止,不進(jìn)行后續(xù)編譯過程,-o是指定輸出文件名。

編譯成匯編文件大小已經(jīng)非常小了,相對(duì)于預(yù)處理之后的main.i文件小很多。

編譯過程完成后,將生成程序的匯編代碼test.s,這也是文本文件。我們查看一下。

GCC編譯過程:預(yù)處理->編譯->匯編->鏈接,C++,Linux,匯編,c++,嵌入式硬件

?圖中即為main.s中的匯編代碼。

三、匯編

在匯編階段,匯編器(as)接收編譯生成的匯編代碼,并將其轉(zhuǎn)換為機(jī)器代碼。匯編器的任務(wù)包括:

  • 將匯編代碼轉(zhuǎn)換為機(jī)器代碼:將匯編代碼中的匯編指令翻譯成特定硬件架構(gòu)能理解的機(jī)器指令。

  • 生成目標(biāo)文件:生成一個(gè)或多個(gè)目標(biāo)文件(.o文件),每個(gè)文件對(duì)應(yīng)一個(gè)源文件或編譯單元。

目標(biāo)文件是機(jī)器代碼的二進(jìn)制表示形式,但它們還不是最終可執(zhí)行的程序,因?yàn)槟承┓?hào)引用可能仍然未解析。

語法示例

gcc -c main.s -o main.o

GCC編譯過程:預(yù)處理->編譯->匯編->鏈接,C++,Linux,匯編,c++,嵌入式硬件

命令中-c選項(xiàng),它告訴gcc只進(jìn)行編譯,不進(jìn)行鏈接。因此,這個(gè)命令只會(huì)將匯編代碼轉(zhuǎn)換為目標(biāo)文件,而不會(huì)生成可執(zhí)行文件。-o是指定輸出文件名。

目標(biāo)文件test.o二進(jìn)制表示的機(jī)器代碼,可以作為鏈接的輸入,用于生成最終的可執(zhí)行文件。

四、鏈接

  • 鏈接器接收一個(gè)或多個(gè)目標(biāo)文件,以及所需的庫文件,并將它們合并成最終的可執(zhí)行文件。
  • 鏈接器解析目標(biāo)文件中的符號(hào)引用,找到對(duì)應(yīng)的符號(hào)定義,并將符號(hào)重定位,以便正確地指向它們的定義。
  • 合并庫文件,生成完整的可執(zhí)行文件,其中包含所有的機(jī)器代碼和解析后的符號(hào)。

語法示例

gcc main.o -o main

命令gcc main.o -o main是將目標(biāo)文件(main.o)鏈接為可執(zhí)行文件(main)的gcc命令。在這個(gè)命令中,我們沒有使用-c選項(xiàng),因此gcc會(huì)進(jìn)行鏈接操作,生成最終的可執(zhí)行文件。

當(dāng)執(zhí)行gcc main.o -o main命令時(shí),gcc會(huì)將目標(biāo)文件main.o與所需的庫文件(如果有的話)一起進(jìn)行鏈接,并生成最終的可執(zhí)行文件main。這個(gè)可執(zhí)行文件就是可以在Linux下運(yùn)行的C程序。

GCC編譯過程:預(yù)處理->編譯->匯編->鏈接,C++,Linux,匯編,c++,嵌入式硬件

?執(zhí)行./main命令會(huì)運(yùn)行名為main的可執(zhí)行文件。這是我們之前用gcc命令生成的C程序的可執(zhí)行文件。

總結(jié)

生成可執(zhí)行程序過程為成四個(gè)步驟:

  1. 由.c文件到.i文件,這個(gè)過程叫預(yù)處理。
  2. 由.i文件到.s文件,這個(gè)過程叫編譯。
  3. 由.s文件到.o文件,這個(gè)過程叫匯編。
  4. 由.o文件到可執(zhí)行文件,這個(gè)過程叫鏈接。

在集成開發(fā)環(huán)境中,點(diǎn)擊"編譯"按鈕后,IDE會(huì)自動(dòng)完成上述四個(gè)階段,無需手動(dòng)執(zhí)行每個(gè)步驟。如果沒有編譯錯(cuò)誤,最終的可執(zhí)行文件將生成并可以在IDE中直接運(yùn)行。

雖然IDE為我們提供了方便的編譯工具,但了解C語言的編譯過程仍然對(duì)于程序員來說是重要的,特別是在解決一些編譯錯(cuò)誤或進(jìn)行優(yōu)化時(shí),理解底層過程可以幫助我們更好地理解和改進(jìn)代碼。文章來源地址http://www.zghlxwxcb.cn/news/detail-636460.html

到了這里,關(guān)于GCC編譯過程:預(yù)處理->編譯->匯編->鏈接的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • c語言中編譯過程與預(yù)處理

    c語言中編譯過程與預(yù)處理

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 在c語言的一個(gè)項(xiàng)目中會(huì)有很多.c文件,這些.c文件就是源文件,組成一個(gè)程序的每個(gè)源文件通過編譯過程分別轉(zhuǎn)換成目標(biāo)代碼(object code),即每個(gè)源文件都轉(zhuǎn)換為對(duì)應(yīng)的目標(biāo)文件,即.obj文件。 然后這些

    2024年02月11日
    瀏覽(20)
  • 【ARM 嵌入式 編譯系列 2.1 -- GCC 預(yù)處理命令 #error 和 #warning 詳細(xì)介紹 】

    在C語言中, #error 和 #warning 預(yù)處理指令可以用于在編譯時(shí)生成錯(cuò)誤或警告信息,通常用于調(diào)試或當(dāng)代碼中某些條件未滿足時(shí)提醒開發(fā)者。當(dāng)這些指令被編譯器處理時(shí),會(huì)自動(dòng)包含出現(xiàn)這些指令的文件名和行號(hào),所以你可以清楚地看到問題出現(xiàn)的位置。 #error 當(dāng)編譯器遇到 #e

    2024年01月22日
    瀏覽(68)
  • 程序環(huán)境和預(yù)處理(含C語言程序的編譯+鏈接)--2

    程序環(huán)境和預(yù)處理(含C語言程序的編譯+鏈接)--2

    文章前言: 上章我們把? ? ? 程序的翻譯環(huán)境? ? ?程序的執(zhí)行環(huán)境? ?C語言程序的編譯+鏈接? ? ?預(yù)定義符號(hào)介紹? ? 預(yù)處理指令? ?#define? ? 宏和函數(shù)的對(duì)比? ? ?預(yù)處理操作符? ? #和##的介紹 ? 的相關(guān)知識(shí)進(jìn)行了梳理講解,接下來被把剩余知識(shí)? ? 命令定義? ? ?預(yù)處

    2024年02月14日
    瀏覽(31)
  • 【C語言】從預(yù)處理到機(jī)器代碼的C語言編譯過程解析

    當(dāng)我們編寫一個(gè)C語言程序時(shí),我們需要經(jīng)歷一個(gè)編譯的過程,將源代碼轉(zhuǎn)換為可執(zhí)行的機(jī)器代碼。這個(gè)過程涉及到多個(gè)階段和環(huán)節(jié),每個(gè)階段都有其特定的任務(wù)和功能。在本篇博客中,我們將詳細(xì)介紹C語言的編譯過程。 目錄 一、預(yù)處理階段(Preprocessing) 二、詞法分析階段

    2024年02月13日
    瀏覽(18)
  • 編譯預(yù)處理:#if

    #if expression … #elif … #end expression 是整數(shù)常量比較的表達(dá)式,例如: defined表達(dá)式,例如 defined AAA, 或者 defined(AAA), 如果AAA是一個(gè)宏定義,return true,否則,return false; 單個(gè)整數(shù),例如:1/10/100/0, 非零為true,零為false; 整數(shù)比較,例如:1 == 1為true, 0 == 0為ture, 1 2為false; 單個(gè)

    2023年04月14日
    瀏覽(19)
  • C/C++預(yù)處理過程

    C/C++預(yù)處理過程

    目錄 前言: 1. 預(yù)定義符號(hào) 2.?#define定義常量 3.?#define定義宏 4. 帶有副作用的宏參數(shù) 5.??宏替換的規(guī)則 6.?宏和函數(shù)的對(duì)比 7. #和## 8. ?命名約定 9. ?#undef 10. ?命令行定義 11. ?條件編譯 12. ?頭文件的包含 13. ?其他預(yù)處理指令 總結(jié):。 1. 預(yù)定義符號(hào) c語言定義了一些預(yù)處理的

    2024年04月26日
    瀏覽(13)
  • 【C語言:編譯、預(yù)處理詳解】

    【C語言:編譯、預(yù)處理詳解】

    我們都知道,一個(gè)程序如果想運(yùn)行起來要經(jīng)過編譯、鏈接然后才能生成.exe的文件。 編譯?可以分解為三個(gè)過程: 預(yù)處理(有些書也叫預(yù)編譯)、 編譯 匯編 預(yù)處理階段 主要處理那些源文件中以#開始的預(yù)編譯指令。比如:#include,#define,處理的規(guī)則如下: 刪除所有的注釋

    2024年02月03日
    瀏覽(24)
  • 預(yù)處理/預(yù)編譯詳解(C/C++)

    預(yù)處理/預(yù)編譯詳解(C/C++)

    ? ? ? ? 在上一篇的bolg中的編譯與鏈接中提到過 預(yù)處理 ,但只是較為簡(jiǎn)單的講解,本篇將會(huì)對(duì)預(yù)處理進(jìn)行詳細(xì)的講解。 ? ? ? ? 其中在預(yù)處理中很重要的一個(gè)一個(gè)知識(shí)點(diǎn)是#define定義常量與宏,還區(qū)分了宏與函數(shù)的區(qū)別,以及#和##符號(hào),還涉及條件編譯頭文件的包含等等。

    2024年01月17日
    瀏覽(23)
  • 【C語言深入】深入理解程序的預(yù)處理過程

    【C語言深入】深入理解程序的預(yù)處理過程

    我們平時(shí)所寫的每一個(gè).c文件都會(huì)經(jīng)過編譯和連接的過程之后才會(huì)形成一個(gè)可執(zhí)行程序: 今天我們就來詳細(xì)的看看編譯和連接這兩個(gè)過程的具體細(xì)節(jié)。 程序的翻譯環(huán)境與執(zhí)行環(huán)境 在ANSI C的任何一種實(shí)現(xiàn)中,存在兩個(gè)不同的環(huán)境。 第1種是翻譯環(huán)境,在這個(gè)環(huán)境中源代碼被轉(zhuǎn)換

    2023年04月08日
    瀏覽(24)
  • 【c語言】詳解c語言#預(yù)處理期過程 | 宏定義前言

    【c語言】詳解c語言#預(yù)處理期過程 | 宏定義前言

    c語言系列專欄:?c語言之路重點(diǎn)知識(shí)整合?? 創(chuàng)作不易,本篇文章如果幫助到了你,還請(qǐng)點(diǎn)贊支持一下???)!!? 主頁專欄有更多知識(shí),如有疑問歡迎大家指正討論,共同進(jìn)步! 給大家跳段街舞感謝支持!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 代碼編譯到執(zhí)

    2024年02月01日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包