Linux基礎(六):Linux 系統上 C 程序的編譯與調試

? ? ?本篇博客詳細分析,Linux平臺上C程序的編譯過程與調試方法,這也是我們后續程序開發的基礎。

目錄

一、第一個hello world程序

1.1 創建.c文件

1.2 編譯鏈接? +? 運行可執行程序

二、編譯鏈接過程

2.1?預編譯階段

2.2?編譯階段

2.3?匯編階段

2.4?鏈接階段

三、gcc 分步編譯鏈接

?3.1 一步完成編譯鏈接生成可執行程序

3.2 分兩步完成編譯鏈接生成可執行程序

3.3 多文件編譯鏈接

四、 make工具和makefile文件

4.1 什么是make和makefile

4.2 利用make工具完成上一小節的自動化編譯過程

4.2.1 編寫makefile文件

4.2.2 利用make工具自動生成可執行程序

4.2.3 總結

五、gdb 調試

5.1?Debug 版本和 Release 版本

5.2?單進程、單線程基礎調試命令

5.3 使用GDB軟件調試程序的基本步驟

5.4 如何在自動化編譯工具中加入命令,自動生成含有調試信息的Debug版本

5.5?多進程調試命令

5.6?多線程調試命令


一、第一個hello world程序

1.1 創建.c文件

1.2 編譯鏈接? +? 運行可執行程序

? ? ? C語言是一門編譯型語言,編譯型語言首先將源代碼編譯生成機器語言,再由機器運行機器碼(二進制)。對于編譯型語言,繞不過的就是編譯器。GCC(GNU編譯器套件):GNU Compiler Collection。可以編譯C、C++、JAVA、Fortran、Pascal、Object-C、Ada等語言。

gcc是GCC中的GNU C Compiler(C 編譯器),g++是GCC中的GNU C++ Compiler(C++編譯器)

? ? ?注意:對于Linux平臺下,生成的可執行程序沒有后綴.exe ,關于編譯鏈接的過程,我們下面作詳細分析。

二、編譯鏈接過程

2.1?預編譯階段

a) 刪除所有的“#define”,并且展開所有的宏定義;

b) 處理所有的條件預編譯指令,“#if”、“#ifdef”、“#endif”等;

c) 處理“#include”預編譯指令,將被包含的文件插入到該預編譯指令的位置;

d) 刪除所有的注釋;

e) 添加行號和文件名標識,以便于編譯器產生調試用的符號信息及編譯時產生編譯錯誤和警告時顯示行號;

f) 保留所有的#pragma 編譯器指令,因為編譯器需要使用它們。

2.2?編譯階段

詞法分析、語法分析、語義分析,代碼優化,匯總符號。

2.3?匯編階段

將匯編指令翻譯成二進制格式,生成各個 section,生成符號表。

2.4?鏈接階段

a) 合并各個 section,調整 section 的起始位移和段大小,合并符號表,進行符號解析, 給符號分配虛擬地址

b) 符號重定位

三、gcc 分步編譯鏈接

3.1 一步完成編譯鏈接生成可執行程序

gcc? -o main main.c

3.2 分兩步完成編譯鏈接生成可執行程序

step1、gcc? ?-c? ?main.c? ?? ? ? ? ? ? ? ? 生成main.o文件

step2、gcc? ?-o? ?main? ? ?main.o? ? ?生成main(main.exe)可執行程序

3.3 多文件編譯鏈接

? ? 創建3個源文件如下:add.c? max.c? main.c?

方式1:一步直接完成編譯鏈接生成可執行程序

方式2:分兩步;

  1. 首先,先把每個文件生成對應的.o文件, gcc -c xxx.c
  2. 其次,將所有的.o文件鏈接生成可執行程序文件main, gcc -o main? main.o xx.o xx.o

四、 make工具和makefile文件

4.1 什么是make和makefile

?????? 當源碼文件比較多的時候就不適合通過直接輸入gcc命令來編譯,這時候就需要一個自動化的編譯工具, 這就是make工具,make是一條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構建。

  1. make:一般說GNU Make,是一個軟件,用于將源代碼文件編譯為可執行的二進制文件,make工具主要用于完成自動化編譯make工具編譯的時候需要Makefile文件提供編譯文件。
  2. Makefile:make工具所使用的文件,Makefile指明了編譯規則。makefile帶來的好處就是“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。

4.2 利用make工具完成上一小節的自動化編譯過程

4.2.1 編寫makefile文件

工程是需要被清理的,像clean這種,沒有被第一個目標文件直接或間接關聯,那么它后面所定義的命令將不會被自動執行, 不過,我們可以顯示要make執行。即命令——“make clean”,以此來清除所有的目標文件,以便重編譯。?

4.2.2 利用make工具自動生成可執行程序

4.2.3 總結

? ? ? 利用make工具完成自動化編譯的大致步驟如下:

  1. 提供好所有的源文件.c和makefile文件
  2. 執行命令make, 自動生成編譯鏈接四個階段的所有文件?
  3. 清理中間的目標文件,執行命令:make? clean

五、gdb 調試

5.1?Debug 版本和 Release 版本

1、Debug 版本

