Linux gcc编译c/c++基本过程
Linux系統下開發c++程序,那么gcc編譯器就是我們繞不過去的一道坎。gcc是GNU出品的一款可以在多種硬件平臺上編譯處可執行程序的超級編譯器,其執行效率比普通的編譯器要高出20%~30%左右,而且它是開源,因此很多著名的軟件都能通過它進行編譯。
對于我們來說,有時候盡管寫著linux c++的代碼,但是很多時候我們不會去深究其中的深層次東西。向我這樣擁有著最低追求的程序員,能夠寫出符合要求的代碼可能就算完事了。不過呢,多知道一些東西總歸是有好處的。知道其原理,我們才能更好的寫出高質量的代碼,更好的提高我們的工作效率。
gcc編譯C/C++的編譯過程可以分為4個階段:
1.預處理(Preprocess:生成 .i 的文件 2. 編譯(Compilation):將預處理后的文件不轉換成匯編語言, 生成文件 .s 3. 匯編 (Assembly:由匯編變為目標代碼(機器代碼)生成 .o 的文件 4. 鏈接(Linking):連接目標代碼, 生成可執行程序 復制代碼預處理
預處理其實就是對程序中的偽指令(#開頭的指令)和特殊符號進行處理的過程。 其中偽指令包括宏定義指令、條件編譯指令以及頭文件包含指令。
預編譯過程中的主要處理規則如下:
1.刪除#define定義,并且展開所有的宏定義 2.處理所有的條件編譯指令,如#ifdef... 3.處理#include指令 ,將被包含文件插入到指令位置,實質上和宏定義一樣,只不過這里是展開文件內容 4. 刪除源代碼中的注釋 5. 添加行號以及標識 復制代碼那么,我們還是以HelloWorld程序作為我們的示例程序吧。
這里我么就不用集成IDE了,我們直ssh到我們的linux機器。
首先我們找一個目錄,然后編寫一個helloWorld程序:
//編輯代碼 vi hello.c// 查看文件內容ls hello.c// -n 參數可以顯示行號 cat -n hello.c1 #include <stdio.h>23 //函數入口4 int main(int argc, char *argv[])5 {6 // 打印歡迎語句7 char hello[] = "Hello,Linux C++!";8 printf("%s",hello);9 return 0;10 }復制代碼接下來我們執行gcc的預處理命令:
gcc -E hello.c -o hello.i 復制代碼可以看到目錄下會生成hello.i 文件:
我們可以查看一下hello.i的內容:
可以看到,include被替換,注釋被刪除了。。。編譯
編譯過程就是把預處理完成的文件進行一系列的詞法分析,語法分析。。。然后生成對應的匯編文件。默認情況gcc不會生成后綴為.s的匯編文件,如果需要我們需要使用-S選項。
語法:
gcc -S hello.i -o hello.s 復制代碼生成的匯編文件代碼,這里我貼出來,說實話看不太懂。。。
匯編
匯編就是將匯編代碼轉化為機器可以執行的二進制代碼。
語法:
gcc -S hello.s -o hello.o 復制代碼至于查看hello.o可以使用下面的命令:
hexdump hello.o 復制代碼 hello.o是二進制文件。鏈接
這個階段主要是為了解決多個文件之間的符號引用的問題。 就拿hello.c來說,我們在程序中使用了printf函數,但是我們并沒有其聲明和實現。可能有朋友會說,我們不是引用了stdio.h嗎?是的,我們確實在我們的文件中引用了頭文件,可問題是頭文件中也只會有printf的聲明,而在實際的運行中,我們需要函數的實現。所以我們可以將鏈接這個過程描述為:我知道你是誰,但我們要明確你在哪里?
gcc會在系統默認的搜索路徑:/user/lib64 下去查找。
語法:
gcc hello.o -o hello 復制代碼最后運行:
./hello 復制代碼 我也沒有詳細的研究過相關知識,這里講的難免會有偏差,只是知道這幾個過程大體是在做什么,更多的內容還是建議大家找一些官方權威資料學習。轉載于:https://juejin.im/post/5ca5e11af265da30c902781e
總結
以上是生活随笔為你收集整理的Linux gcc编译c/c++基本过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果正悄悄测试“Apple
- 下一篇: Linux进程分配内存的两种方式--br