国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用

這篇具有很好參考價值的文章主要介紹了【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器

??樊梓慕:個人主頁

???個人專欄:《C語言》《數(shù)據(jù)結(jié)構(gòu)》《藍橋杯試題》《LeetCode刷題筆記》《實訓(xùn)項目》《C++》《Linux》

??每一個不曾起舞的日子,都是對生命的辜負


目錄

前言

1.gcc/g++語法

2.gcc的使用及編譯器是如何"翻譯"代碼的?

(1)預(yù)處理

(2)編譯

(3)匯編

(4)鏈接

3.動靜態(tài)庫

4.gdb的使用


前言

本篇文章博主將會講解gcc/g++的使用并搭配編譯器相關(guān)知識講解代碼翻譯的過程,一些常見的gcc/g++語法也會總結(jié)出來,在Linux下想要調(diào)試代碼我們需要借助GUN調(diào)試器(gdb),那如何使用gdb博主也會進行講解。


歡迎大家??收藏??以便未來做題時可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================文章來源地址http://www.zghlxwxcb.cn/news/detail-756312.html

GITEE相關(guān)代碼:??fanfei_c的倉庫??

=========================================================================


1.gcc/g++語法

gcc [選項] 要編譯的文件 [選項] [目標(biāo)文件]

??常用選項速覽??


  • -E 只激活預(yù)處理,這個不生成文件,你需要把它重定向到一個輸出文件里面(否則就會打印到屏幕上)。
  • -S 編譯到匯編語言不進行匯編和鏈接。
  • -c 編譯到目標(biāo)代碼。
  • -o 將處理結(jié)果輸出到指定文件,后接文件名。
  • -static 此選項對生成的文件采用靜態(tài)鏈接。
  • -g 生成調(diào)試信息。GNU 調(diào)試器(即gdb調(diào)試器)可利用該信息。
  • -shared 此選項將盡量使用動態(tài)庫,所以生成文件比較小。
  • -w 不生成任何警告信息。
  • -Wall 生成所有警告信息。
  • -O0/-O1/-O2/-O3 編譯器的優(yōu)化選項的4個級別,-O0表示沒有優(yōu)化,-O1為缺省值,-O3優(yōu)化級別最高

2.gcc的使用及編譯器是如何"翻譯"代碼的?

(1)預(yù)處理

預(yù)處理功能主要包括宏替換、頭文件展開、條件編譯、去注釋等,預(yù)處理指令是以#號開頭的代碼行。

實例: gcc –E test.c –o test.i

選項“-E”,該選項的作用是讓 gcc 在預(yù)處理結(jié)束后停止編譯過程。
選項“-o”是指目標(biāo)文件,“.i”文件為已經(jīng)過預(yù)處理的C原始程序

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器

條件編譯多提一嘴:

我們可以通過給編譯器傳遞不同的宏值,來進行對代碼的動態(tài)裁剪。

實例:gcc test.c -o test -D VERSION1=1

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器


(2)編譯

編譯階段,gcc/g++首先檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,將代碼翻譯成匯編語言。

實例:gcc -S test.i -o test.s

用戶可以使用-S選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。

-o選項是指目標(biāo)文件,“xxx.s”文件為已經(jīng)過翻譯的原始程序。

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器


(3)匯編

匯編階段是把編譯階段生成的“xxx.s”文件轉(zhuǎn)成目標(biāo)文件。

實例:gcc –c test.s –o test.o

-c選項可以得到匯編代碼轉(zhuǎn)化為“xxx.o”的二進制目標(biāo)代碼了。

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器


(4)鏈接

在成功完成以上步驟之后,就進入了鏈接階段。

鏈接的主要任務(wù)就是將生成的各個“xxx.o”文件進行鏈接,生成可執(zhí)行文件。

gcc/g++不帶-E、-S、-c選項時,就默認生成預(yù)處理、編譯、匯編、鏈接全過程后的文件。

實例:gcc test.o –o test

巧記:鍵盤左上角ESC分別對應(yīng)預(yù)處理、編譯、匯編。

若不用-o選項指定生成文件的文件名,則默認生成的可執(zhí)行文件名為a.out。

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器

