最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux編譯器--gcc/g++使用方式

 更新時(shí)間:2025年02月06日 16:32:50   作者:阿赭ochre  
文章主要介紹了C/C++程序的編譯過(guò)程,包括預(yù)編譯、編譯、匯編和鏈接四個(gè)階段,并詳細(xì)解釋了每個(gè)階段的作用和具體操作,同時(shí),還介紹了調(diào)試和發(fā)布版本的概念

一、預(yù)編譯指令

1.1預(yù)處理功能

  • 去掉注釋
  • 頭文件的展開(kāi)
  • 條件編譯
  • 宏替換

1.2指令

  • 預(yù)處理指令是以#號(hào)開(kāi)頭的代碼行
  • gcc下使用:gcc -E code.c -o code.i 來(lái)生成可執(zhí)行文件
  • 選項(xiàng)“-E”,該選項(xiàng)的作用是讓 gcc 在預(yù)處理結(jié)束后停止編譯過(guò)程
  • 選項(xiàng)“-o”是指目標(biāo)文件,“.i”文件為已經(jīng)過(guò)預(yù)處理的C原始程序

實(shí)例:

1.3問(wèn)題擴(kuò)展

為什么能在Linux下進(jìn)行C/C++或者其他形式的開(kāi)發(fā)呢?

  • C/C++開(kāi)發(fā)環(huán)境不只是指gcc、g++、vs等編譯器,更重要的是語(yǔ)言本身的頭文件和庫(kù)文件
  • 在進(jìn)行開(kāi)發(fā)前,系統(tǒng)中一定要提前安裝或者后續(xù)安裝上C/C++相應(yīng)的頭文件和庫(kù)
  • 對(duì)于編譯型語(yǔ)言,在選擇對(duì)應(yīng)的開(kāi)發(fā)包進(jìn)行下載時(shí),必定也在同步下載頭文件和庫(kù)文件
  • 使用ls /usr/include 可以查看Linux下包含的所以頭文件

  • 條件編譯的應(yīng)用場(chǎng)景
  • 根據(jù)編譯條件,裁剪掉某些社區(qū)版編譯器所不需要的功能
  • 經(jīng)過(guò)預(yù)處理的源文件也是c語(yǔ)言

二、編譯(生成匯編)

  • 在這個(gè)階段中,gcc 首先要檢查代碼的規(guī)范性、是否有語(yǔ)法錯(cuò)誤等,以確定代碼的實(shí)際要做的工作,在檢查無(wú)誤后,gcc 把代碼翻譯成匯編語(yǔ)言
  • 用戶可以使用“-S”選項(xiàng)來(lái)進(jìn)行查看,該選項(xiàng)只進(jìn)行編譯而不進(jìn)行匯編,生成匯編代碼

實(shí)例:

gcc -S code.i -o code.s

三、匯編(生成二進(jìn)制機(jī)器語(yǔ)言)

  • 匯編階段是把編譯階段生成的“.s”文件轉(zhuǎn)成目標(biāo)文件(可重定向二進(jìn)制目標(biāo)文件,.obj)
  • 可使用選項(xiàng)“-c”就可看到匯編代碼已轉(zhuǎn)化為“.o”的二進(jìn)制目標(biāo)代碼
  • 生成的目標(biāo)文件雖然是二進(jìn)制,但是不能獨(dú)立運(yùn)行,要和庫(kù)進(jìn)行鏈接形成可執(zhí)行文件才能執(zhí)行

實(shí)例:

gcc -c code.s -o code.o

四、鏈接(生成可執(zhí)行文件或庫(kù)文件)

4.1庫(kù)文件

我們的C程序中,并沒(méi)有定義“printf”的函數(shù)實(shí)現(xiàn),且在預(yù)編譯中包含的“stdio.h”中也只有該函數(shù)的聲明,而沒(méi)有定義函數(shù)的實(shí)現(xiàn),那么,是在哪里實(shí)“printf”函數(shù)的呢?

答案是:系統(tǒng)把這些函數(shù)實(shí)現(xiàn)都被做到名為 libc.so.6 的庫(kù)文件中去了,在沒(méi)有特別指定時(shí),gcc 會(huì)到 系統(tǒng)默認(rèn)的搜索路徑“/usr/lib”下進(jìn)行查找,也就是鏈接到 libc.so.6 庫(kù)函數(shù)中去,這樣就能實(shí)現(xiàn)函數(shù)“printf”了,而這也就是鏈接的作用

  • 庫(kù)文件實(shí)際上是.c(源文件)經(jīng)過(guò)一定的翻譯打包后形成的一個(gè)文件——可以達(dá)到只需要提供一個(gè)文件不需要提供多個(gè)源文件,隱藏源文件的功能
  • 軟件=頭文件中方法的聲明+庫(kù)文件中方法的實(shí)現(xiàn)+代碼
  • Windows下存在以.dll為后綴的動(dòng)態(tài)庫(kù)和以.lib為后綴的靜態(tài)庫(kù)
  • Linux下存在以.so為后綴的動(dòng)態(tài)庫(kù)和以.a為后綴的靜態(tài)庫(kù)

