3.Linux工具(1)
文章目錄
- 3.Linux工具(1)
- Linux 軟件包管理器 yum
- 什么是軟件包
- 關于 rzsz
- 查看軟件包——yum list命令
- 如何安裝軟件
- 如何卸載軟件
- 補充——yum如何找到要安裝軟件的下載地址
- Linux開發工具
- Linux編輯器-vim使用
- 1.vim的基本概念
- 2.vim的基本操作
- 3.簡單vim配置
- Linux編譯器-gcc/g++使用
- 1.背景知識
- 2.gcc如何完成
- 預處理(進行宏替換)
- 編譯(生成匯編)
- 匯編(生成機器可識別代碼)
- 連接(生成可執行文件或庫文件)
- 動態庫
- 動態庫、動態鏈接、靜態庫與靜態鏈接的對比總結
- gcc選項
Linux 軟件包管理器 yum
什么是軟件包
- 在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼, 并進行編譯, 得到可執行程序.
- 但是這樣太麻煩了, 于是有些人把一些常用的軟件提前編譯好, 做成軟件包(可以理解成windows上的安裝程序)放在一個服務器上, 通過包管理器可以很方便的獲取到這個編譯好的軟件包, 直接進行安裝.
- 軟件包和軟件包管理器, 就好比 “App” 和 “應用商店” 這樣的關系.
- yum(Yellow dog Updater, Modi?ed)是Linux下非常常用的一種包管理器. 主要應用在Fedora, RedHat,Centos等發行版上.
關于 rzsz
這個工具用于 windows 機器和遠端的 Linux 機器通過 XShell 傳輸文件,安裝完畢之后可以通過拖拽的方式將文件上傳過去.
- 注意事項
關于 yum 的所有操作必須保證主機(虛擬機)網絡暢通!!!
可以通過 ping 指令驗證
查看軟件包——yum list命令
通過 yum list 命令可以羅列出當前一共有哪些軟件包. 由于包的數目可能非常之多, 這里我們需要使用 grep 命令只篩選出我們關注的包. 例如:
[root@hcss-ecs-b735 dir2]# yum list | grep gcc-c++
gcc-c++.x86_64 4.8.5-44.el7 @base
avr-gcc-c++.x86_64 4.9.2-1.el7 epel
gcc-c++-aarch64-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-alpha-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-arm-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-avr32-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-bfin-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-c6x-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-cris-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-frv-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-h8300-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-hppa-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-hppa64-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-ia64-linux-gnu.x86_64 4.8.5-16.el7.1 epel
注意:
- 軟件包名稱: 主版本號、次版本號、源程序發行號、軟件包的發行號、主機平臺、cpu架構
x86_64
后綴表示64位系統的安裝包,i686
后綴表示32位系統安裝包. 選擇包時要和系統匹配.el7
表示操作系統發行版的版本,el7
表示的是centos7/redhat7
.el6
表示centos6/redhat6
.- 最后一列,
base
表示的是 “軟件源” 的名稱, 類似于 “小米應用商店”, “華為應用商店” 這樣的概念.
如何安裝軟件
通過 yum, 我們可以通過很簡單的一條命令完成 gcc-c++ 的安裝.
[root@hcss-ecs-b735 dir2]# yum install -y gcc-c++ #主要看這里
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package gcc-c++.x86_64 0:4.8.5-44.el7 will be installed
--> Processing Dependency: libstdc++-devel = 4.8.5-44.el7 for package: gcc-c++-4.8.5-44.el7.x86_64
--> Running transaction check
---> Package libstdc++-devel.x86_64 0:4.8.5-44.el7 will be installed
--> Finished Dependency ResolutionDependencies Resolved=============================================================================================Package Arch Version Repository Size
=============================================================================================
Installing:gcc-c++ x86_64 4.8.5-44.el7 base 7.2 M
Installing for dependencies:libstdc++-devel x86_64 4.8.5-44.el7 base 1.5 MTransaction Summary
=============================================================================================
Install 1 Package (+1 Dependent package)Total download size: 8.7 M
Installed size: 25 M
Downloading packages:
(1/2): libstdc++-devel-4.8.5-44.el7.x86_64.rpm | 1.5 MB 00:00:00
(2/2): gcc-c++-4.8.5-44.el7.x86_64.rpm | 7.2 MB 00:00:00
---------------------------------------------------------------------------------------------
Total 33 MB/s | 8.7 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transactionInstalling : libstdc++-devel-4.8.5-44.el7.x86_64 1/2 Installing : gcc-c++-4.8.5-44.el7.x86_64 2/2 Verifying : gcc-c++-4.8.5-44.el7.x86_64 1/2 Verifying : libstdc++-devel-4.8.5-44.el7.x86_64 2/2 Installed:gcc-c++.x86_64 0:4.8.5-44.el7 Dependency Installed:libstdc++-devel.x86_64 0:4.8.5-44.el7 Complete! #主要看這里
yum 會自動找到都有哪些軟件包需要下載, 這時候敲 “y” 確認安裝.(我這里由于使用了-y選項所以不需要再次確認來繼續安裝)
出現 “complete” 字樣, 說明安裝完成.
注意事項:
- 安裝軟件時由于需要向系統目錄中寫入內容, 一般需要 sudo 或者切到 root 賬戶下才能完成.
- yum安裝軟件只能一個裝完了再裝另一個. 正在yum安裝一個軟件的過程中, 如果再嘗試用yum安裝另外一個軟件, yum會報錯.
如果 yum 報錯, 請自行百度.
如何卸載軟件
仍然是一條命令:
yum remove [軟件名]
補充——yum如何找到要安裝軟件的下載地址
當我們在使用yum下載軟件的時候我們會發現,我們并不需要向yum提供詳細的軟件下載地址就可以直接通過軟件名下載這個軟件。這是因為yum有相應的配置文件,這個配置文件里面會記錄yum其他軟件有關的下載路徑
[root@hcss-ecs-b735 dir2]# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo epel.repo.rpmnew
CentOS-CR.repo CentOS-Media.repo CentOS-x86_64-kernel.repo epel-testing.repo
CentOS-Debuginfo.repo CentOS-Sources.repo epel.repo
對于如何切換yum源以及如何對虛擬機上的Linux系統配置yum源,可以在網上進行搜索。在網上找到yum源、直接下載在Linux服務器中的yum源配置文件位置
#!/bin/bash
## 備份 /etc/yum.repos.d/CentOS-Base.repo
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
## 更換為阿里源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
## 安裝epel
sudo yum install -y epel-release
## 使用阿里提供的epel源
sudo curl -o /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
## 清空yum緩存
sudo yum clean all
## 重建yum緩存
sudo yum makecache
Linux開發工具
Linux編輯器-vim使用
vim是一個多模式的編輯器,不是編譯器(不能編譯代碼)
1.vim的基本概念
vim有很多種模式但這里只簡要介紹三種最常用的模式,三種模式分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區分如下:
-
正常/普通/命令模式(Normal mode)
控制屏幕光標的移動,字符、字或行的刪除,移動復制某區段及進入Insert mode下,或者到 last line mode -
插入模式(Insert mode)
只有在Insert mode下,才可以做文字輸入,按「ESC」鍵可回到命令行模式。該模式是我們后面用的最頻繁的編輯模式。 -
末行模式(last line mode)
文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作。 在命令模式下,shift+: 即可進入該模式。要查看你的所有模式:打開vim,底行模式直接輸入
2.vim的基本操作
vim的操作指令有點多,其實不需要刻意去記憶,用的多了自然就記住了,這里簡單列舉幾個
1. 模式切換
按 Esc
退出其他模式。(進入正常模式)
[正常模式]切換至[插入模式]
-
i
:光標前插入 這個用的最多 -
I
:行首插入 -
a
:光標后插入 -
A
:行尾插入 -
o
:下方新建行插入 -
O
:上方新建行插入 -
v
:字符選擇 -
V
:行選擇 -
Ctrl+v
:塊選擇 -
[正常模式]切換至[末行模式]
「shift + ;」, 其實就是輸入「:」
2. 光標移動
-
h
← /j
↓ /k
↑ /l
→ 這個基本不用,用鍵盤上的上下左右鍵就可以 -
0
:行首 /^
:第一個非空字符 -
$
:行尾 -
gg
:文件開頭 -
G
:文件末尾 -
5G
或:5
:跳轉到第5行 -
Ctrl+f
:向下翻頁 /Ctrl+b
:向上翻頁 -
%
:跳轉到匹配的括號(如{}
,()
) -
w
光標移動到下一個單詞(連續英文字符串) -
b
光標移動到上一個單詞(連續英文字符串)
3. 文本編輯
-
shift + r
:進入替換模式,需要用EXC
退回正常模式 -
x
:刪除光標指向的字符 -
shift + ~
:大小寫切換 -
shift + x
:刪除光標之前的字符 -
dw
:刪除到單詞結尾 -
dd
:刪除整行(應該算是一種剪切) -
3dd
:刪除3行 -
d$
:刪除到行尾 -
yy
:復制當前行 -
3yy
:復制3行 -
p
:粘貼到光標后 /P
:粘貼到光標前 -
u
:撤銷 -
Ctrl+r
:重做
4. 搜索與替換
-
/keyword
:向下搜索(注意這個ketword
是你要找的字符) -
?keyword
:向上搜索 -
n
:下一個匹配 /N
:上一個匹配 -
:s/old/new
:替換當前行第一個匹配 -
:s/old/new/g
:替換當前行所有匹配 -
:%s/old/new/g
:替換全文所有匹配 -
:%s/old/new/gc
:替換時逐個確認
5. 保存與退出
:w
:保存:q
:退出:wq
或:x
:保存并退出:q!
:強制退出(不保存):w!
:強制寫入wq!
:強制保存并退出ZZ
(Shift+z+z):快速保存退出
6. 分屏與標簽頁
-
:sp [file]
:水平分屏 -
:vsp [file]
:垂直分屏 -
Ctrl+w + 方向鍵
:切換分屏 -
:tabnew
:新建標簽頁 -
gt
:下一個標簽 /gT
:上一個標簽
7. 其他實用命令
-
>>
:當前行右縮進 /<<
:左縮進 -
gg=G
:自動縮進全文(適合代碼) -
:set number
(:set nu
):顯示行號 -
:set nowrap
:禁止自動換行 -
:help [command]
:查看幫助(如:help :w
)
8. 可視模式操作
- 選中文本后:
y
:復制選中內容d
:刪除選中內容>
:向右縮進 /<
:向左縮進- 塊模式下按
I
插入內容,按Esc
應用到所有
9.在vim中編譯、執行代碼
-
:!gcc
:與之前的gcc 用法是一樣的 -
:./[可執行文件名]
:執行當前文件夾中的可執行文件 -
:!
可以執行命令行命令,路徑為當前vim打開的文件路徑 -
vs + 其他文件名
:打開其他文件支持分屏操作
3.簡單vim配置
在網上有許多教我們如何配置vim的教程,我這里就用一個比較簡單的方式來進行配置。
- 安裝方法
在 shell 中執行指令(想在哪個用戶下讓vim配置生效, 就在哪個用戶下執行這個指令. 強烈 “不推薦” 直接在 root 下執行):
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
需要按照提示輸入 root 密碼. 您的 root 密碼不會被上傳, 請放心輸入.
- 卸載方法
在安裝了 VimForCpp 的用戶下執行:
bash ~/.VimForCpp/uninstall.sh
Linux編譯器-gcc/g++使用
1.背景知識
預處理(進行宏替換)
編譯(生成匯編)
匯編(生成機器可識別代碼)
連接(生成可執行文件或庫文件)
這個內容在C語言學習的時候就已經了解過了,可以去搜索一下
2.gcc如何完成
格式:gcc [選項] 要編譯的文件 [選項] [目標文件]
預處理(進行宏替換)
預處理功能主要包括宏定義,文件包含,條件編譯,去注釋等。預處理指令是以#號開頭的代碼行。
實例:gcc –E hello.c –o hello.i
選項“-E”,該選項的作用是讓 gcc 在預處理結束后停止編譯過程。選項“-o”是指目標文件,“.i”文件為已經過預處理的C原始程序。
編譯(生成匯編)
在這個階段中,gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。
用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
實例:gcc –S hello.i –o hello.s
匯編(生成機器可識別代碼)
匯編階段是把編譯階段生成的“.s”文件轉成目標文件
可使用選項“-c”就可看到匯編代碼已轉化為“.o”的二進制目標代碼了
實例:gcc -c code.s -o code.o
連接(生成可執行文件或庫文件)
在成功編譯之后,就進入了鏈接階段。
實例:gcc hello.o -o hello
動態庫
在這里涉及到一個重要的概念:函數庫。我們的C程序中,并沒有定義“printf”的函數實現,且在預編譯中包含的“stdio.h”中也只有該函數的聲明,而沒有定義函數的實現,那么,是在哪里實“printf”函數的呢?
最后的答案是:系統把這些函數實現都被做到名為 libc.so.6 的庫文件中去了,在沒有特別指定時,gcc 會到系統默認的搜索路徑“/usr/lib”下進行查找,也就是鏈接到 libc.so.6 庫函數中去,這樣就能實現函數“printf”了,而這也就是鏈接的作用
函數庫一般分為靜態庫和動態庫兩種
-
靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名一般為“.a”。在Windows版本中的動態庫是
.lib
結尾的文件 -
把碼加入到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。動態庫一般后綴名為“.so”,如前面所述的 libc.so.6 就是動態庫。gcc 在編譯時默認使用動態庫。完成了鏈接之后,gcc 就可以生成可執行文件,如
gcc hello.o -o hello
。還有一個可以提一點的是,在Windows版本中的動態庫是.dll
結尾的文件 -
gcc默認生成的二進制程序,是動態鏈接的,這點可以通過 命令驗證。
動態庫、動態鏈接、靜態庫與靜態鏈接的對比總結
1. 定義
概念 | 說明 |
---|---|
動態庫 | 運行時加載的共享庫(如 .dll 、.so ),不嵌入程序,可被多個進程共享。 |
動態鏈接 | 在程序運行時將動態庫綁定到進程的過程(自動加載或手動 dlopen )。 |
靜態庫 | 編譯時嵌入程序的庫(如 .lib 、.a ),代碼直接合并到可執行文件中。 |
靜態鏈接 | 在程序編譯時將靜態庫代碼復制到可執行文件中,生成獨立文件。 |
2. 特點
特性 | 動態庫/動態鏈接 | 靜態庫/靜態鏈接 |
---|---|---|
文件大小 | 程序體積小(僅自身代碼) | 程序體積大(包含所有依賴庫代碼) |
內存占用 | 低(多個程序共享同一庫) | 高(每個程序獨立加載庫代碼) |
更新維護 | 替換庫文件即可生效 | 需重新編譯程序 |
依賴管理 | 需處理庫版本沖突(依賴地獄) | 無外部依賴,獨立運行 |
加載時機 | 運行時加載(延遲綁定) | 編譯時嵌入 |
適用場景 | 通用軟件、系統級程序(如 glibc ) | 嵌入式系統、獨立工具(如 busybox ) |
3. 優缺點對比
動態庫與動態鏈接
- 優點:
- 節省內存和磁盤空間(共享性)。
- 支持熱更新(無需重新編譯程序)。
- 靈活加載(如插件系統)。
- 缺點:
- 依賴外部環境(庫缺失或版本沖突會導致程序崩潰)。
- 首次調用函數時可能有解析延遲(PLT/GOT 機制)。
靜態庫與靜態鏈接
- 優點:
- 程序獨立,無需外部依賴。
- 啟動速度快(無運行時加載開銷)。
- 避免依賴地獄。
- 缺點:
- 文件體積大(代碼冗余)。
- 更新需重新編譯分發。
- 內存占用高(多進程無法共享庫代碼)。
6. 總結
- 動態庫與動態鏈接:
通過共享代碼和按需加載優化資源利用,適合通用軟件和靈活擴展,但需管理依賴和版本。 - 靜態庫與靜態鏈接:
以空間換獨立性,適合對部署環境要求嚴格的場景(如嵌入式系統),但犧牲了更新便利性。
注意:
- 在操作系統中一般默認使用的是動態鏈接,但我們在編譯的時候可以指定用靜態鏈接,也就是下面gcc的
-static
選項 - 我們可以用
file
命令查看一個程序的詳細信息,包括它是靜態鏈接和動態鏈接 - 云服務器可能沒有安裝靜態庫,去搜索安裝
gcc選項
-E 只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面
-S 編譯到匯編語言不進行匯編和鏈接
-c 編譯到目標代碼
-o 文件輸出到 文件
-static 此選項對生成的文件采用靜態鏈接
-g 生成調試信息。GNU 調試器可利用該信息。
-shared 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫.
-O0
-O1
-O2
-O3 編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高-w 不生成任何警告信息。
-Wall 生成所有警告信息。
gcc選項記憶
esc,iso例子。我們一般用的時候都是直接將C語言文件通過gcc hello.c -o hello
直接編譯成可執行文件。不需要逐步生成各種中間文件。