在Linux中軟件包通常是指一個包含了軟件程序、元數據、依賴關系信息和安裝腳本的壓縮文件??。
因為在Linux上如果沒有軟件包管理器,那么想要下載軟件會非常麻煩,不僅需要自己去手動編譯和安裝,而且難以卸載和管理,所以軟件包的出現解決了這些問題.軟件包一般是由程序文件(編譯好的可執行文件、庫文件等。)和配置文件(軟件默認的配置。)元數據(包含軟件名稱、描述、版本、維護者等信息。) 依賴列表(列出該軟件正常運行所必須的其他軟件包。)以及??安裝前/后腳本?(在安裝或卸載前后自動運行的腳本,用于完成一些特定任務(如創建用戶、啟動服務等)。)?
apt/dpkt--(Ubuntu中的軟件包管理器)
dpkt:是底層的包管理工具,負責實際??安裝、查詢、驗證??單個?.rpm
文件。但它??無法自動解決依賴關系??。
apt??:是??高層??的包管理工具,它基于?rpm
,它的核心功能是??自動解決依賴關系??和??從網絡倉庫獲取軟件包??。yum 最終還是會調用?rpm
命令來完成具體的安裝和卸載操作。
apt常用命令:
功能 | ??Ubuntu / Debian (APT)?? | 說明 |
---|---|---|
??安裝軟件?? | ?? | 安裝指定軟件包 |
??更新軟件列表?? | ?? | 從軟件源服務器獲取最新的軟件包列表??(?? |
??更新所有軟件?? | ?? | 更新所有已安裝的軟件包(??注意命令不同??) |
??卸載軟件?? | ?? | 卸載軟件包,??保留配置文件?? |
??徹底卸載?? | ?? | 卸載軟件包,??同時刪除配置文件?? |
??搜索軟件?? | ?? | 在倉庫中搜索軟件包 |
??列出已安裝?? | ?? | 列出所有已安裝的包 |
??獲取包信息?? | ?? | 顯示軟件包的詳細信息 |
??清理緩存?? | ?? | 清理下載的軟件包緩存 |
關于rzsz工具:
rz
和?sz
是 Linux 系統中用于??通過終端(命令行)進行文件上傳和下載??的兩個實用工具,通常用于 ??ZMODEM 協議?? 的文件傳輸。它們特別適合在 ??SSH 終端??(如 Xshell、SecureCRT、PuTTY 等)中使用,方便用戶在不依賴 FTP/SFTP 的情況下快速傳輸文件。
作用:
命令 | 功能 | 適用場景 |
---|---|---|
?? | ??Receive ZMODEM??(接收文件) | 從本地計算機上傳文件到遠程 Linux 服務器 |
?? | ??Send ZMODEM??(發送文件) | 從遠程 Linux 服務器下載文件到本地計算機 |
使用rzsz:
(1)上傳文件到Linux(rz)
在遠程終端執行rz命令,跳轉出一個選擇文件的頁面,點擊你所需要上傳的文件
(2)從Linux下載文件:
在遠程終端執行:
sz <文件名>
你的終端會自動彈出文件保存對話框,選擇保存位置即可下載。
Linux開發工具:
Linux編輯器--vim:
vim
是 Linux/Unix 系統中最強大的??文本編輯器??之一
vim的基本模式:vim有三種主要模式,分別是命令模式(command mode)、插 入模式(Insert mode)和底行模式(last line mode),各模式的功能區分如下:
模式 | 進入方式 | 功能 |
---|---|---|
??普通模式(Normal Mode)?? | 啟動? | 執行??命令??(如復制、粘貼、刪除、保存等) |
??插入模式(Insert Mode)?? | 按? | ??輸入/編輯文本??(類似普通編輯器) |
??命令行模式(Command Mode)?? | 在普通模式下按? | 執行??保存、退出、搜索、替換??等操作 |
基本操作:
(1)打開文件
vim 文件名 # 打開文件(如果不存在則新建)
vim +10 文件名 # 打開文件并跳轉到第 10 行
vim -O2 文件1 文件2 # 左右分屏打開兩個文件
(2)保存和退出
命令 | 功能 |
---|---|
| 保存文件 |
| 退出 vim |
| 保存并退出 |
| ??強制退出(不保存)?? |
| 另存為新文件 |
(3)光標移動
按鍵 | 功能 |
---|---|
| 左、下、上、右移動 |
| 向下/向上翻頁 |
| 跳轉到文件??第一行?? |
| 跳轉到文件??最后一行?? |
| 跳轉到第 10 行 |
| 跳轉到??行尾?? |
| 跳轉到??行首? |
(4)編輯文本
按鍵 | 功能 |
---|---|
| 在??光標前??進入插入模式 |
| 在??光標后??進入插入模式 |
| 在??下一行??插入新行并進入插入模式 |
| ??刪除當前行?? |
| ??復制當前行?? |
| ??粘貼?? |
| ??撤銷(Undo)?? |
| ??重做(Redo)? |
(5)搜索和替換
命令 | 功能 |
---|---|
| ??向下搜索??(按? |
| ??向上搜索?? |
| ??全局替換??(所有匹配) |
| ??替換第 10-20 行的內容? |
(6)分屏操作
命令 | 功能 |
---|---|
| ??水平分屏?? |
| ??垂直分屏?? |
| 切換分屏 |
| 關閉當前分屏 |
(7)末行模式命令集
vim
的 ??末行模式(Command-Line Mode)?? 是在 ??普通模式(Normal Mode)?? 下輸入?:
進入的,用于執行文件操作、搜索替換、設置選項等高級命令。
命令 | 功能 | 作用 |
set nu | 輸入「set nu」后,會在文件中的每一行前面列出行號。 | 列出行號 |
# | 「#」號表示一個數字,在冒號后輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字15, 再回車,就會跳到文章的第15行。 | 跳到文件中的某一行 |
/關鍵字 | 先按「/」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按 「n」會往后尋找到您要的關鍵字為止。 | 查找字符 |
?關鍵字 | 先按「?」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直 按「n」會往前尋找到您要的關鍵字為止。 | 查找字符 |
w | 在冒號輸入字母「w」就可以將文件保存起來 | 保存文件 |
q | 按「q」就是退出,如果無法離開vim,可以在「q」后跟一個「!」強制離開vim。 | 離開vim |
wq | 一般建議離開時,搭配「w」一起使用,這樣在退出的時候還可以保存文件 | 離開vim |
Linux編輯器:gcc/g++使用(用來編譯C語言和C++程序)
(1)安裝gcc/g++(Ubuntu)
sudo apt update
sudo apt install gcc g++ # 安裝 gcc 和 g++
(2)驗證安裝是否成功
gcc --version
g++ --version
(3)背景知識
在C/C++中要想將代碼轉換成可執行文件需要經過預處理,編譯,匯編和鏈接四個步驟.
預處理階段:
作用:處理源代碼中的 ??預處理指令??(以?#
開頭的指令),比如?#include
、#define
、#ifdef
等。
輸入??:.c
或?.cpp
文件
輸出??:.i
文件(預處理后的代碼)
主要操作:
??宏替換??(#define
定義的宏會被展開)
??頭文件包含??(#include
的文件內容會被插入)
??條件編譯??(#ifdef
、#ifndef
等決定哪些代碼會被編譯)
??刪除注釋??(所有注釋?//
和?/* */
會被移除)
使用命令(示例):
gcc -E main.c -o main.i//-E表示只進行預處理
編譯階段:
作用??:將預處理后的代碼 ??轉換成匯編代碼。
??輸入??:.i
文件(或直接?.c
文件)
??輸出??:.s
文件(匯編代碼)
主要操作:
詞法分析??
??語法分析??
??語義分析??
??優化??
??生成匯編代碼?
使用命令(示例):
gcc -S main.i -o main.s//-S表示只編譯
匯編階段:
作用??:將匯編代碼 ??轉換成機器碼(二進制目標文件)??。
??輸入??:.s
文件
??輸出??:.o
文件(目標文件,Windows 上是?.obj
)
主要操作:
將匯編指令 ??逐條翻譯?? 成機器碼(0
和?1
)
生成 ??可重定位目標文件
使用命令(示例)
gcc -c main.s -o main.o//-c表示只匯編
鏈接階段:
作用??:將多個目標文件(.o
)和庫文件(.a
或?.so
) ??合并成一個可執行文件??。
??輸入??:.o
文件 + 庫文件
??輸出??:可執行文件(如?a.out
或?.exe
)
主要操作:
符號解析??:找到所有函數和變量的定義
??重定位??:調整代碼和數據的內存地址
??合并庫??(如?libc.so
、libstdc++.so
)
使用命令(示例)
gcc main.o -o myprogram//-o表示只鏈接
完整編譯流程:(gcc會自動完成所有步驟)
gcc main.c -o myprogram
(4)函數庫
函數庫是一組預編譯的函數、類或變量的集合,可以被其他程序調用。函數庫通常分為 ??靜態庫?? 和 ??動態庫?? 兩種形式。
特性 | 靜態庫( | 動態庫( |
---|---|---|
??文件后綴?? |
|
|
??編譯時行為?? | 庫代碼??直接嵌入??到可執行文件中 | 庫代碼??不嵌入??,僅記錄依賴信息 |
??運行時行為?? | 無需外部庫文件 | 需動態庫文件存在于系統路徑 |
??磁盤空間?? | 可執行文件較大(重復庫代碼) | 可執行文件較小(共享庫代碼) |
??內存占用?? | 每個進程獨立加載庫代碼 | 多個進程共享同一份庫代碼 |
??更新庫版本?? | 需重新編譯可執行文件 | 替換? |
??加載速度?? | 較快(無運行時加載開銷) | 稍慢(需運行時加載) |
??依賴管理?? | 無外部依賴 | 需確保動態庫存在于系統路徑 |
創建靜態庫:
假設有兩個源文件:
add.c
:實現加法函數
sub.c
:實現減法函數
編譯為.o文件
gcc -c add.c -o add.o # 生成 add.o
gcc -c sub.c -o sub.o # 生成 sub.o
打包為靜態庫.a
ar rcs libmath.a add.o sub.o
ar
:歸檔工具(Unix 靜態庫打包命令)。
rcs
:選項組合(r
替換舊文件,c
創建庫,s
生成索引)。
使用靜態庫:
gcc main.c -L. -lmath -o main
-L.
:指定庫搜索路徑(.
表示當前目錄)。
-lmath
:鏈接名為?libmath.a
的庫(省略?lib
前綴和?.a
后綴)。
gcc/g++常用編譯選項:
基礎編譯選項:
選項 | 作用 | 示例 |
---|---|---|
| 指定輸出文件名 |
|
| 只編譯不鏈接,生成? |
|
| 只運行預處理器(生成預處理后的代碼) |
|
| 只編譯到匯編代碼(生成? |
|
| 顯示詳細的編譯過程(調試用) |
|
警告選項:
選項 | 作用 | 示例 |
---|---|---|
| 開啟所有常見警告 |
|
| 啟用額外警告(比? |
|
| 將警告視為錯誤(強制修復) |
|
| 禁用特定警告 |
|
調試選項:
選項 | 作用 | 示例 |
---|---|---|
| 生成調試信息(用于 GDB) |
|
| 生成更詳細的 GDB 調試信息 |
|
| 生成性能分析(gprof 用) |
|
優化選項:
選項 | 優化級別 | 說明 |
---|---|---|
| 無優化 | 編譯速度快,適合調試 |
| 基礎優化 | 平衡代碼大小和執行速度 |
| 中等優化 | 推薦大多數場景使用 |
| 激進優化 | 可能增加代碼體積 |
| 優化代碼大小 | 嵌入式系統常用 |
| 激進優化(忽略嚴格標準) | 可能影響精度 |
Linux調試器--gdb的使用:
(1)安裝gdb(Ubuntu)
sudo apt install gdb
(2)啟動gdb
gdb ./hello # 調試可執行文件
(3)gdb基本命令
命令 | 功能描述 |
---|---|
| 顯示源代碼。從指定行號(或上次位置)開始,每次列出10行。 |
| 列出指定函數的源代碼。 |
| 開始運行程序。 |
| 單步執行(??不??進入函數體)。 |
| 單步執行(??會??進入函數體)。 |
| 在指定行設置斷點。 |
| 在指定函數的開頭設置斷點。 |
| 查看所有已設置的斷點信息(包括編號、位置等)。 |
| 持續執行直至??當前函數返回??,然后暫停。 |
| 打印表達式的值。表達式可為變量、或可調用函數。 |
| 打印變量的值。 |
| 修改變量的值。 |
| 從當前位置開始??連續??執行程序(而非單步),直到下一個斷點或結束。 |
| ??從頭開始??連續執行程序。 |
| ??刪除所有??斷點。 |
| 刪除??指定序號 n?? 的斷點。 |
| ??禁用??所有斷點(斷點仍存在,但不會暫停)。 |
| ??啟用??所有斷點。 |
| 查看當前設置的所有斷點信息。 |
| ??持續跟蹤??查看一個變量,每次程序暫停時都會顯示其值。 |
| ??取消??之前通過? |
| 持續運行直至??指定行 X??(用于跳出循環等場景)。 |
| 查看函數的??調用棧??(層層調用的關系)及參數。 |
| 查看??當前函數棧幀??內所有局部變量的值。 |
| 退出 GDB 調試器。 |
Linux項目自動化構建工具--make/Makefile
make是Linux/Unix系統中一個強大的自動化構建工具,它通過讀取Makefile文件來自動化編譯和構建過程。make工具的主要功能包括:自動確定需要重新編譯的文件,根據依賴關系按正確順序編譯,只重新編譯修改過的文件及其依賴項.make是一條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構建.
Makefile基礎語法:
target: prerequisitesrecipe
??target??:通常是生成的文件名,也可以是一個操作名稱(偽目標)
??prerequisites??:生成target所需的文件或目標
??recipe??:生成target需要執行的命令(必須以tab開頭)
示例:
#include <stdio.h>int main(){printf("hello Makefile!\n");return 0;}
makefile文件:
hello: hello.cgcc -o hello hello.cclean:rm -f hello
那么make的工作原理是怎樣的?
接下來為大家解釋一下:
make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到“hello”這個文件, 并把這個文件作為最終的目標文件。如果hello文件不存在,或是hello所依賴的后面的hello.o文件的文件修改時間要比hello這個文件新(可 以用touch測試),那么,他就會執行后面所定義的命令來生成hello這個文件。如果hello所依賴的hello.o文件不存在,那么make會在當前文件中找目標為hello.o文件的依賴性,如果 找到則再根據那一個規則生成hello.o文件(這有點像一個堆棧的過程)。當然,你的C文件和H文件是存在的啦,于是make會生成 hello.o 文件,然后再用 hello.o 文件聲明 make的終極任務,也就是執行文件hello了。這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯, 而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。
流程圖如下:
行緩沖區概念:
行緩沖區的三種類型:
行緩沖:遇到換行符\n
時刷新緩沖區,或緩沖區填滿時刷新(典型應用:終端標準輸出)
核心特點:
#include <stdio.h>
int main() {printf("This will be buffered"); // 行緩沖,未遇到\n不立即顯示printf(" until newline\n"); // 遇到\n,刷新緩沖區return 0;
}
行緩沖觸發的三種情況:
(1)遇到換行符\n
(2)緩沖區已滿(通常1024或4096字節)
(3)主動調用fflush(stdout)
例:
#include <stdio.h>int main(){printf("hello Makefile!");fflush(stdout);sleep(3);return 0;}
如果不調用fflush(),由于沒有\n,進度條可能不會實時顯示
編寫自己的第一個Linux小程序--進度條:
(1)先在這里設定好的目錄下建立一個cpp文件
vim progressbar.cpp
(2)編譯進度條代碼
(3)編譯文件
g++ -o progress progress.cpp
(4)運行文件
./progress
完成截圖