欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、預(yù)編譯指令

1.1預(yù)處理功能

  • 去掉注釋
  • 頭文件的展開
  • 條件編譯
  • 宏替換

1.2指令

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

實例:

1.3問題擴展

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

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

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

二、編譯(生成匯編)

  • 在這個階段中,gcc 首先要檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言
  • 用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼

實例:

gcc -S code.i -o code.s

三、匯編(生成二進制機器語言)

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

實例:

gcc -c code.s -o code.o

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

4.1庫文件

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

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

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

如何查看Linux的動態(tài)庫和靜態(tài)庫?

ls /usr/lib64/libc.so*

ls /usr/lib64/libc.a*

4.2目標文件和庫的鏈接

動態(tài)鏈接

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

靜態(tài)鏈接

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

4.3動態(tài)庫和靜態(tài)庫的優(yōu)缺點

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

實例:gcc code.c -o code.test

gcc code.c -o code.test_static -static

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

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

五、debug和release

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

實例:gcc code.c -o code.test_debug -g

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

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

實例:file code.test

file code.test_static

總結(jié)

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

相關(guān)文章

  • Linux下SSH免密碼登錄配置詳解

    Linux下SSH免密碼登錄配置詳解

    這篇文章主要介紹了Linux下SSH免密碼登錄配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Linux中使用命令more,less,cat查看文件內(nèi)容

    Linux中使用命令more,less,cat查看文件內(nèi)容

    今天小編就為大家分享一篇關(guān)于Linux中使用命令more,less,cat查看文件內(nèi)容,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Linux下簡易進度條的實現(xiàn)代碼

    Linux下簡易進度條的實現(xiàn)代碼

    下面小編就為大家?guī)硪黄狶inux下簡易進度條的實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Linux修改網(wǎng)卡名稱、主機名的方法

    Linux修改網(wǎng)卡名稱、主機名的方法

    本篇文章主要介紹了Linux修改網(wǎng)卡名稱、主機名的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • linux配置ISCSI服務(wù)器的方法

    linux配置ISCSI服務(wù)器的方法

    下面小編就為大家?guī)硪黄猯inux配置ISCSI服務(wù)器的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • linux服務(wù)器顯卡崩潰解決方案

    linux服務(wù)器顯卡崩潰解決方案

    這篇文章主要介紹了linux服務(wù)器顯卡崩潰解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • CentOS6.5平臺上rsync服務(wù)器安裝配置方法簡述

    CentOS6.5平臺上rsync服務(wù)器安裝配置方法簡述

    這篇文章主要介紹了CentOS6.5平臺上rsync服務(wù)器安裝配置方法,結(jié)合實例形式分析了CentOS上安裝與配置rsync服務(wù)器的具體步驟、相關(guān)命令與使用方法,需要的朋友可以參考下
    2018-04-04
  • Linux兩個服務(wù)器實現(xiàn)數(shù)據(jù)同步方案

    Linux兩個服務(wù)器實現(xiàn)數(shù)據(jù)同步方案

    這篇文章主要介紹了Linux兩個服務(wù)器實現(xiàn)數(shù)據(jù)同步方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • linux控制臺下實現(xiàn)2048小游戲

    linux控制臺下實現(xiàn)2048小游戲

    2048小游戲已經(jīng)火了很久了,各種程序版本的都有,今天我們就來給大家分享一個在Linux控制臺中實現(xiàn)2048小游戲的代碼,希望大家能夠喜歡。
    2015-03-03
  • 在Ubuntu中使用NTP實現(xiàn)時間同步

    在Ubuntu中使用NTP實現(xiàn)時間同步

    這篇文章主要介紹了在Ubuntu中使用NTP實現(xiàn)時間同步,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論