如何查看Linux的動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)?

ls /usr/lib64/libc.so*

ls /usr/lib64/libc.a*

4.2目標(biāo)文件和庫(kù)的鏈接

動(dòng)態(tài)鏈接

  • 動(dòng)態(tài)庫(kù)在編譯鏈接時(shí)并沒(méi)有把庫(kù)文件的代碼加入到可執(zhí)行文件中,而是在程序執(zhí)行時(shí)跳轉(zhuǎn)到庫(kù)中去執(zhí)行相應(yīng)的方法,執(zhí)行結(jié)束后再回到代碼調(diào)用處繼續(xù)往下執(zhí)行,這樣可以節(jié)省系統(tǒng)的開(kāi)銷(xiāo)。動(dòng)態(tài)庫(kù)不能缺失,一旦缺失,所有依賴于動(dòng)態(tài)庫(kù)程序都無(wú)法正常運(yùn)行。
  • 動(dòng)態(tài)庫(kù)一般后綴名為“.so”,如前面所述的 libc.so.6 就是動(dòng)態(tài)庫(kù)。gcc 在編譯時(shí)默認(rèn)使用動(dòng)態(tài)庫(kù)。完成了鏈接之后,gcc 就可以生成可執(zhí)行文件。

靜態(tài)鏈接

  • 靜態(tài)庫(kù)是指編譯鏈接時(shí),把庫(kù)文件的代碼全部拷貝加入到可執(zhí)行文件中,因此生成的文件比較大,但再運(yùn)行時(shí),該目標(biāo)問(wèn)津不會(huì)再依賴庫(kù)文件了。

4.3動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的優(yōu)缺點(diǎn)

  • 動(dòng)態(tài)庫(kù):動(dòng)態(tài)庫(kù)為共享庫(kù),可以節(jié)約資源(磁盤(pán)空間,內(nèi)存空間,網(wǎng)絡(luò)空間);但動(dòng)態(tài)庫(kù)一旦缺失,所有依賴于該動(dòng)態(tài)庫(kù)的程序都無(wú)法正常運(yùn)行
  • 靜態(tài)庫(kù):程序不依賴庫(kù),靜態(tài)庫(kù)銷(xiāo)毀,后續(xù)程序可以正常運(yùn)行;體積大,不可以節(jié)約資源
  • Linux下,生成可執(zhí)行文件時(shí)的默認(rèn)為動(dòng)態(tài)鏈接--需要提供動(dòng)態(tài)庫(kù)
  • Linux下,要按照靜態(tài)鏈接的方式,在進(jìn)行編譯時(shí)要添加選項(xiàng)-static

實(shí)例:gcc code.c -o code.test

gcc code.c -o code.test_static -static

可以看出,按照靜態(tài)鏈接的方式形成的可執(zhí)行文件比動(dòng)態(tài)鏈接形成的可執(zhí)行文件大

  • 如果沒(méi)有靜態(tài)庫(kù),不能進(jìn)行-static動(dòng)態(tài)鏈接
  • 如果沒(méi)有動(dòng)態(tài)庫(kù),只有靜態(tài)庫(kù),而且gcc能找到該靜態(tài)庫(kù),那么可以進(jìn)行靜態(tài)鏈接
  • Linux默認(rèn)優(yōu)先動(dòng)態(tài)鏈接,-static的本質(zhì):改變靜態(tài)鏈接的優(yōu)先級(jí),只適配一次
  • 不一定所有的鏈接都是動(dòng)態(tài)鏈接或靜態(tài)鏈接,也有可能時(shí)動(dòng)態(tài)鏈接和靜態(tài)鏈接混合的

五、debug和release

  • Linux默認(rèn)生成的release版本
  • debug版本的可執(zhí)行文件會(huì)比release版本的略大
  • 要生成debug版本的可執(zhí)行文件,可以在編譯時(shí)添加-g選項(xiàng)

實(shí)例:gcc code.c -o code.test_debug -g

gcc code.c -o code.test_debug_static -g -static

  • 生成的可執(zhí)行文件并不是無(wú)序的二進(jìn)制格式,而是有自己的格式--ELF格式
  • file指令