在我們編寫代碼時時常需要使用庫函數(shù)中的函數(shù),比如stdio.h中的printf函數(shù),但當(dāng)我們展開stdio.h文件后發(fā)現(xiàn)也只是有printf的函數(shù)聲明,那么這些庫函數(shù)的定義放在哪里了呢?

就以stdio.h頭文件舉例,里面的庫函數(shù)實現(xiàn)在了名為libc.so.6(C標(biāo)準(zhǔn)庫)的庫文件中。在沒有特別指定時,gcc 會到系統(tǒng)默認的搜索路徑“/usr/lib”下進行查找,也就是鏈接到 libc.so.6 庫函數(shù)中去,這樣就能實現(xiàn)printf函數(shù)了,而這也就是鏈接的作用。


3.動靜態(tài)庫

  • 靜態(tài)庫是指編譯鏈接時,把庫文件的代碼全部加入到可執(zhí)行文件當(dāng)中,因此生成的文件比較大,但在運行時也就不再需要庫文件了,靜態(tài)庫一般以.a為后綴。
  • 動態(tài)庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執(zhí)行文件當(dāng)中,而是在程序運行時由鏈接文件加載庫,這樣可以節(jié)省系統(tǒng)的開銷,動態(tài)庫一般以.so為后綴。

動靜態(tài)庫的優(yōu)缺點對比:

動靜態(tài)鏈接比對
鏈接方式 庫及特性 Linux(后綴) Windows(后綴)
動態(tài)鏈接 動態(tài)庫(被多個使用者共同使用,一旦缺失,所有程序都不可以運行了) .so .dll
靜態(tài)鏈接 靜態(tài)庫(不需要關(guān)聯(lián),將庫文件代碼直接拷貝到可執(zhí)行文件中) .a .lib

動態(tài)庫

  • 優(yōu)點:節(jié)省資源(包括磁盤、內(nèi)存、網(wǎng)絡(luò)等資源),不會出現(xiàn)太多重復(fù)代碼。
  • 缺點:對庫的依賴性較強,一旦庫丟失,所有使用這個庫的程序都無法運行。

靜態(tài)庫

  • 優(yōu)點:不依賴庫,同類型平臺中都可以直接運行。
  • 缺點:可執(zhí)行程序體積較大,比較浪費自愿。

動態(tài)鏈接實例:gcc -o mybin mytest.c(Linux默認)

靜態(tài)鏈接實例:gcc -o mybin-static mytest.c -static


可利用file查看可執(zhí)行文件的鏈接方式:

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器

?比對下靜態(tài)鏈接與動態(tài)鏈接生成的可執(zhí)行文件的大小:

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器

所以說靜態(tài)鏈接安全可靠,但是浪費資源。?


可利用ldd 文件名查看可執(zhí)行文件所依賴的庫(當(dāng)有缺失時會有提示):

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器


4.gdb的使用

首先我們知道程序的發(fā)布方式有兩種:

  • debug版本:程序本身會被加入更多的調(diào)試信息,以便于進行調(diào)試。
  • release版本:不會添加任何調(diào)試信息,是不可調(diào)試的。

在Linux當(dāng)中g(shù)cc/g++默認生成的可執(zhí)行程序是release版本的,是不可被調(diào)試的。

如果想生成debug版本,就需要在使用gcc/g++生成可執(zhí)行程序時加上-g選項。

【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用,Linux,linux,運維,服務(wù)器


???gdb語法速覽??

【安裝gdb】

  • sudo yum install -y gdb?

【進入gdb】

  • 指令: gdb?文件名

【調(diào)試】

  • 「run/r」:運行代碼(啟動調(diào)試)。
  • 「next/n」:逐過程調(diào)試。
  • 「step/s」:逐語句調(diào)試。
  • 「until?行號」:跳轉(zhuǎn)至指定行。
  • 「finish」:執(zhí)行完當(dāng)前正在調(diào)用的函數(shù)后停下來(不能是主函數(shù))。
  • 「continue/c」:運行到下一個斷點處。
  • 「set?var?變量=x」:修改變量的值為x。

