在Linux系統中安裝軟件,以前需要下載源代碼并編譯成可執行文件,但這過于繁瑣。后來,常用軟件被預先編譯成軟件包,存儲在服務器上,通過包管理器(類似手機應用商店)可以輕松找到并安裝這些軟件包。yum是Linux中常用的包管理器之一。
我們可以通過命令查看當前使用的yum源。在圖中可以看到,我們使用的是華為源,因為這里使用的是華為云服務器。
如果使用的是虛擬機進行開發,yum源可能會有些過時,我們可以更換yum源。只需將centos-Base.repo文件替換為新的yum源文件即可。實際上,這是在更改yum源的網址,但我們不建議手動修改網址,而是直接用現成的文件替換。
如果主機上沒有yum,可以通過以下命令下載這個“應用商店”。
1、makefile的使用
首先,在目錄下創建一個makefile文件。
然后使用vim打開文件,首先列出依賴關系,如圖所示,test依賴于test.o,意味著test的生成需要test.o,test.o依賴于test.s,test.s依賴于test.i,test.i依賴于test.c,clean不依賴任何文件。接著,在依賴關系的下一行用tab鍵縮進,寫明生成所需的命令。
完成makefile文件后,直接輸入make命令即可實現文件中的一鍵構建。
使用make clean命令可以清理以.iso為后綴的文件。
2、makefile的原理
(1)makefile生成可執行程序
以剛才的例子為例,當輸入make命令時,make會在當前目錄下尋找makefile/Makefile文件(大小寫不敏感,功能相同)。找到后,它會將第一個目標文件test作為最終目標。test依賴于test.o,如果test.o不存在,make會繼續查找test.o的依賴test.s,以此類推,直到找到test.c,然后逐步生成.i、.s、.o文件,最終編譯出目標文件test。如果編譯過程中遇到錯誤,make會立即退出并報錯。
如果不需要中間文件,可以簡化如下圖所示。
(2)清理makefile相關文件
在構建項目時,需要清理工程文件,clean命令用于此目的。它不依賴任何文件,因此后面沒有其他內容,命令為rm。通過make clean來清理工程文件。
(3)makefile文件機制
我們發現,執行clean需要使用make clean,而執行test只需make即可。輸入make test與make的效果相同。因此,make默認執行構建目標文件的操作,但也可以指定目標文件如make test,效果相同。除目標文件外,其他類似clean的操作需要通過make clean來執行。
make還具有保護機制,禁止在修改文件之前多次編譯。make只會在源文件的時間戳比目標文件的時間戳新時才重新編譯。時間戳的比較是通過將時間轉化為時間戳進行的。
(4)偽目標
如果想要多次編譯,可以使用偽目標機制。它可以使選定的操作始終可執行,只需在相應行前加上.PHYONY:源文件。
但我們通常會使用這個保護機制,因為它能防止不必要的資源浪費。因此,在編寫makefile時,通常將.PHYONY添加到make clean之前。
原因如下:
第一,避免與文件沖突。通常,make clean用于刪除構建過程中生成的文件,如.o目標文件、可執行文件和其他臨時文件。其目的是將項目恢復到干凈狀態。如果clean不是偽目標,而項目中存在名為clean的文件,make會根據文件的時間戳判斷是否執行該目標的命令。如果clean文件比其依賴文件更新,make會認為該目標是最新的,從而不會執行make clean命令,這違背了make clean的初衷。
第二,明確執行操作的意圖。將clean定義為偽目標,明確告訴make工具,clean是一個不對應任何文件的目標,make應該始終執行其命令,而不考慮文件的存在和時間戳。
第三,保持makefile的一致性和可維護性。使用偽目標可以使makefile的行為更加可預測。對于像clean這樣的目標,我們希望它執行一個操作而不是構建一個文件,將其定義為偽目標符合其操作的性質,使makefile的邏輯更加清晰。
(5)符號代替
上述兩段代碼意義相同。
符號 | 意義 |
---|---|
$@ | 表示規則中的目標文件 |
$^ | 表示規則中的所有依賴文件 |
$ | 表示規則中的第一個依賴文件 |
六、調試工具–gdb
1、背景
在學習c語言時,如果不是在學校學習,通常會使用VS或vscode作為第一個編譯器。以VS為例,學習過程中會學習調試功能。調試的前提是程序以debug方式發布。
程序有兩種發布方式:debug和release。通過gcc和g++編譯的程序默認是release版本。如果需要調試,就需要debug版本,在源代碼生成二進制程序時添加-g選項。在Linux中,調試工具是gdb。
2、使用
創建一個簡單的加法程序示例,用于學習C語言調試。
test是以debug版本發布的,test_r是以release版本發布的,可以明顯看出debug版本的test文件更大。
通過命令開始進入調試。
命令 | 縮寫 | 描述 |
---|---|---|
break | b | 在程序的指定行號處設置斷點 |
break | b | 在指定的函數入口處設置斷點 |
info breakpoints | i b | 顯示當前設置的所有斷點信息 |
run | r | 開始運行程序,如果程序需要命令行參數可在其后添加 |
next | n | 執行下一行代碼,但不進入函數內部,函數調用會直接執行完 |
step | s | 執行下一行代碼,若為函數調用則進入函數內部 |
p | 打印變量的值 | |
display | 跟蹤顯示,每次程序暫停時都顯示該表達式的值 | |
undisplay | 取消跟蹤 | |
backtrace | bt | 顯示當前的調用棧信息 |
continue | c | 從當前位置繼續執行程序,直到下一個斷點或程序結束 |
clear | cl | 清除指定行號的斷點 |
delete | d | 刪除指定編號的斷點 |
quit | q | 退出 GDB 調試會話 |
break if | b if | 在滿足特定條件時觸發斷點 |
watch | 當表達式的值發生變化時,程序會暫停 | |
info threads | 顯示所有線程的信息 | |
Thread | 切換到指定的線程進行調試 | |
list | l | 列出以行號為中心的上下共10行代碼 |
list | l | 列出某個函數的源代碼 |
finish | 執行到當前函數返回,然后停下來等待命令 |
gdb和VS的對應表格如上所示,對應效果與VS相同。
大家盡量養成使用調試工具的習慣,這樣找bug會更規范,不會遇到痛苦的地方。
今日分享就到這里了。