實(shí)例:file code.test

file code.test_static

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Linux下history命令輸出時(shí)間方式

    Linux下history命令輸出時(shí)間方式

    本文詳解Linux中Bash與Zsh記錄命令執(zhí)行時(shí)間的方法,通過(guò)設(shè)置HISTTIMEFORMAT環(huán)境變量,修改配置文件后使用history查看,需注意歷史記錄大小及隱私安全
    2025-07-07
  • CentOS如果更改yum更新源詳解

    CentOS如果更改yum更新源詳解

    平時(shí)在安裝或更新CentOS軟件時(shí),yum方式是最簡(jiǎn)單方便的,而為避免從國(guó)外站點(diǎn)安裝更新速度過(guò)慢,需要更改yum更新源,那么CentOS怎么修改yum更新源呢?今天小編與大家分享下CentOS修改yum更新源的具體操作步驟,有需要的朋友不妨了解下。
    2016-10-10
  • Linux系統(tǒng)管理與進(jìn)程任務(wù)管理方式

    Linux系統(tǒng)管理與進(jìn)程任務(wù)管理方式

    本文系統(tǒng)講解Linux管理核心技能,涵蓋引導(dǎo)流程、服務(wù)控制(Systemd與GRUB2)、進(jìn)程管理(前臺(tái)/后臺(tái)運(yùn)行、工具使用)、計(jì)劃任務(wù)(at/cron)及常用命令,強(qiáng)調(diào)實(shí)踐與工具優(yōu)化對(duì)構(gòu)建高效穩(wěn)定Linux環(huán)境的重要性
    2025-08-08
  • Linux如何查找運(yùn)行的Python腳本路徑

    Linux如何查找運(yùn)行的Python腳本路徑

    這篇文章主要介紹了Linux如何查找運(yùn)行的Python腳本路徑實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-05-05
  • centos7 mysql數(shù)據(jù)庫(kù)安裝和配置

    centos7 mysql數(shù)據(jù)庫(kù)安裝和配置

    本篇文章主要介紹了centos7 mysql數(shù)據(jù)庫(kù)安裝和配置 ,非常具有實(shí)用價(jià)值,希望對(duì)大家實(shí)用mysql能夠有所幫助
    2017-01-01
  • Linux 塊設(shè)備驅(qū)動(dòng)代碼編寫(xiě)

    Linux 塊設(shè)備驅(qū)動(dòng)代碼編寫(xiě)

    這篇文章主要介紹了Linux 塊設(shè)備驅(qū)動(dòng)代碼編寫(xiě),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Linux恢復(fù)刪除文件的lsof命令詳解

    Linux恢復(fù)刪除文件的lsof命令詳解

    Linux系統(tǒng)是服務(wù)器最常見(jiàn)的操作系統(tǒng),當(dāng)然也面臨著非常多的安全事件,當(dāng)發(fā)生刪除文件錯(cuò)誤的時(shí)候,恢復(fù)文件就尤為重要了,下面這篇文章主要介紹了Linux恢復(fù)刪除文件的lsof命令,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-01-01
  • Ubuntu徹底卸載MySQL、Apache2和Php的方法教程

    Ubuntu徹底卸載MySQL、Apache2和Php的方法教程

    這篇文章主要給大家介紹了關(guān)于在Ubuntu系統(tǒng)下徹底卸載MySQL、Apache2和Php的方法教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起看看吧。
    2017-08-08
  • Linux下sftp登錄失敗的解決方案

    Linux下sftp登錄失敗的解決方案

    這篇文章主要介紹了Linux下sftp登錄失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Linux磁盤(pán)格式化命令詳解

    Linux磁盤(pán)格式化命令詳解

    這篇文章主要介紹了Linux磁盤(pán)格式化命令以及具體操作步驟,需要的朋友參考一下吧。
    2017-11-11

最新評(píng)論

崇文区| 沙田区| 乌兰浩特市| 顺昌县| 黄大仙区| 泉州市| 永城市| 汨罗市| 茌平县| 陆川县| 佛冈县| 民丰县| 绥化市| 通州市| 乌兰浩特市| 高安市| 包头市| 两当县| 霸州市| 乌海市| 聂荣县| 揭西县| 五大连池市| 普宁市| 博客| 鹿泉市| 彭州市| 呼玛县| 当雄县| 托克托县| 镇康县| 徐汇区| 新丰县| 宣城市| 蒙阴县| 海城市| 沾益县| 台安县| 井冈山市| 堆龙德庆县| 会理县|