通过简单的Linux命令,编译一个C语言代码
版權聲明:歡迎轉載,互相學習。 https://blog.csdn.net/SmalOSnail/article/details/53208867
一個C語言程序從源代碼變為最后的可執行文件,需要經歷預處理、編譯、匯編、鏈接這四個過程。 這是一般C語言入門書籍上面會提到的,但是很少有人入門時關注這一點,照著書上的代碼直接開始碼”Hello World.c”。而現在的編譯器一般是一步到位,如Dev-cpp,只需要點一下“編譯”就可以把源代碼直接變成可執行文件。這樣做雖然節約了時間,卻不利于新手們從底層開始學習C語言。甚至可能學到最后連什么是預處理、匯編、鏈接都不清楚,對程序編譯的過程沒有什么感覺。
在這篇文章中,大家可以通過自己動手實踐,逐步地理解、感受c語言的編譯過程。
本文使用linux操作環境,windows用戶可以安裝linux虛擬機或者下載linux模擬器,或者嘗試微軟的實驗功能——linux子系統
- 虛擬機安裝教程:
http://wiki.ubuntu.com.cn/虛擬機中安裝Ubuntu - 模擬器下載地址:
http://mingw.org/ - linux子系統安裝:
https://linux.cn/article-7209-1.html
文中主要使用gcc命令以及以下幾個參數:
-E Preprocess only; do not compile, assemble or link-S Compile only; do not assemble or link-c Compile and assemble, but do not link-o <file> Place the output into <file>環境配置好以后,讓我們開始c語言的編譯之旅吧~
編寫c語言源代碼
很多linux命令都可以新建一個文件,比如
$ touch test.c建立一個空白的文件
$ vim test.c使用vim(文本編輯器)編輯test.c,如果test.c不存在,則創建
$ echo "123" > test.c通過輸出重定向新建一個文件
創建完test.c后,將下面這段Hello World代碼寫到test.c中(很多方法)
#include <stdio.h> int main(){printf("Hello world\n");return 0; }寫完之后可以使用ls命令來查看當前目錄下的文件,檢查test.c是否存在
$ ls使用cat命令查看test.c中的內容,檢查是否寫入成功
$ cat test.c展開頭文件(預處理)
$ gcc -E test.c -o test_pre.c這個命令把源代碼test.c中的頭文件展開,并把結果輸出到test_pre.c
(可以使用cat或者vim命令查看test_pre.c文件中的內容)
test_pre.c中的內容是這樣的,可以發現原本幾行的代碼變成了幾百行,而且已經見不到include關鍵字了,取而代之的是一些變量定義的代碼,這些代碼就是stdio.h中的內容,和stdio.h中頭文件展開后的內容。
編譯
$ gcc -S test_pre.c -o test_asm.s這一條命令將上一步預處理過后的源代碼編譯成為匯編代碼
現在看到的是test_asm.s里面的匯編代碼。
什么是匯編?
匯編語言是匯編指令集、偽指令集和使用它們規則的統稱,使用具有一定含義的符號為助憶符,用指令助憶符、符號地址等組成的符號指令稱為匯編格式指令。簡單的可以理解為匯編語言是一本詞典,01100101011010這樣的二進制字符串是單詞,匯編指令是單詞的含義。計算機能讀懂二進制字符串,而人能讀懂的是翻譯過來的匯編指令。
匯編
$ gcc -c test_asm.s -o test_obj.o這一步將test_asm.s匯編成為目標文件,目標文件中存儲的就是010101010這樣的字符串了,可以用cat命令試試去讀取test_obj.o
可以發現打印出來許多不可見的字符,原因是目標文件已經是二進制格式的了,不同于源代碼(文本格式)
有關文件的格式可以看下這里的介紹:
http://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html
鏈接
鏈接器負責將程序的目標文件與所需的所有附加的目標文件連接起來,最終生成可執行文件。附加的目標文件包括靜態連接庫和動態連接庫。- 1
這個例子中沒有附加的目標文件,所以只需要目標文件做被鏈接的對象。
有關鏈接器的詳細講解大家可以看下這里:
https://www.zhihu.com/question/27386057
gcc本身可以充當鏈接器,這里使用gcc命令將目標文件test_obj.o鏈接成了可執行文件hello
運行程序!
至此,源代碼已經經歷了預處理、編譯、匯編、鏈接四步成為了可執行文件,現在試著運行一下這個程序吧
$ ./hello小結
首先我們創建了源文件test.c,然后用gcc -E將源文件中的頭文件展開,這一步叫做預處理;
之后通過gcc -S將預處理后的源文件編譯了匯編代碼,這一步叫做編譯;
接著使用gcc -c命令將匯編代碼轉換成了二進制的目標文件,這一步操作叫做匯編;
目標文件不同于源代碼,是二進制格式,是源文件編譯過程中產生的中間文件,通過鏈接器可以將多個目標文件鏈接成為可執行文件,這一步叫做鏈接。
一般大家所說的c語言編譯,其實是上述這四步的簡稱。
總結
以上是生活随笔為你收集整理的通过简单的Linux命令,编译一个C语言代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51Node 01组成的N的倍数
- 下一篇: eclipse启动不了并报错Java w