女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C程序的完整編譯過程

CHANBAEK ? 來源:郎哥編程課堂 ? 作者: 郎宏林 ? 2023-11-15 17:14 ? 次閱讀

本文討論了C程序的完整編譯過程,分別講述了預(yù)處理、編譯、匯編、鏈接各階段完成的編譯任務(wù)。然后通過一個編譯實例,探討了各階段輸出的文件。

編譯和鏈接

前面了解C程序結(jié)構(gòu),也編寫了第一個C程序源代碼,但計算機并不能直接執(zhí)行C程序源代碼。因為C語言是高級語言,計算機不能識別高級語言編寫的代碼,還需要把寫好的C程序源代碼轉(zhuǎn)換為計算機能識別的機器語言代碼,這個過程稱為C程序的編譯過程。編譯過程如圖1-7所示。

圖片

圖 1-7 C程序編譯過程

從圖1-7可以看出,C程序編譯過程分為四個階段:第一階段是預(yù)處理階段;第二階段是編譯階段;第三階段是匯編階段;第四階段是鏈接階段。執(zhí)行這四個階段的程序(預(yù)處理器、編譯器、匯編器、和鏈接器)一起構(gòu)成了C語言的編譯系統(tǒng)。

預(yù)處理階段:預(yù)處理階段主要用于處理源文件中的預(yù)處理指令,并根據(jù)指令對源代碼進行修改和補充。例如:“#include”指令將頭文件的內(nèi)容補充到源文件內(nèi);“#define”指令用于宏定義,通過宏定義可以進行條件編譯和內(nèi)容替換。

編譯階段:編譯階段主要用于對預(yù)處理后的文件進行詞法和語法分析,并將其翻譯成與源代碼等價的匯編代碼。

匯編階段:匯編階段將編譯輸出的匯編代碼轉(zhuǎn)換為機器代碼,機器代碼也稱為目標代碼,該代碼與計算機硬件相關(guān)。

鏈接階段:鏈接階段將多個目標代碼文件、函數(shù)庫文件鏈接成可執(zhí)行文件。

**編譯實例 **

下面以《C程序結(jié)構(gòu)》中的面積計算器程序為例,在Ubuntu系統(tǒng)下使用GCC編譯器,對面積計算器程序進行編譯和鏈接。

面積計算器程序可以計算長方形、正方形、平行四邊形和三角形的面積,它由main.c、rectangle.c、square.c、paraller.c、triangle.c、area.h五個源文件和一個頭文件構(gòu)成,area.h頭文件描述了面積計算函數(shù)的原型。面積計算器程序結(jié)構(gòu)如圖所示。程序代碼請參見《C程序結(jié)構(gòu)》。

圖片

圖 1-8 面積計算器程序結(jié)構(gòu)

預(yù)處理階段

預(yù)處理階段主要處理C程序源文件內(nèi)的預(yù)處理指令,如#include指令、宏定義等。預(yù)處理階段會對所有的C源文件進行預(yù)處理,預(yù)處理后的文件也是文本文件,可以使用文本編輯器打開,不過其文件大小要比C源文件大的多,因為預(yù)處理后的文件會將#include指令引入的頭文件寫入到C源文件內(nèi)。面積計算器的main.c文件使用了#include指令,主要代碼如下:

//引入C語言標準輸入輸出函數(shù)庫
//stdio.h是標準輸入輸出函數(shù)庫的頭文件
#include
//引入面積計算器函數(shù)頭文件
include "area.h"
void main()
{
……
}

GCC編譯器提供了如下命令對C源文件進行預(yù)處理:

gcc -E C源文件-o [預(yù)處理后文件]

例如:

gcc -E main.c -o main.i

對main.c文件進行預(yù)處理,預(yù)處理后的文件為main.i。執(zhí)行上述預(yù)處理命令時,需要gcc能夠找到main.c文件。

main.c預(yù)處理后文件main.i要比main.c大很多,感興趣的同學(xué)可以實際操作后,用文本編輯器打開main.i文件,看看里面的內(nèi)容。

圖片

面積計算器程序所有C源文件預(yù)處理后的文件列表,從列表中可以看出,除了main.c文件外,其它預(yù)處理后文件和C源文件大小變化不大,這是因為這些C源文件沒有包含頭文件。

圖片

編譯階段

編譯階段將預(yù)處理后文件轉(zhuǎn)換為匯編代碼,編譯后的匯編代碼也是文本文件,可以直接使用文本編輯器打開匯編代碼。

GCC編譯器提供了如下命令對預(yù)處理后文件進行編譯:

