前言
本篇博客我們來了解Linux環境下一些基礎開發工具
💓 個人主頁:zkf&
? 文章專欄:Linux
若有問題 評論區見📝
🎉歡迎大家點贊👍收藏?文章

?
?
目錄
1.Linux 軟件包管理器 yum
2.Linux開發工具
2.1Linux編輯器-vim使用
2.1.1vim的基本概念
2.1.2vim的基本操作
2.1.3vim正常模式命令集
vim末行模式命令集
2.1.4vim操作總結
2.1.5vim簡單配置
2.2Linux編譯器-gcc/g++使用?
2.3Linux調試器-gdb使用
2.4Linux項目自動化構建工具-make/Makefile
3.使用 git 命令行
?
1.Linux 軟件包管理器 yum
什么是軟件包
在 Linux 下安裝軟件 , 一個通常的辦法是下載到程序的源代碼 , 并進行編譯 , 得到可執行程序 .
但是這樣太麻煩了 , 于是有些人把一些常用的軟件提前編譯好 , 做成軟件包 ( 可以理解成 windows 上的安裝程序) 放在一個服務器上 , 通過包管理器可以很方便的獲取到這個編譯好的軟件包 , 直接進行安裝 .
軟件包和軟件包管理器 , 就好比 "App" 和 " 應用商店 " 這樣的關系 .
yum(Yellow dog Updater, Modified) 是 Linux 下非常常用的一種包管理器 . 主要應用在 Fedora, RedHat, Centos等發行版上 .
關于 rzsz
這個工具用于 windows 機器和遠端的 Linux 機器通過 XShell 傳輸文件 .
安裝完畢之后可以通過拖拽的方式將文件上傳過去 .
注意事項
關于 yum 的所有操作必須保證主機 ( 虛擬機 ) 網絡暢通 !!!
可以通過 ping 指令驗證
查看軟件包
通過 yum list 命令可以羅列出當前一共有哪些軟件包 . 由于包的數目可能非常之多 , 這里我們需要使用 grep 命令只
篩選出我們關注的包 . 例如 :
結果如下:
lrzsz.x86_64 0.12.20-36.el7 @base?
注意事項 :
軟件包名稱 : 主版本號 . 次版本號 . 源程序發行號 - 軟件包的發行號 . 主機平臺 .cpu 架構 .
"x86_64" 后綴表示 64 位系統的安裝包 , "i686" 后綴表示 32 位系統安裝包 . 選擇包時要和系統匹配 .
"el7" 表示操作系統發行版的版本 . "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
最后一列 , base 表示的是 " 軟件源 " 的名稱 , 類似于 " 小米應用商店 ", " 華為應用商店 " 這樣的概念 .
如何安裝軟件
通過 yum, 我們可以通過很簡單的一條命令完成 gcc 的安裝 .
yum 會自動找到都有哪些軟件包需要下載 , 這時候敲 "y" 確認安裝 .
出現 "complete" 字樣 , 說明安裝完成
注意事項 :
安裝軟件時由于需要向系統目錄中寫入內容 , 一般需要 sudo 或者切到 root 賬戶下才能完成 .
yum 安裝軟件只能一個裝完了再裝另一個 . 正在 yum 安裝一個軟件的過程中 , 如果再嘗試用 yum 安裝另外一個軟件, yum 會報錯 .
如果 yum 報錯 , 請自行百度
2.Linux開發工具
?
2.1Linux編輯器-vim使用
vi/vim 的區別簡單點來說,它們都是多模式編輯器,不同的是 vim 是 vi 的升級版本,它不僅兼容 vi 的所有指令,而且還有一些新的特性在里面。例如語法加亮,可視化操作不僅可以在終端運行,也可以運行于x window 、 mac os 、windows。
?
?
2.1.1vim的基本概念
課堂上我們講解 vim 的三種模式 ( 其實有好多模式,目前掌握這 3 種即可 ), 分別是命令模式( command mode )、插入模式(Insert mode )和底行模式( last line mode ),各模式的功能區分如下:
正常 / 普通 / 命令模式 (Normal mode)
控制屏幕光標的移動,字符、字或行的刪除,移動復制某區段及進入 Insert mode 下,或者到 last line mode
插入模式 (Insert mode)
只有在 Insert mode 下,才可以做文字輸入,按「 ESC 」鍵可回到命令行模式。該模式是我們后面用的最頻繁
的編輯模式。
末行模式 (last line mode)
文件保存或退出,也可以進行文件替換,找字符串,列出行號等操作。 在命令模式下, shift+: 即可進入該模
式。要查看你的所有模式:打開 vim ,底行模式直接輸入
:help vim-modes
我這里一共有 12 種模式 :six BASIC modes 和 six ADDITIONAL modes.
2.1.2vim的基本操作
進入 vim, 在系統提示符號輸入 vim 及文件名稱后,就進入 vim 全屏幕編輯畫面 :
$ vim test.c
不過有一點要特別注意,就是你進入 vim 之后,是處于 [ 正常模式 ] ,你要切換到 [ 插入模式 ] 才能夠輸入文字。
[ 正常模式 ] 切換至 [ 插入模式 ]
輸入 a
輸入 i
輸入 o
[ 插入模式 ] 切換至 [ 正常模式 ]
目前處于 [ 插入模式 ] ,就只能一直輸入文字,如果發現輸錯了字 , 想用光標鍵往回移動,將該字刪除,可以先按一下「ESC 」鍵轉到 [ 正常模式 ] 再刪除文字。當然,也可以直接刪除。
[ 正常模式 ] 切換至 [ 末行模式 ]
「 shift + ; 」 , 其實就是輸入「 : 」
退出 vim 及保存文件 , 在 [ 正常模式 ] 下,按一下「 : 」冒號鍵進入「 Last line mode 」 , 例如 :
: w (保存當前文件)
: wq ( 輸入「 wq 」 , 存盤并退出 vim)
: q! ( 輸入 q!, 不存盤強制退出 vim)
2.1.3vim正常模式命令集
插入模式
按「 i 」切換進入插入模式「 insert mode 」,按 “i” 進入插入模式后是從光標當前位置開始輸入文件;
按「 a 」進入插入模式后,是從目前光標所在位置的下一個位置開始輸入文字;
按「 o 」進入插入模式后,是插入新的一行,從行首開始輸入文字。
從插入模式切換為命令模式
按「 ESC 」鍵。
移動光標
vim 可以直接用鍵盤上的光標來上下左右移動,但正規的 vim 是用小寫英文字母「 h 」、「 j 」、「 k 」、「l 」,分別控制光標左、下、上、右移一格
按「 G 」:移動到文章的最后
按「 $ 」:移動到光標所在行的 “ 行尾 ”
按「 ^ 」:移動到光標所在行的 “ 行首 ”
按「 w 」:光標跳到下個字的開頭
按「 e 」:光標跳到下個字的字尾
按「 b 」:光標回到上個字的開頭
按「 #l 」:光標移到該行的第 # 個位置,如: 5l,56l
按[ gg ]:進入到文本開始
按[ shift + g ]:進入文本末端
按「 ctrl 」 + 「 b 」:屏幕往 “ 后 ” 移動一頁
按「 ctrl 」 + 「 f 」:屏幕往 “ 前 ” 移動一頁
按「 ctrl 」 + 「 u 」:屏幕往 “ 后 ” 移動半頁
按「 ctrl 」 + 「 d 」:屏幕往 “ 前 ” 移動半頁
刪除文字
「 x 」:每按一次,刪除光標所在位置的一個字符
「 #x 」:例如,「 6x 」表示刪除光標所在位置的 “ 后面(包含自己在內) ”6 個字符
「 X 」:大寫的 X ,每按一次,刪除光標所在位置的 “ 前面 ” 一個字符
「 #X 」:例如,「 20X 」表示刪除光標所在位置的 “ 前面 ”20 個字符
「 dd 」:刪除光標所在行
「 #dd 」:從光標所在行開始刪除 # 行
復制
「 yw 」:將光標所在之處到字尾的字符復制到緩沖區中。
「 #yw 」:復制 # 個字到緩沖區
「 yy 」:復制光標所在行到緩沖區。
「 #yy 」:例如,「 6yy 」表示拷貝從光標所在的該行 “ 往下數 ”6 行文字。
「 p 」:將緩沖區內的字符貼到光標所在位置。注意:所有與 “y” 有關的復制命令都必須與 “p” 配合才能完成復制與粘貼功能。
替換
「 r 」:替換光標所在處的字符。
「 R 」:替換光標所到之處的字符,直到按下「 ESC 」鍵為止。
撤銷上一次操作
「u 」:如果您誤執行一個命令,可以馬上按下「 u 」,回到上一個操作。按多次 “u” 可以執行多次回復。
「 ctrl + r 」 : 撤銷的恢復
更改
「 cw 」:更改光標所在處的字到字尾處
「 c#w 」:例如,「 c3w 」表示更改 3 個字
跳至指定的行
「 ctrl 」 + 「 g 」列出光標所在行的行號。
「 #G 」:例如,「 15G 」,表示移動光標至文章的第 15 行行首。
vim末行模式命令集
在使用末行模式之前,請記住先按「 ESC 」鍵確定您已經處于正常模式,再按「:」冒號即可進入末行模式。
列出行號
「 set nu 」 : 輸入「 set nu 」后,會在文件中的每一行前面列出行號。
跳到文件中的某一行
「 # 」 : 「 # 」號表示一個數字,在冒號后輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字 15 ,再回車,就會跳到文章的第15 行。
查找字符
「 / 關鍵字」 : 先按「 / 」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按「n 」會往后尋找到您要的關鍵字為止。
「 ? 關鍵字」:先按「 ? 」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按「n 」會往前尋找到您要的關鍵字為止。
問題:/ 和 ?查找有和區別?操作實驗一下
保存文件
「 w 」 : 在冒號輸入字母「 w 」就可以將文件保存起來
離開 vim
「 q 」:按「 q 」就是退出,如果無法離開 vim ,可以在「 q 」后跟一個「 ! 」強制離開 vim 。
「 wq 」:一般建議離開時,搭配「 w 」一起使用,這樣在退出的時候還可以保存文件。
2.1.4vim操作總結
三種模式
正常模式
插入模式
底行模式
我們一共有 12 種總模式,大家下來可以研究一下 vim 操作
打開,關閉,查看,查詢,插入,刪除,替換,撤銷,復制等等操作。
2.1.5vim簡單配置
配置文件的位置
在目錄 /etc/ 下面,有個名為 vimrc 的文件,這是系統中公共的 vim 配置文件,對所有用戶都有效。
而在每個用戶的主目錄下,都可以自己建立私有的配置文件,命名為: “.vimrc” 。例如, /root 目錄下,通常已經存在一個.vimrc 文件 , 如果不存在,則創建之。 切換用戶成為自己執行 su ,進入自己的主工作目錄 , 執行 cd ~ 打開自己目錄下的.vimrc 文件,執行 vim .vimrc
常用配置選項 , 用來測試
設置語法高亮 : syntax on
顯示行號 : set nu
設置縮進的空格數為 4: set shiftwidth=4
使用插件
要配置好看的 vim ,原生的配置可能功能不全,可以選擇安裝插件來完善配置,保證用戶是你要配置的用戶,接下來:
安裝 TagList 插件 , 下載 taglist_xx.zip , 解壓完成,將解壓出來的 doc 的內容放到~ /.vim/doc,? 將解壓出來的plugin 下的內容拷貝到~ /.vim/plugin
在~ /.vimrc 中添加 : let Tlist_Show_One_File=1 let Tlist_Exit_OnlyWindow=1 let
Tlist_Use_Right_Window=1
安裝文件瀏覽器和窗口管理器插件 : WinManager
下載 winmanager.zip , 2.X 版本以上的
解壓 winmanager.zip ,將解壓出來的 doc 的內容放到~ /.vim/doc,? 將解壓出來的 plugin 下的內容拷貝到 ~/.vim/plugin
在~ /.vimrc 中添加 let g:winManagerWindowLayout=‘FileExplorer|TagList nmap wm: WMToggle<cr>
然后重啟 vim, 打開 ~/XXX.c 或~ /XXX.cpp, 在 normal 狀態下輸入 "wm", 你將看到上圖的效果。
?
2.2Linux編譯器-gcc/g++使用?
1. 背景知識
1. 預處理(進行宏替換 )
2. 編譯(生成匯編 )
3. 匯編(生成機器可識別代碼)
4. 連接(生成可執行文件或庫文件 )
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 hello.s –o hello.o
連接(生成可執行文件或庫文件)
在成功編譯之后 , 就進入了鏈接階段。
實例 : gcc hello.o –o hello
在這里涉及到一個重要的概念 : 函數庫
我們的 C 程序中,并沒有定義 “printf” 的函數實現 , 且在預編譯中包含的 “stdio.h” 中也只有該函數的聲明 , 而沒有定義函數的實現, 那么 , 是在哪里實 “printf” 函數的呢 ?
最后的答案是 : 系統把這些函數實現都被做到名為 libc.so.6 的庫文件中去了 , 在沒有特別指定時 ,gcc 會到系統默認的搜索路徑“/usr/lib” 下進行查找 , 也就是鏈接到 libc.so.6 庫函數中去 , 這樣就能實現函
數 “printf” 了 , 而這也就是鏈接的作用
函數庫一般分為靜態庫和動態庫兩種。 靜態庫是指編譯鏈接時 , 把庫文件的代碼全部加入到可執行文件中 , 因此生成的文件比較大 , 但在運行時也就不再需要庫文件了。其后綴名一般為“.a”
動態庫與之相反 , 在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中 , 而是在程序執行時由運行時鏈接文件加載庫, 這樣可以節省系統的開銷。動態庫一般后綴名為 “.so”, 如前面所述的 libc.so.6 就是動態庫。gcc 在編譯時默認使用動態庫。完成了鏈接之后 ,gcc 就可以生成可執行文件 , 如下所示。 gcc hello.o –o hello
gcc默認生成的二進制程序,是動態鏈接的,這點可以通過 file 命令驗證。
gcc 選項
-E 只激活預處理 , 這個不生成文件 , 你需要把它重定向到一個輸出文件里面
-S? 編譯到匯編語言不進行匯編和鏈接
-c? 編譯到目標代碼
-o 文件輸出到 文件
-static 此選項對生成的文件采用靜態鏈接
-g? 生成調試信息。 GNU 調試器可利用該信息。
-shared? 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫 .
-O0
-O1
-O2
-O3 編譯器的優化選項的 4 個級別, -O0 表示沒有優化 ,-O1 為缺省值, -O3 優化級別最高
-w? 不生成任何警告信息。
-Wall 生成所有警告信息。
gcc 選項記憶
esc,iso 例子
2.3Linux調試器-gdb使用
1. 背景
程序的發布方式有兩種, debug 模式和 release 模式
Linux gcc/g++ 出來的二進制程序,默認是 release 模式
要使用 gdb 調試,必須在源代碼生成二進制程序的時候 , 加上 - g 選項
2. 開始使用
gdb binFile 退出: ctrl + d 或 quit 調試命令:
list / l 行號:顯示 binFile 源代碼,接著上次的位置往下列,每次列 10 行。
list / l 函數名:列出某個函數的源代碼。
r 或 run :運行程序。
n 或 next :單條執行。
s 或 step :進入函數調用
break(b)? 行號:在某一行設置斷點
break? 函數名:在某個函數開頭設置斷點
info break :查看斷點信息。
finish :執行到當前函數返回,然后挺下來等待命令
print(p) :打印表達式的值,通過表達式可以修改變量的值或者調用函數 p 變量:打印變量值。
set?var :修改變量的值
continue( 或 c) :從當前位置開始連續而非單步執行程序
run( 或 r) :從開始連續而非單步執行程序
delete?breakpoints :刪除所有斷點
delete?breakpoints?n :刪除序號為 n 的斷點
disable?breakpoints :禁用斷點
enable?breakpoints :啟用斷點
info( 或 i)?breakpoints :參看當前設置了哪些斷點
display? 變量名:跟蹤查看一個變量,每次停下來都顯示它的值
undisplay :取消對先前設置的那些變量的跟蹤
until X 行號:跳至 X 行
breaktrace( 或 bt) :查看各級函數調用及參數
info ( i)?locals :查看當前棧幀局部變量的值
quit :退出 gdb
3. 理解
和 windows IDE 對應例子
2.4Linux項目自動化構建工具-make/Makefile
背景
會不會寫 makefile ,從一個側面說明了一個人是否具備完成大型工程的能力
一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中, makefile 定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作makefile帶來的好處就是 ——“ 自動化編譯 ” ,一旦寫好,只需要一個 make 命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
make 是一個命令工具,是一個解釋 makefile 中指令的命令工具,一般來說,大多數的 IDE 都有這個命令,比如:Delphi 的 make , Visual C++ 的 nmake , Linux 下 GNU 的 make 。可見, makefile 都成為了一種在工程方面的編譯方法。make是一條命令, makefile 是一個文件,兩個搭配使用,完成項目自動化構建。
理解
依賴例子
實例代碼
C代碼
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
return 0;
}
Makefile 文件 hello:hello.o gcc hello.o -o hello hello.o:hello.s gcc -c hello.s -o hello.o hello.s:hello.i gcc -S hello.i -o hello.s hello.i:hello.c gcc -E hello.c -o hello.i
.PHONY:clean
clean:
rm -f hello.i hello.s hello.o hello
依賴關系
上面的文件 hello , 它依賴 hell.o
hello.o , 它依賴 hello.s
hello.s , 它依賴 hello.i
hello.i , 它依賴 hello.c
依賴方法
gcc hello.* - option hello.* , 就是與之對應的依賴關系
原理
make 是如何工作的 , 在默認的方式下,也就是我們只輸入 make 命令。那么,
1. make 會在當前目錄下找名字叫 “Makefile” 或 “makefile” 的文件。
2. 如果找到,它會找文件中的第一個目標文件( target ),在上面的例子中,他會找到 “hello” 這個文件,并把這個文件作為最終的目標文件。
3. 如果 hello 文件不存在,或是 hello 所依賴的后面的 hello.o 文件的文件修改時間要比 hello 這個文件新(可以用 touch 測試),那么,他就會執行后面所定義的命令來生成 hello 這個文件。
4. 如果 hello 所依賴的 hello.o 文件不存在,那么 make 會在當前文件中找目標為 hello.o 文件的依賴性,如果找到則再根據那一個規則生成hello.o 文件。(這有點像一個堆棧的過程)
5. 當然,你的 C 文件和 H 文件是存在的啦,于是 make 會生成 hello.o 文件,然后再用 hello.o 文件聲明make的終極任務,也就是執行文件 hello 了。
6. 這就是整個 make 的依賴性, make 會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。
7. 在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么 make 就會直接退出,并報錯,而對于所定義的命令的錯誤,或是編譯不成功,make 根本不理。
8. make 只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起, 我就不工作啦。
項目清理
工程是需要被清理的
像 clean 這種,沒有被第一個目標文件直接或間接關聯,那么它后面所定義的命令將不會被自動執行,不過,我們可以顯示要make 執行。即命令 ——“make clean” ,以此來清除所有的目標文件,以便重編譯。
但是一般我們這種 clean 的目標文件,我們將它設置為偽目標 , 用 .PHONY 修飾 , 偽目標的特性是,總是被執行的。
可以將我們的 hello 目標文件聲明成偽目標,測試一下。
3.使用 git 命令行
yum install git?
在 Github 創建項目
使用 Github 創建項目
注冊賬號
這個比較簡單 , 參考著官網提示即可 . 需要進行郵箱校驗
創建項目
1. 登陸成功后 , 進入個人主頁 , 點擊左下方的 New repository 按鈕新建項目
?
2. 然后跳轉到的新頁面中輸入項目名稱 ( 注意 , 名稱不能重復 , 系統會自動校驗 . 校驗過程可能會花費幾秒鐘 ). 校驗完畢后, 點擊下方的 Create repository 按鈕確認創建
?
3. 在創建好的項目頁面中復制項目的鏈接, 以備接下來進行下載?
?
下載項目到本地
創建好一個放置代碼的目錄 .
這里的 url 就是剛剛建立好的 項目 的鏈接 .
三板斧第一招 : git add
將代碼放到剛才下載好的目錄中
?git add [文件名]
將需要用 git 管理的文件告知 git
三板斧第二招: git commit
提交改動到本地
git commit .?
最后的 "." 表示當前目錄 ?
提交的時候應該注明提交日志 , 描述改動的詳細內容 .
三板斧第三招: git push
同步到遠端服務器上
git push?
需要填入用戶名密碼. 同步成功后, 刷新 Github 頁面就能看到代碼改動了?
?
結束語?
Linux基礎工具介紹到這里,下篇博客我們就來看看Linux操作系統中進程的含義
OK,感謝觀看!!

?
?
?
?
?
?
?
?
?
?
?
?