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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

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

文章目錄

    • (1)gcc/g++完成編譯的過程
      • A:預(yù)處理
      • B:編譯
      • C:匯編
      • D:鏈接
    • (2)gcc/g++選項(xiàng)
    • (3)重要概念:函數(shù)庫
      • A:gcc/g++在哪實(shí)現(xiàn)了函數(shù)
      • B:靜態(tài)庫與動(dòng)態(tài)庫

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

A:預(yù)處理

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

B:編譯

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

C:匯編

  • 編譯階段無誤后,進(jìn)入?yún)R編,將“.s”文件轉(zhuǎn)化為“.o”二進(jìn)制文件
  • 輸入gcc -c hello.s -o hello.o,即可將編譯停止在此階段


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

D:鏈接

  • 此階段,將目標(biāo)文件與系統(tǒng)庫進(jìn)行鏈接生成可執(zhí)行文件。
  • 輸入gcc hello.o -o hello,則完成編譯

(2)gcc/g++選項(xiàng)

選項(xiàng)描述
-E進(jìn)行預(yù)處理,不進(jìn)行編譯,匯編和鏈接
=S進(jìn)行編譯,不進(jìn)行匯編和鏈接
-c進(jìn)行匯編,不進(jìn)行鏈接
-o鏈接
static采用靜態(tài)鏈接
-g生成調(diào)試信息
-shared使用動(dòng)態(tài)庫
-O0無優(yōu)化
-O1默認(rèn)優(yōu)化級(jí)別
-O3優(yōu)化最高
-w不生成警告信息
-Wall生成所有警告信息

(3)重要概念:函數(shù)庫

A:gcc/g++在哪實(shí)現(xiàn)了函數(shù)

在學(xué)C語言是,我們知道想要向屏幕正常打印字符,則必須在頭部引入#inlcude <stdio.h>這樣的頭文件,因?yàn)閜rintf函數(shù)的是在其中實(shí)現(xiàn)的
在剛才的例子中,查看hello.i,也就是預(yù)編譯生成的文件,可以發(fā)現(xiàn)#include <stdio.h>,在如下路徑中

進(jìn)入該路徑,可以發(fā)現(xiàn)這里存放的便是頭文件

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

B:靜態(tài)庫與動(dòng)態(tài)庫

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

所以動(dòng)態(tài)鏈接形成的程序體積較小,比較節(jié)省資源,但是一旦庫丟失,程序就不可以運(yùn)行了;而靜態(tài)形成的程序的體積很大,但具有獨(dú)立性,即便庫丟失,也不影響程序運(yùn)行。

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。