gcc -E 預(yù)處理后文件-o [匯編代碼]

例如:

gcc -S square.i -o square.s

對square.i文件進行編譯,編譯后的文件為square.s。執(zhí)行上述預(yù)處理命令時,需要gcc能夠找到square.i文件。

編譯后匯編代碼如下圖所示:

圖片

匯編階段

匯編階段將匯編代碼轉(zhuǎn)換為機器代碼(機器可以直接執(zhí)行的CPU指令),轉(zhuǎn)換程序也稱為匯編程序。由于不同CPU架構(gòu)的計算機,其提供的指令集不同,支持運行的機器代碼也不同,因此,要運行在不同CPU架構(gòu)的計算機上,就需要運行支持該CPU架構(gòu)的匯編程序。例如IBM-PC機采用了Intel X86系列處理器,單片機一般采用ARM架構(gòu)的系列處理器,如果要讓編寫的匯編程序運行在IBM-PC機上,就需要調(diào)用支持IBM-PC指令集的匯編程序,如果要讓編寫的匯編程序運行在ARM架構(gòu)的計算機上,就需要調(diào)用支持ARM指令集的匯編程序。

匯編階段輸出的文件為目標文件,它是二進制格式,不能使用文本編輯器瀏覽文件內(nèi)容。GCC編譯器提供了如下命令對C源文件進行預(yù)處理:

gcc -c 匯編代碼文件-o [目標文件]

例如:

gcc -c rectangle.s -o rectangle.o

對rectangle.s文件進行匯編,匯編后的文件為rectangle.o。執(zhí)行上述預(yù)處理命令時,需要gcc能夠找到rectangle.s文件。

匯編階段執(zhí)行后,面積計算器程序文件列表如下圖所示:

圖片

鏈接階段

面積計算器程序在匯編階段輸出了main.o、square.o、triangle.o、rectangle.o、paraller.o目標文件,在鏈接階段需要將這些目標文件鏈接為可執(zhí)行文件。鏈接使用ld命令,ld是GCC提供的鏈接器,將目標文件與函數(shù)庫鏈接為可執(zhí)行程序或庫文件。不過ld鏈接器一般不獨立使用,由GCC自動調(diào)用鏈接器。

輸入下面的命令:

gcc main.c paraller.c rectangle.c square.c triangle.c

即可完成面積計算器程序的編譯和鏈接。

本文小結(jié)

