色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

C程序的完整編譯過程

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

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

編譯和鏈接

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

圖片

圖 1-7 C程序編譯過程

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

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

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

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

鏈接階段:鏈接階段將多個目標代碼文件、函數庫文件鏈接成可執行文件。

**編譯實例 **

下面以《C程序結構》中的面積計算器程序為例,在Ubuntu系統下使用GCC編譯器,對面積計算器程序進行編譯和鏈接。

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

圖片

圖 1-8 面積計算器程序結構

預處理階段

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

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

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

gcc -E C源文件-o [預處理后文件]

例如:

gcc -E main.c -o main.i

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

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

圖片

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

圖片

編譯階段

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

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

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

例如:

gcc -S square.i -o square.s

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

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

圖片

匯編階段

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

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

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

例如:

gcc -c rectangle.s -o rectangle.o

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

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

圖片

鏈接階段

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

輸入下面的命令:

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

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

本文小結

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編譯
    +關注

    關注

    0

    文章

    657

    瀏覽量

    32852
  • C程序
    +關注

    關注

    4

    文章

    254

    瀏覽量

    36027
  • 匯編代碼
    +關注

    關注

    0

    文章

    23

    瀏覽量

    7548
  • 宏定義
    +關注

    關注

    0

    文章

    50

    瀏覽量

    9007
收藏 人收藏

    評論

    相關推薦

    C語言的編譯過程

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

    C語言的編譯鏈接過程

    ? C語言的編譯鏈接過程要把我們編寫的一個C程序源代碼轉換成可以在硬件上運行的程序(可執行代碼)
    的頭像 發表于 08-21 10:06 ?2579次閱讀
    <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 ....
    發表于 04-02 14:19

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

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

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

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

    C語言實現運算器的原理完整編程代碼

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    RX族C/C++編譯程序、匯編程序、優化連接編輯程序 編譯程序包 用戶手冊 Rev.1.00
    發表于 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>、優化連接編輯<b class='flag-5'>程序</b> <b class='flag-5'>編譯程序</b>包 用戶手冊 Rev.1.00

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

    SuperHTM RISC引擎C/C++編譯程序、匯總程序、優化連接編譯程序 編譯程序包V.9.
    發表于 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>、優化連接<b class='flag-5'>編譯程序</b> <b class='flag-5'>編譯程序</b>包V.9.01 用戶手冊
    主站蜘蛛池模板: 美女的避毛| 久久国产综合精品欧美| 国产69精品久久久久人妻刘玥| 成人午夜精品久久久久久久秋霞| 成人永久免费视频| 国产精品美女久久久久浪潮AV| 国产精品伦一区二区三级视频| 韩国精品韩国专区久久| 久久综久久美利坚合众国| 欧美日韩国产高清综合二区| 高清mv视频免费观看| 99视频一区| 原神美女被超污app| 98久久人妻无码精品系列蜜桃| x69老师x日本| 99久久就热视频精品草| 抽插妇女疯狂视频| 调教日本美女| 激情办公室| 男女作爱在线播放免费网页版观看 | 好湿好滑好硬好爽好深视频| 老板揉搓秘书丰满大乳| 琪琪色原网20岁以下热热色原网站| 无限资源在线观看高清| 尤蜜网站在线进入免费| 被老师按在办公桌吸奶头| 亚洲免费一| 999久久免费高清热精品| 国产福利一区二区精品| 久久囯产精品777蜜桃传媒| 欧美一夜爽爽爽爽爽爽| 亚洲AV久久无码精品国产网站| 主播蜜汁丝袜精品自拍| 囯产精品麻豆巨作久久| 久久人妻少妇嫩草AV无码| 色www.亚洲免费视频| 樱花草在线影视WWW日本动漫| 超碰caoporon最新视频| 九九热视频免费观看| 色偷偷888欧美精品久久久| 伊人草久久|