C语言的预处理、编译、汇编、链接
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
一、預處理
預處理指令的執(zhí)行主要包含下列事情:
1.頭文件的包含
2.注釋的刪除
3.宏定義的替換
4.條件編譯的選擇
指令:gcc??-E test.c -o test.i????
/* 調用的是預處理器cpp, -E:只進行預處理操作,-o:輸出到<文件> , .i表示產生的臨時文件 Intermediate */
二、編譯
編譯之前,C語言編譯器會進行詞法分析、語法分析(-fsyntax-only)。
在確認所有的指令都符合語法規(guī)則之后,將其翻譯成相應的后綴為S的匯編文件。
指令:gcc -S test.i -o test.S??
/* 調用的是編譯器ccl, -S:編譯到匯編語言,不進行匯編和鏈接, .S:表示匯編文件,注意于.s匯編文件的區(qū)別 */
.s :匯編語言源程序;匯編
.S:匯編語言源程序;預處理,匯編
小寫的s文件,在后期階段不在進行預處理操作,所以我們不能在這里面寫預處理的語句在里面
大寫的S文件,還會進行預處理、匯編等操作,所以我們可以在這里面加入預處理的命??
三、匯編
在編譯與匯編之間,編譯器通常還會做一些優(yōu)化操作。
匯編過程實際上指把匯編語言代碼翻譯成目標機器指令的過程
指令:gcc -c test.S -o test.o
/* 調用的是匯編器as,-c:編譯、匯編到目標代碼,不進行鏈接, .o表示產生目標文件, object
此時用file查看test.o文件的類型為ELF 32-bit LSB relocatable類型,這是可重定位的格式 */
四、鏈接
由匯編程序生成的目標文件并不能立即就被執(zhí)行,其中可能還有許多沒有解決的問題。例如,某個源文件中的函數(shù)可能引用了另一個 源文件中定義的某個符號(如變量或者函數(shù)調用等);在程序中可能調用了某個庫文件中的函數(shù)等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。
鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠誒操作系統(tǒng)裝入執(zhí)行的統(tǒng)一整體。
函數(shù)庫一般分為靜態(tài)庫和動態(tài)庫兩種。靜態(tài)庫是指編譯鏈接時,把庫文件的代碼全部加入到可執(zhí)行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名一般為”.a”。動態(tài)庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執(zhí)行文件中,而是在程序執(zhí)行時由運行時鏈接文件加載庫,這樣可以節(jié)省系統(tǒng)的開銷。動態(tài)庫一般后綴名為”.so”,如前面所述的libc.so.6就是動態(tài)庫。gcc在編譯時默認使用動態(tài)庫。
指令:gcc test.o -o test
/* 用file查看test文件類型為:ELF 32-bit LSB executable,這是可以被執(zhí)行的文件格式 */
?
轉載于:https://my.oschina.net/u/920274/blog/2875477
總結
以上是生活随笔為你收集整理的C语言的预处理、编译、汇编、链接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop需要哪些技术支持
- 下一篇: Mysql8.0.12安装教程方法 My