? ? ?Debug 版本為可調試版本,生成的可執行文件中包含調試需要的信息。我們作為開發人 員,最常用的就是 debug 版本的可執行文件。 Debug 版本的生成: 因為調試信息是在編譯過程時加入到中間文件(.o)中的,所以必須在編譯時控制其生成包含調試信息的中間文件。如:gcc -o hello hello.c -g

2、Release 版本

? ? ? ? Release 版本為發行版本,是提供給用戶使用的版本。用 gcc 默認生成的就是 Release 版 本。 因此,我們使用gdb進行調試 ,首先將源代碼編譯、鏈接生成 Debug 版本的可執行文件,然后通過‘gdb Debug 版本 的可執行文件名’進入調試模式。

5.2?單進程、單線程基礎調試命令

命令作用
l顯示代碼,默認一次只顯示10行
b+行號給指定行添加斷點
b+函數名給指點函數的第一有效行添加一個斷點
info break顯示斷點信息
delete +斷點編號刪除指定斷點
r(run)運行程序,啟動調試代碼
n(next)單步執行
c (continue)繼續執行,直接執行到下一個斷點處
s(step)進入將要被調用的函數中執行
?finish跳出函數
p +變量 (print)打印變量的值
p + &變量打印變量的地址
p arr(數組名)打印數組所有元素的值
ptype? + 變量顯示變量類型
bt(breaktrace)顯示函數調用棧
q (quit)退出調試
  1. l +行號 就能跳轉到該行。
  2. l +文件名:行號 能跳轉文件 跳轉別的文件的第幾行 l add.c :1;
  3. 顯示函數調用的棧關系 上邊信息顯示當前所在位置,下面信息顯示執行完當前程序會回到哪一行。 ?

5.3 使用GDB軟件調試程序的基本步驟

? ? ? ?GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等 IDE的調試,但如果你是在UNIX平臺下做軟件,你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。調試程序的基本步驟如下:

  1. 生成包含調試信息的Debug版本,如:gcc? -o test test.c -g
  2. 執行命令:gdb? test
  3. 進入調試,利用常用的命令

5.4 如何在自動化編譯工具中加入命令,自動生成含有調試信息的Debug版本

在前面定義一個 GDB=-g,在生成規則后加$(GDB),就會取GDB的值;不讓生成debug版本就是把GDB置空(GDB=)。 ?

5.5?多進程調試命令

(gdb)set follow-fork-mode mode

mode 可以選擇 parent 或者 child,即:選擇調試那個進程。 注意:未被跟蹤調試的進程會直接執行結束。

5.6?多線程調試命令

a) 利用 info threads 查看線程信息;

b) thread id 調試目標 id 指定的線程;

c) set scheduler-locking off | on | step; “off”表示不鎖定任何線程; “on”只有當前被調試的線程繼續運行; “step”在單步執行的時候,只有當前線程會執行;

? ? ? 以上就是全部內容!請務必掌握,這是后續學習的基礎,歡迎大家點贊加關注評論,您的支持是我前進最大的動力!下期再見!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15524.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15524.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15524.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一千題,No.0025(Chess For Three)

描述 Three friends gathered to play a few games of chess together. In every game, two of them play against each other. The winner gets 2 points while the loser gets 0, and in case of a draw, both players get 1 point each. Note that the same pair of playe…

【MySQL精通之路】SQL語句(3)-鎖和事務語句

目錄 1.START TRANSACTION、COMMIT和ROLLBACK語句 2.無法回滾的語句 3.導致隱含COMMIT的語句 4.SAVEPOINT、ROLLBACK TO SAVEPOINT和RELEASE SAVEPOINT語句 5.LOCK INSTANCE FOR BACKUP和UNLOCK INSTANCE語句 6.LOCK TABLE和UNLOCK TABLES語句 6.1 表鎖獲取 6.2 表鎖釋放…

qemu+gdb調試linux內核

打開CONFIG_DEBUG_INFO,編譯內核 通過圖形菜單配置該宏,執行make menuconfig。 kernel hacking —> compile-time checks and compiler options —> compile the kernel with debug info 驗證是否打開成功,grep -nr “CONFIG_DEBUG_INFO” .config。 打開成功,然后…

plsql 學習

過程化編程語言 賦值:: ||:連接符號 dbms_output.put_line() :輸出的語句 var_name ACCOUNTLIBRARY.USERNAME%type; 變量名;某個表的數據類型;賦值給變量名 用下面的方法更好用 異常exception 循…

力扣HOT100 - 75. 顏色分類

解題思路&#xff1a; 單指針&#xff0c;對數組進行兩次遍歷。 class Solution {public void sortColors(int[] nums) {int p 0;int n nums.length;for (int i 0; i < n; i) {if (nums[i] 0) {int tmp nums[i];nums[i] nums[p];nums[p] tmp;p;}}for (int i p; i …

java庫和包的概念

在Java中&#xff0c;"庫"和"包"是兩個不同的概念&#xff0c;但它們之間存在著密切的關聯。 庫&#xff08;Library&#xff09; 定義&#xff1a;庫是一組已經編寫好的代碼和資源&#xff0c;用于解決特定的問題或提供特定的功能。它可以包含一個或多個…

