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