日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

c語(yǔ)言實(shí)現(xiàn)從源文件從文本到可執(zhí)行文件經(jīng)歷的過(guò)程_C 語(yǔ)言

作者:CW96 ? 更新時(shí)間: 2022-09-17 編程語(yǔ)言

源文件從文本到可執(zhí)行文件經(jīng)歷的過(guò)程

從 .c文件到 .exe文件

gcc hello.c -o hello.exe

源文件( -E) ?預(yù)處理文件 (-S) 匯編文件 (-c) 目標(biāo)文件 ( 無(wú))可執(zhí)行文件

hello.c--預(yù)處理--hello.i--編譯--hello.s---匯編--hello.o--鏈接--hello.exe

預(yù)處理

gcc -E hello.c -o hello.i

1.頭文件展開(kāi) —不檢查語(yǔ)法錯(cuò)誤,可以展開(kāi)任意文件

2.宏定義—將宏名替換為宏值,不檢查語(yǔ)法錯(cuò)誤

3.替換注釋—變成空行

4.展開(kāi)條件編譯—根據(jù)條件來(lái)展開(kāi)指令

編譯

gcc -S hello.i -o hello.s

1.將c程序翻譯為匯編指令

2.逐行檢查語(yǔ)法錯(cuò)誤–整個(gè)編譯4步中最耗時(shí)間的過(guò)程

匯編

gcc -c hello.s -o hello.o

1.將匯編指令翻譯成對(duì)應(yīng)的二進(jìn)制編碼

鏈接

gcc hello.o -o hello.exe

1.數(shù)據(jù)段合并

2.數(shù)據(jù)地址回填

3.庫(kù)引入

在這里插入圖片描述

寄存器、緩存、內(nèi)存三者關(guān)系

cpu計(jì)算時(shí),先預(yù)先把要用的數(shù)據(jù)從硬盤(pán)督導(dǎo)內(nèi)存,然后再把即將要用的數(shù)據(jù)讀到寄存器中。緩存能夠提高數(shù)據(jù)的讀取速度。

集成開(kāi)發(fā)環(huán)境 IDE

用于提供程序開(kāi)發(fā)的應(yīng)用程序,一般包括編輯器、編譯器、調(diào)試器和用戶界面工具。

源程序如何到可執(zhí)行程序

源程序(源代碼)是指按照一定的程序設(shè)計(jì)語(yǔ)言規(guī)范編寫(xiě)的未經(jīng)過(guò)編譯的文本文件,是具有可讀性的計(jì)算機(jī)語(yǔ)言指令??梢员茸髯约菏謱?xiě)的程序代碼。

可執(zhí)行程序(Executable Program,EXE file)是可以在操作系統(tǒng)存儲(chǔ)空間中浮動(dòng)定位的二進(jìn)制可執(zhí)行程序。一般軟件安裝后會(huì)生成可執(zhí)行文件,可以直接加載到內(nèi)存中,并又操作系統(tǒng)加載并執(zhí)行。

以 C 語(yǔ)言為例,自己編寫(xiě)的源代碼文件擴(kuò)展名為 c,這個(gè) c 文件就是源文件。

從源文件到可執(zhí)行文件一般需要經(jīng)過(guò)幾個(gè)步驟:預(yù)處理->編譯->匯編->鏈接這四個(gè)過(guò)程。

  • 預(yù)處理:預(yù)處理相當(dāng)于根據(jù)預(yù)處理命令將源代碼轉(zhuǎn)換為新的 c 程序,不過(guò)通常以 i 為擴(kuò)展名。
  • 編譯:將得到的 i 文件翻譯成匯編代碼,通常以 s 為擴(kuò)展名。
  • 匯編:將匯編文件翻譯為機(jī)器指令,并打包成可重定位目標(biāo)程序的 o 文件。
  • 鏈接:將引用的其它 o 文件加到匯編后的 o 文件中,處理后得到最終的可執(zhí)行文件。

這里首先在 linux 操作系統(tǒng)中編寫(xiě)源代碼,并命名為 hello.c,內(nèi)容如下:

#include <stdio.h>
int main()
{
? ? printf("Hello world!\n");
? ? return 0;
}

一個(gè)很簡(jiǎn)單的源代碼,但是這樣的源代碼如果不是在集成開(kāi)發(fā)環(huán)境(Integrated Development Environment,IDE)中是不能夠直接點(diǎn)擊執(zhí)行的,需要經(jīng)過(guò)一系列的操作,具體為:

# 預(yù)處理
gcc -E hello.c -o hello.i
# 編譯
gcc -S hello.i -o hello.s
# 匯編
gcc -c hello.s -o hello.o
# 鏈接
gcc hello.o -o hello

經(jīng)過(guò)以下操作后,就能夠發(fā)現(xiàn)在 hello.c 文件同級(jí)目錄中出現(xiàn)了文件 hello.i,hello.s,hello.o,hello。可知文件 hello 即為可執(zhí)行程序,我們?cè)诮K端中輸入下方的指令,就能夠看到最后的輸出結(jié)果。

./hello

原文鏈接:https://blog.csdn.net/MARSHCW/article/details/109210193

欄目分類
最近更新