日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Linux系统编程5:入门篇之在Linux下观察C/C++程序编译过程 gcc/g++使用详解

發布時間:2025/3/15 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统编程5:入门篇之在Linux下观察C/C++程序编译过程 gcc/g++使用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • (1)gcc/g++完成編譯的過程
      • A:預處理
      • B:編譯
      • C:匯編
      • D:鏈接
    • (2)gcc/g++選項
    • (3)重要概念:函數庫
      • A:gcc/g++在哪實現了函數
      • B:靜態庫與動態庫

(1)gcc/g++完成編譯的過程

A:預處理

  • 預處理主要包括宏定義,文件包含,條件編譯,去注釋
  • 輸入gcc -E hello.c -o hello.i,其中選項E作用是讓gcc在預處理后停止編譯

B:編譯

  • 此階段,gcc檢查代碼的規范性,是否具有語法錯誤
  • 輸入gcc -S hello.i -o hello.s,即可將預處理里的結果繼續繼續編譯

C:匯編

  • 編譯階段無誤后,進入匯編,將“.s”文件轉化為“.o”二進制文件
  • 輸入gcc -c hello.s -o hello.o,即可將編譯停止在此階段


(打開二進制文件使用od命令)

D:鏈接

  • 此階段,將目標文件與系統庫進行鏈接生成可執行文件。
  • 輸入gcc hello.o -o hello,則完成編譯

(2)gcc/g++選項

選項描述
-E進行預處理,不進行編譯,匯編和鏈接
=S進行編譯,不進行匯編和鏈接
-c進行匯編,不進行鏈接
-o鏈接
static采用靜態鏈接
-g生成調試信息
-shared使用動態庫
-O0無優化
-O1默認優化級別
-O3優化最高
-w不生成警告信息
-Wall生成所有警告信息

(3)重要概念:函數庫

A:gcc/g++在哪實現了函數

在學C語言是,我們知道想要向屏幕正常打印字符,則必須在頭部引入#inlcude <stdio.h>這樣的頭文件,因為printf函數的是在其中實現的
在剛才的例子中,查看hello.i,也就是預編譯生成的文件,可以發現#include <stdio.h>,在如下路徑中

進入該路徑,可以發現這里存放的便是頭文件

可是gcc為什么知道頭文件會在這個路徑下的呢?實際上,在沒有特別指定時,gcc會默認搜索路徑/usr/lib,并進行查找。這也就是引用頭文件時兩種方式的區別所在:#include <stdio.h>會在設定目錄下尋找,而#include "Myhead.h",會在當前目錄下尋找。

B:靜態庫與動態庫

  • 靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名為.a。輸入gcc hello.c -o helloc -static,,采用靜態鏈接
  • 動態庫在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中,而是在程序運行時由運行時鏈接文件加載庫,這樣做可以節省系統開銷。動態庫后綴名一般為.so,gcc在編譯時默認使用動態庫,完成鏈接之后,就生成了可執行文件。

所以動態鏈接形成的程序體積較小,比較節省資源,但是一旦庫丟失,程序就不可以運行了;而靜態形成的程序的體積很大,但具有獨立性,即便庫丟失,也不影響程序運行。

總結

以上是生活随笔為你收集整理的Linux系统编程5:入门篇之在Linux下观察C/C++程序编译过程 gcc/g++使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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