日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux gcc编译c/c++基本过程

發布時間:2023/12/31 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++基本过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。