【前端每日基礎】day19——回調函數

回調函數 回調函數是一種常見的編程概念&#xff0c;它是指在函數執行完畢后&#xff0c;將另一個函數作為參數傳遞給它&#xff0c;以便在特定條件滿足時調用這個函數。回調函數通常用于處理異步操作、事件處理、定時器等場景&#xff0c;以實現非阻塞式的程序設計。 特點和…

存儲+調優:存儲-IP-SAN-EXTENSION

存儲調優&#xff1a;存儲-IP-SAN-EXTENSION 文件系統的鎖標記 GFS&#xff08;鎖表空間&#xff09; ----------- ------------ ------------- 節點 | ndoe1 | | node2 | | node3 | ---------- ------…

斷更是我的錯

打算在暑假每天兩個文章&#xff0c;大概是6月20多號開始吧。

vue3中watch語法

在Vue 3中&#xff0c;watch仍然是一個用于觀察和響應Vue實例上的數據變化的選項。watch選項接受一個對象&#xff0c;該對象中的屬性對應要觀察的數據屬性&#xff0c;并指定對應的回調函數&#xff0c;用于處理數據變化時的邏輯。 watch選項的語法如下&#xff1a; watch: …

GNSS中的多路徑效應原理及計算方法

1 多路徑效應原理 圖1 多路徑效應原理圖 2 計算方法 如需原文&#xff0c;可加多源融合定位與智能控制討論群獲取,QQ群號&#xff1a;51885949

ORACLE 6節點組成的ACFS文件系統異常的分析思路

近期遇到多次6節點集群的ACFS文件系統環境異常問題&#xff1b;如24日中午12點附近出現ACFS文件系統訪問異常&#xff0c;通過查看集群ALERT日志、CSSD進程日志及OSW監控軟件的日志&#xff0c;可以發現OSW監控軟件在11:55-12:40分時沒有收集到虛擬機LINUX主機的監控數據&#…

【OceanBase診斷調優】—— 直連普通租戶時遇到報錯:Tenant not in this server

本文介紹了直連 OceanBase 數據庫中的普通租戶時&#xff0c;出現報錯&#xff1a;ERROR 5150 (HY000) : Tenant not in this server 的處理方法。 問題描述 在 n-n 或者 n-n-n (n>1) 的部署架構中&#xff0c;使用 2881 端口 直連 OceanBase 集群的普通租戶&#xff0c;可…

ChatGPT大語言模型發展歷史

技術背景與OpenAI成立 2010年代初&#xff1a;隨著深度學習技術的突破&#xff0c;特別是循環神經網絡(RNN)和長短時記憶網絡(LSTM)的成功應用&#xff0c;自然語言處理(NLP)領域開始經歷一場革命。2015年12月&#xff1a;OpenAI作為一個旨在確保人工智能(AI)研究造福全人類的…

Java并行流

Java并行流 什么是并行流&#xff1f;并行流的優缺點優點缺點 如何使用&#xff1f;1.創建流2.轉換為并行流3.流操作4.收集結果5.關閉流 并行流的本質1.任務劃分和調度2.并發處理數據3.任務結果合并4.性能優化 參考文獻官方文檔 什么是并行流&#xff1f; 并行流&#xff08;p…

【C++風云錄】揭秘醫療機器人:技術解析與應用探索

打造智能醫療&#xff1a;醫療機器人技術與手術輔助 前言 本文將在深度和廣度上探討六種尖端醫療機器人系統&#xff0c;并重點介紹其應用、C控制接口及其功能。這些機器人系統分別是ROSA Robot、Da Vinci Surgical SystemSDK、Intuitive Surgical’s da Vinci Xi、Medroboti…

黑龍江等保測評新要求下的政府信息化安全實踐案例分析

在數字化轉型的浪潮中&#xff0c;政府機構作為社會管理和公共服務的核心&#xff0c;其信息安全的重要性日益凸顯。近期&#xff0c;黑龍江省積極響應國家網絡安全戰略&#xff0c;依據最新的等級保護測評&#xff08;簡稱“等保測評”&#xff09;要求&#xff0c;對政府信息…

SpringBoot運維篇(打包,多環境,日志)

文章目錄 一、SpringBoot程序的打包與運行二、配置高級三、多環境開發四、日志 一、SpringBoot程序的打包與運行 剛開始做開發學習的小伙伴可能在有一個知識上面有錯誤的認知&#xff0c;我們天天寫程序是在Idea下寫的&#xff0c;運行也是在Idea下運行的。 ?但是實際開發完成…

CDH6.3.2集成Flink1.17

直接運行腳本即可&#xff0c;一鍵輸出相關依賴包 運行步驟已給到文檔 下載地址

Html基礎筆記

Html超文本標記語言 (HyperText Markup Language) 超文本 指的是網頁中可以顯示的內容(圖片,超鏈接,視頻,) 標記語言 標記–>標簽(標注) 例如:買東西的時候—>商品具有標簽,看到標簽就知道商品的屬性(價格,材質,型號等,) 標記語言就是提供了很多的標簽,不同的標簽…