一个C程序的编译过程(Linux环境下Gcc)
一 以下是C程序一般的編譯過程:
?
?從圖中看到:
????? 將編寫的一個c程序(源代碼?)轉換成可以在硬件上運行的程序(可執行代碼?),需要進行編譯階段? 和鏈接這兩個階段。
????? 其中,
????? 1.? 編譯階段先通過“編譯器?“把一個?.c / .cpp 源代碼?編譯成 .s的匯編代碼?;再經過“匯編器?” 把這 個.s的匯編代碼匯編成?.o 的 目標代碼
????? 2.? “連接器?“ 通過連接其他 .o 代碼(如果需要的話) 庫文件 和 1 中的.o 目標代碼生成可執行文件
該文件流被這三種程序(紅色)的加工,分別表現出四種形式(藍色) ,這就是c程序的編譯和鏈接過程。如果再詳細的話,編譯器在將源文件編譯成匯編文件的過程又分為:預處理階段(生成?.i代碼) 和? 優化階段
?
二、C編程中的文件后綴名介紹
??? .c 未經過預處理的C源碼
??? .h C頭文件??
??? .i 經過預處理的C源碼
????.s 生成的匯編語言代碼?
??? .o 編譯之后產生的目標文件
??? 解釋:*.c一般使我們自己編輯的代碼,使我們勞動的結晶;*.h一般是我們手工生成的接口文件,如果愿意,也可在*.c完成后用GCC的選項-aux-info幫我們生成;*.i是經過預處理后的源碼,是由GCC在選項-E編譯下自動生成的文件;*.o是編譯后產生的目標文件;*.s是GCC在選項-S編譯下生成的匯編語言代碼,對于性能要求很高的程序可以先生成匯編語言文件并對匯編做優化,然后用優化后的匯編生成目標文件并鏈接
?
三?演示 hello.c?的編譯?過程(Linux 下 Gcc)
????
???? ??? 本小節的演示都針對文件 hello.c 進行
?? 1. /*
?? 2.? * hello.c
?? 3.? */
?? 4.
?? 5.?? #include <stdio.h>
?? 6.?? int? main()
?? 7.?? {
?? 8.???? printf("?Better goal, Better life!?/n");
?? 9.???? return 0;
? 10.?? }
??1.生成預處理后的文件 hello.i
? ???$?gcc -E hello.c -o hello.i
? 2?.生成匯編語言文件 hello.s
??????$?gcc -s hello.i -o hello.s
???3.生成目標文件 hello.o
??????$ gcc -c hello.i
????? $ gcc -c hello.s
?? 4.?生成可執行文件
??????$ gcc -o?hello?hello.o
?? 5.?運行及結果
??????$?./hello
??????Better goal, Better life!
當然也可以直接生成, $?gcc -c hello.c??就可以生成可執行文件。這是Gcc內部的事。但就算是跳躍也要經過一步步的翻譯,?原理是相似的,萬變不離其宗!
總結
以上是生活随笔為你收集整理的一个C程序的编译过程(Linux环境下Gcc)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: switchhost使用与注意事项
- 下一篇: Spring SAS 0.2.0 上手教