通過以上分析可知,C程序的編譯過程要經(jīng)過預(yù)處理、編譯、匯編和鏈接四個階段。令人欣慰的是C程序編譯工具都提供了一次性編譯和鏈接命令,編譯器會自動執(zhí)行這四個階段,不需要開發(fā)者的參與。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    676

    瀏覽量

    33743
  • C程序
    +關(guān)注

    關(guān)注

    4

    文章

    255

    瀏覽量

    36596
  • 匯編代碼
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    7621
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    51

    瀏覽量

    9179
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    C語言的編譯過程

    C語言的編譯鏈接過程要把我們編寫的一個C程序源代碼,轉(zhuǎn)換成可以在硬件上運行的程序(可執(zhí)行代碼),
    發(fā)表于 06-25 10:36 ?544次閱讀
    <b class='flag-5'>C</b>語言的<b class='flag-5'>編譯</b><b class='flag-5'>過程</b>

    C語言的編譯鏈接過程

    ? C語言的編譯鏈接過程要把我們編寫的一個C程序源代碼轉(zhuǎn)換成可以在硬件上運行的程序(可執(zhí)行代碼)
    的頭像 發(fā)表于 08-21 10:06 ?3000次閱讀
    <b class='flag-5'>C</b>語言的<b class='flag-5'>編譯</b>鏈接<b class='flag-5'>過程</b>

    使用scons編譯時,需要怎么做才能輸出gcc的完整編譯信息呢?

    使用scons編譯時,我需要怎么做才能輸出gcc的完整編譯信息呢?目前sconsCC ......期望輸出arm-none-eabi-gcc -O2 ....
    發(fā)表于 04-02 14:19

    使用scons編譯時,我需要怎么做才能輸出gcc的完整編譯信息呢?

    使用scons編譯時,我需要怎么做才能輸出gcc的完整編譯信息呢?目前sconsCC ……期望輸出arm-none-eabi-gcc -O2 ….
    發(fā)表于 03-23 11:20

    C語言入門教程-C程序編譯過程解析

    C程序編譯過程解析 讓我們逐行講解一下這個示例程序,看看每一行都做了什么(點擊這里在新窗口中打開程序
    發(fā)表于 07-29 10:28 ?1021次閱讀

    C語言實現(xiàn)運算器的原理完整編程代碼

    C語言實現(xiàn)運算器的原理 完整編程代碼C language implementation of the principle of the operator complete programming code
    發(fā)表于 07-08 11:33 ?4次下載

    了解“預(yù)編譯編譯、匯編、鏈接”這四個過程對你有很大幫助

    C語言的編譯鏈接過程要把我們編寫的一個c程序(源代碼)轉(zhuǎn)換成可以在硬件上運行的程序(可執(zhí)行代碼)
    的頭像 發(fā)表于 04-18 10:08 ?3.6w次閱讀
    了解“預(yù)<b class='flag-5'>編譯</b>、<b class='flag-5'>編譯</b>、匯編、鏈接”這四個<b class='flag-5'>過程</b>對你有很大幫助

    GCC編譯C語言程序過程是怎么樣的

    使用GCC將C語言源代碼文件生成可執(zhí)行文件的過程,需要經(jīng)歷四個的步驟:預(yù)處理(Preprocessing)編譯(Compilation)匯編(Assembly)鏈接(Linking)
    的頭像 發(fā)表于 02-18 11:47 ?4426次閱讀

    單片機C程序編譯、執(zhí)行過程資料下載

    電子發(fā)燒友網(wǎng)為你提供單片機C程序編譯、執(zhí)行過程資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計、用戶指南、解決方案等資料,希望可以幫助到廣大
    發(fā)表于 04-08 08:42 ?14次下載
    單片機<b class='flag-5'>C</b><b class='flag-5'>程序</b><b class='flag-5'>編譯</b>、執(zhí)行<b class='flag-5'>過程</b>資料下載

    解析C語言編譯過程中所做的工作

    C語言的編譯鏈接過程要把我們編寫的一個C程序源代碼,轉(zhuǎn)換成可以在硬件上運行的程序(可執(zhí)行代碼),
    的頭像 發(fā)表于 06-27 10:21 ?3489次閱讀
    解析<b class='flag-5'>C</b>語言<b class='flag-5'>編譯</b><b class='flag-5'>過程</b>中所做的工作

    TKScope對LPC1700系列芯片的完整編程和加密方法

    電子發(fā)燒友網(wǎng)站提供《TKScope對LPC1700系列芯片的完整編程和加密方法.pdf》資料免費下載
    發(fā)表于 10-13 17:50 ?0次下載
    TKScope對LPC1700系列芯片的<b class='flag-5'>完整編</b>程和加密方法

    TKScope對LPC1300系列芯片的完整編程和加密方法

    電子發(fā)燒友網(wǎng)站提供《TKScope對LPC1300系列芯片的完整編程和加密方法.pdf》資料免費下載
    發(fā)表于 10-13 17:49 ?0次下載
    TKScope對LPC1300系列芯片的<b class='flag-5'>完整編</b>程和加密方法

    TKScope對AT91SAM7X256的完整編程和加密方法

    電子發(fā)燒友網(wǎng)站提供《TKScope對AT91SAM7X256的完整編程和加密方法.pdf》資料免費下載
    發(fā)表于 10-13 17:23 ?1次下載
    TKScope對AT91SAM7X256的<b class='flag-5'>完整編</b>程和加密方法

    RX族C/C++編譯程序、匯編程序、優(yōu)化連接編輯程序 編譯程序包 用戶手冊 Rev.1.00

    RX族C/C++編譯程序、匯編程序、優(yōu)化連接編輯程序 編譯程序包 用戶手冊 Rev.1.00
    發(fā)表于 04-17 19:24 ?0次下載
    RX族<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>編譯程序</b>、匯編<b class='flag-5'>程序</b>、優(yōu)化連接編輯<b class='flag-5'>程序</b> <b class='flag-5'>編譯程序</b>包 用戶手冊 Rev.1.00

    SuperHTM RISC引擎C/C++編譯程序、匯總程序、優(yōu)化連接編譯程序 編譯程序包V.9.01 用戶手冊

    SuperHTM RISC引擎C/C++編譯程序、匯總程序、優(yōu)化連接編譯程序 編譯程序包V.9.
    發(fā)表于 05-04 18:40 ?0次下載
    SuperHTM RISC引擎<b class='flag-5'>C</b>/<b class='flag-5'>C</b>++<b class='flag-5'>編譯程序</b>、匯總<b class='flag-5'>程序</b>、優(yōu)化連接<b class='flag-5'>編譯程序</b> <b class='flag-5'>編譯程序</b>包V.9.01 用戶手冊