【顯示】

  • 「list/l?n」:顯示從第n行開始的源代碼,每次顯示10行,若n未給出則默認從上次的位置往下顯示.。
  • 「list/l?函數(shù)名」:顯示該函數(shù)的源代碼。
  • 「print/p?變量」:打印變量的值。
  • 「print/p?&變量」:打印變量的地址。
  • 「print/p?表達式」:打印表達式的值,通過表達式可以修改變量的值。
  • 「display?變量」:將變量加入常顯示(每次停下來都顯示它的值)。
  • 「display?&變量」:將變量的地址加入常顯示。
  • 「undisplay?編號」:取消指定編號變量的常顯示。
  • 「bt」:查看各級函數(shù)調(diào)用及參數(shù)。
  • 「info/i?locals」:查看當(dāng)前棧幀當(dāng)中局部變量的值。

【斷點】

  • 「break/b?n」:在第n行設(shè)置斷點。(多文件"在test.c文件的第7行"打斷點:b test.c:7)
  • 「break/b?函數(shù)名」:在某函數(shù)體內(nèi)第一行設(shè)置斷點。
  • 「info?breakpoint/b」:查看已打斷點信息。
  • 「delete/d?編號」:刪除指定編號的斷點。
  • 「disable?編號」:禁用指定編號的斷點。
  • 「enable?編號」:啟用指定編號的斷點。

【退出gdb】

  • 「quit/q」:退出gdb。

=========================================================================

如果你對該系列文章有興趣的話,歡迎持續(xù)關(guān)注博主動態(tài),博主會持續(xù)輸出優(yōu)質(zhì)內(nèi)容

??博主很需要大家的支持,你的支持是我創(chuàng)作的不竭動力??

??~ 點贊收藏+關(guān)注 ~??

=========================================================================

