windows环境下gcc的使用(二):gcc命令与程序编译链接过程
測(cè)試Linux命令
上一篇博客已經(jīng)安裝好了cygwin,相當(dāng)于在windows平臺(tái)上已經(jīng)搭建好了一個(gè)模擬Linux的環(huán)境,那么在cygwin的終端(Cygwin64 Terminal)中測(cè)試Linux指令。可以看到命令cls是windows下的清屏指令,在這里是沒(méi)有定義的,pwd是Linux命令,顯示了當(dāng)前的路徑。
gcc命令使用
- 新建一個(gè)文件夾用戶來(lái)存放示例代碼。
- 在Demo.c文件中添加如下代碼,一個(gè)簡(jiǎn)單的按下按鍵輸出語(yǔ)句的C程序。
- 在終端中通過(guò)cd命令進(jìn)入該目錄。首先通過(guò)命令gcc Demo.c -o Demo來(lái)直接一步到位,生成一個(gè)名為exe文件。該命令中Demo.c為源文件名,-o后的Demo為exe文件名。 可以看到在該文件夾中已經(jīng)生成了一個(gè)Demo.exe文件了。
雙擊點(diǎn)開(kāi)Demo.exe文件,可以看到每按下一個(gè)任意按鍵,就會(huì)輸出信息,這和上方的代碼作用一致。這么看其實(shí)這個(gè)還是很快的,而且挺方便的。
這個(gè)命令相當(dāng)于直接將預(yù)編譯、編譯、匯編、鏈接過(guò)程一個(gè)接一個(gè)的執(zhí)行了,就像一條鏈一樣,這也就是編譯鏈。
接下來(lái)分別分析這四個(gè)步驟。
生成可執(zhí)行文件的步驟
首先這些工具都可以通過(guò)xxx --help命令來(lái)獲取到該工具的指令。
那么我們需要關(guān)注的就是最下面的這幾個(gè)指令了。
根據(jù)其后方的注釋翻譯如下:
gcc -E:只進(jìn)行預(yù)編譯,不編譯、不匯編、不鏈接,最終會(huì)生成xxx.i的預(yù)編譯文件。
gcc -S:只進(jìn)行預(yù)編譯、編譯,不進(jìn)行匯編或鏈接,最終會(huì)生成xxx.s的匯編文件。
gcc -c:進(jìn)行預(yù)編譯、編譯、匯編,不進(jìn)行鏈接,最終會(huì)生成xxx.o的目標(biāo)文件。
gcc -o:進(jìn)行預(yù)編譯、編譯、匯編、鏈接,最終會(huì)生成xxx.exe的可執(zhí)行程序。
那么根據(jù)這些指令來(lái)分別執(zhí)行并生成對(duì)應(yīng)的文件,看看它們長(zhǎng)什么樣。
這里分別在終端中執(zhí)行這四個(gè)命令:
gcc -E Demo.c -o Demo.i
gcc -S Demo.i -o Demo.s
gcc -c Demo.s -o Demo.o
gcc Demo.o -o Demo
可以看到這些命令都是與上方的分析對(duì)應(yīng)的,而且文件夾中已經(jīng)分別生成了Demo.i、Demo.s、Demo.o、Demo.exe三個(gè)對(duì)應(yīng)的中間文件和一個(gè)最終的可執(zhí)行文件,這也驗(yàn)證了上述分析是正確的。
通過(guò)文件的類型也可以看到這些文件屬于哪一類。
1. Demo.i文件
在Demo.i文件中,處理了宏定義和include,也去除注釋,但是這個(gè)文件并不會(huì)對(duì)對(duì)語(yǔ)法進(jìn)行檢查。
通過(guò)上面的代碼可以找到這些源文件的目錄位置。“/uer/include/” 這個(gè)路徑意思是cygwin的根目錄下的user目錄下的include目錄。找到該路徑可以看到這里有c語(yǔ)言的各種庫(kù)函數(shù)。
在這段代碼的最后就可以看到之前在Demo.c文件中編寫的源代碼。所以可以看出預(yù)編譯過(guò)程其實(shí)就是把include的頭文件中的內(nèi)容在這里展開(kāi)了。
2. Demo.s文件
在Demo.s文件中,將檢查上一個(gè)生成的Demo.i文件的語(yǔ)法正確性,如果語(yǔ)法正確,就會(huì)生成匯編語(yǔ)言的代碼。
3. Demo.o文件
在Demo.o文件中,存放著目標(biāo)代碼,這是一種ELF格式的代碼,這里存放的是最接近機(jī)器語(yǔ)言甚至就是機(jī)器語(yǔ)言的代碼,這也對(duì)應(yīng)著已經(jīng)到了能夠生成最終可執(zhí)行文件的最后一步了??梢钥吹竭@里都是一些亂碼,可以理解為機(jī)器的語(yǔ)言,接下來(lái),就可以通過(guò)這寫機(jī)器語(yǔ)言所生成的代碼,來(lái)與機(jī)器進(jìn)行“溝通”了。
4. Demo.exe文件
這個(gè)文件可以說(shuō)很熟悉了,windows上的可執(zhí)行程序,絕大部分使用的軟件都是以這個(gè)可執(zhí)行程序作為入口的。這也就是我們最終所要得到的目的文件了。
總結(jié)一下
這就是對(duì)一個(gè)包含了一個(gè)系統(tǒng)自帶的頭文件stdio.h的xxx.c文件的基本編譯、鏈接最后生成可執(zhí)行程序的過(guò)程了。通過(guò)gcc --help可以看到所向外提供的指令。具體的過(guò)程也都是通過(guò)查看指令后方的注釋,來(lái)進(jìn)行測(cè)試,即可觀察到相應(yīng)的現(xiàn)象。之后嘗試定義不同的xxx.c文件和包含自定義的xxx.h文件來(lái)進(jìn)一步了解gcc編譯的細(xì)節(jié)。不過(guò)都是后話了。多動(dòng)手還是最重要的。畢竟紙上得來(lái)終覺(jué)淺 絕知此事要躬行。
總結(jié)
以上是生活随笔為你收集整理的windows环境下gcc的使用(二):gcc命令与程序编译链接过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用计算机控制单片机的程序编写,单片机初学
- 下一篇: 网络Day_5