到了這里,關(guān)于【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【UNIX 環(huán)境編程】GCC 編譯器 | Makefile 基礎(chǔ)入門 | GDB 調(diào)試教學(xué)

    【UNIX 環(huán)境編程】GCC 編譯器 | Makefile 基礎(chǔ)入門 | GDB 調(diào)試教學(xué)

    ?? 寫在前面: 本文將介紹如何使用 GCC 編譯器編譯,并詳細介紹了 Makefile 的基本構(gòu)造、創(chuàng)建Makefile 文件以及 Makefile 變量,以提高編譯效率。此外,本文還將探討GDB調(diào)試器的使用,包括調(diào)試前的準(zhǔn)備、readelf 讀取 ELF 文件信息、顯示代碼、斷點、調(diào)試、監(jiān)視、跳轉(zhuǎn)等內(nèi)容。?

    2024年02月03日
    瀏覽(54)
  • 為 Microsoft C++ 配置 VS Code在本教程中,您將配置 Visual Studio Code 以在 Windows 上使用 Microsoft Visual C++ 編譯器和調(diào)試器

    為 Microsoft C++ 配置 VS Code在本教程中,您將配置 Visual Studio Code 以在 Windows 上使用 Microsoft Visual C++ 編譯器和調(diào)試器

    在本教程中,您將配置 Visual Studio Code 以在 Windows 上使用 Microsoft Visual C++ 編譯器和調(diào)試器。 配置完 VS Code 后,你將在 VS Code 中編譯和調(diào)試一個簡單的 Hello World 程序。本教程不教您有關(guān) Microsoft C++ 工具集或 C++ 語言的詳細信息。對于這些主題,網(wǎng)上有很多很好的資源。 如果您

    2024年02月10日
    瀏覽(46)
  • Linux開發(fā)工具大全 - 軟件包管理器yum | vim編輯器 | gcc/g++編譯器 | 自動化構(gòu)建工具Make/Makefile | gdb調(diào)試工具

    Linux開發(fā)工具大全 - 軟件包管理器yum | vim編輯器 | gcc/g++編譯器 | 自動化構(gòu)建工具Make/Makefile | gdb調(diào)試工具

    目錄 Ⅰ.? Linux 軟件包管理器 yum 一、yum 背景知識 二、yum 的基本使用 1、查看軟件包 2、軟件包名稱構(gòu)成 3、安裝軟件 4、卸載軟件 Ⅱ.vim編輯器 ?一、認識vim 1、vim概念? 2、模式及其切換 ?二、vim使用 1、vim的指令(重要)? 命令模式 插入模式 底行模式 2、vim配置 Ⅲ.gcc/g++編

    2024年02月05日
    瀏覽(73)
  • [linux初階][vim-gcc-gdb] TwoCharter: gcc編譯器

    [linux初階][vim-gcc-gdb] TwoCharter: gcc編譯器

    目錄 一.Linux中g(shù)cc編譯器的下載與安裝 二.使用gcc編譯器來翻譯 C語言程序? ①.編寫C語言代碼 ②翻譯C語言代碼 a.預(yù)處理 b.編譯? c.匯編? d.鏈接 ③.執(zhí)行Main 二進制可執(zhí)行程序(.exe文件)? 三.總結(jié)? 使用yum命令(相當(dāng)于手機上的應(yīng)用市場)來進行安裝. ?下載完畢之后,使用 which gc

    2024年04月10日
    瀏覽(45)
  • Linux——gdb調(diào)試器

    Linux——gdb調(diào)試器

    目錄 ? ?前言: 二.gdb定義及指令: 如何查看該exe文件是否為Debug版本?兩種方法: 三.gdb調(diào)試: ? ? ? ??調(diào)試指令1:l指令(小寫L) run指令:運行程序,相當(dāng)于VS中的直接運行不調(diào)試——可簡化輸入r ?break指令:設(shè)置斷點——指令可簡化輸入為b??編輯? info b指令:查看整個代碼

    2024年02月07日
    瀏覽(21)
  • Linux--調(diào)試器:gdb

    Linux--調(diào)試器:gdb

    gcc與g++默認動態(tài)鏈接形成的可執(zhí)行程序(比如a.out)是 release 版本,不可調(diào)試!??! 如何搞成debug可調(diào)試版本? 查看可執(zhí)行程序存儲了哪些內(nèi)存空間: ? 調(diào)試語法:

    2024年02月13日
    瀏覽(19)
  • Linux調(diào)試器gdb

    Linux調(diào)試器gdb

    本文已收錄至《 Linux知識與編程 》專欄! 作者: ARMCSKGT 演示環(huán)境: CentOS 7? ?? ? 目錄 前言 正文 下載gdb 生成可調(diào)式文件 進入gdb gdb常用指令 查看代碼 l? 運行程序 r? 斷點設(shè)置 b? 顯示信息 info? 查看斷點 info b? 刪除斷點?d? 禁用斷點 disable breakpoints? 啟用斷點 enable brea

    2024年02月14日
    瀏覽(21)
  • Linux - 還不懂 gdb 調(diào)試器?(調(diào)試軟件)

    Linux - 還不懂 gdb 調(diào)試器?(調(diào)試軟件)

    當(dāng)前,我們可以使用 make/makefile 來程序化執(zhí)行代碼文件;可以使用 gcc/g++ 等編譯器來編譯代碼;可以使用 vim 編輯器來編寫代碼;其實在 Linux 當(dāng)中還有一個工具,可以實現(xiàn)調(diào)試工作,這個工具就是 -- gdb。 在了解調(diào)試器之前,你應(yīng)該對代碼的發(fā)布版本做一些了解: 我們在 VS

    2024年02月07日
    瀏覽(21)
  • Linux調(diào)試器之gdb

    Linux調(diào)試器之gdb

    我們前面介紹了幾個基本的環(huán)境開發(fā)工具。例如通過yum我們可以安裝和卸載軟件、通過vim我們可以寫代碼、通過gcc和g++我們可以編譯代碼成可執(zhí)行程序。但是如何在Linux下調(diào)試代碼呢?我們并未介紹,本期我們將來介紹最后一個工具 --- 調(diào)試器gdb。 程序的發(fā)布方式 gdb基本的調(diào)

    2024年04月16日
    瀏覽(37)
  • 【Linux】Linux調(diào)試器-gdb使用

    【Linux】Linux調(diào)試器-gdb使用

    程序的發(fā)布方式有兩種,debug模式和release模式 Linux gcc/g++出來的二進制程序,默認是release模式 要使用gdb調(diào)試,必須在源代碼生成二進制程序的時候, 加上 -g 選項 退出:? 調(diào)試命令: list/l 行號:顯示binFile源代碼,接著上次的位置往下列,每次列10行。 list/l 函數(shù)名:列出某

    2024年02月21日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包