一. yum:軟件包管理器
什么是軟件包?
????????在Linux 下安裝軟件 , 一個通常的辦法是下載到程序的源代碼 , 并進行編譯 , 得到可執行程序 .
但是這樣太麻煩了, 于是有些人把一些常用的軟件提前編譯好 , 做成軟件包 (可以理解成windows 上的安裝程序) 放在一個服務器上 , 通過包,管理器可以很方便的獲取到這個編譯好的軟件包 , 直接進行安裝 . 軟件包和軟件包管理器, 就好比 "App" 和 " 應用商店 " 這樣的關系 .
yum(Yellow dog Updater, Modified) 是 Linux 下非常常用的一種包管理器 . 主要應用 Fedora,RedHat, Centos等發行版上 .
關于 rzsz
這個工具用于 windows 機器和遠端的 Linux 機器通過 XShell 傳輸文件 .
安裝完畢之后可以通過拖拽的方式將文件上傳過去 .
注意事項
關于 yum 的所有操作必須保證主機 ( 虛擬機 ) 網絡暢通 !!!
可以通過 ping 指令驗證
查看軟件包
通過 yum list 命令可以羅列出當前一共有哪些軟件包 . 由于包的數目可能非常之多 , 這里我們需要使用 grep 命令只
篩選出我們關注的包 . 例如 :
yum list | grep lrzsz
結果如下:
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 會報錯。
如何卸載軟件
仍然是一條命令 :
二. vim:多模式編輯器

2.1 vim的基本概念
課堂上我們講解 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 ,底行模式直接輸入
2.2. vim的基本操作
進入 vim, 在系統提示符號輸入 vim 及文件名稱后,就進入 vim 全屏幕編輯畫面 :
不過有一點要特別注意,就是你進入 vim 之后,是處于 [ 正常模式 ] ,你要切換到 [ 插入模式 ] 才能夠輸入文 字。
[ 正常模式 ] 切換至 [ 插入模式]????????
????????輸入a
????????輸入i
????????輸入o
[ 插入模式 ] 切換至 [ 正常模式 ]
目前處于 [ 插入模式 ] ,就只能一直輸入文字,如果發現輸錯了字 , 想用光標鍵往回移動,將該字刪除,可 以先按一下「ESC 」鍵轉到 [ 正常模式 ] 再刪除文字。當然,也可以直接刪除。
[ 正常模式 ] 切換至 [ 末行模式 ]
「 shift + ; 」 , 其實就是輸入「 : 」
退出 vim 及保存文件 , 在 [ 正常模式 ] 下,按一下「 : 」冒號鍵進入「 Last line mode 」 , 例如 :
: w (保存當前文件)
:? wq ( 輸入「 wq 」 , 存盤并退出 vim)
: q! ( 輸入 q!, 不存盤強制退出 vim)
2.3. vim正常模式命令集
插入模式
????????按「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 行行首。
2.4. vim末行模式命令集
在使用末行模式之前,請記住先按「 ESC 」鍵確定您已經處于正常模式,再按「:」冒號即可進入末行模式。
列出行號
「set nu 」 : 輸入「 set nu 」后,會在文件中的每一行前面列出行號。
跳到文件中的某一行
「 # 」:「 # 」號表示一個數字,在冒號后輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字 15 , 再回車,就會跳到文章的第15 行。
查找字符
「 / 關鍵字」 : 先按「 / 」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直按 「n 」會往后尋找到您要的關鍵字為止。
「 ? 關鍵字」:先按「 ? 」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要的,可以一直
按「 n 」會往前尋找到您要的關鍵字為止。
問題:/ 和 ?查找有和區別?
- 在命令模式下按下?
/
?后輸入要搜索的關鍵詞,然后按 Enter 鍵,Vim 會從光標所在位置向文件末尾方向查找匹配該關鍵詞的內容。按下 n 鍵可繼續向后查找下一個匹配項,按下 N 鍵可向前查找下一個匹配項。 -
使用 ?
進行反向搜索:
在命令模式下按下??
?后輸入要搜索的關鍵詞,然后按 Enter 鍵,Vim 會從光標所在位置向文件開頭方向查找匹配該關鍵詞的內容。按下 n 鍵可繼續向前查找下一個匹配項,按下 N 鍵可向后查找上一個匹配項。
保存文件
「 w 」 : 在冒號輸入字母「 w 」就可以將文件保存起來
離開 vim
「 q 」:按「 q 」就是退出,如果無法離開 vim ,可以在「 q 」后跟一個「 ! 」強制離開 vim 。
「 wq 」:一般建議離開時,搭配「 w 」一起使用,這樣在退出的時候還可以保存文件。
2.5. vim操作總結
三種模式: 正常模式? ?插入模式? ?底行模式
2.6. 簡單vim配置
配置文件的位置
在目錄 /etc/ 下面,有個名為 vimrc 的文件,這是系統中公共的 vim 配置文件,對所有用戶都有效。
而在每個用戶的主目錄下,都可以自己建立私有的配置文件,命名為: “.vimrc” 。例如, /root 目錄下,
通常已經存在一個 .vimrc 文件 , 如果不存在,則創建之。
切換用戶成為自己執行 su ,進入自己的主工作目錄 , 執行 cd ~
打開自己目錄下的 .vimrc 文件,執行 vim .vimrc
常用配置選項 , 用來測試
設置語法高亮 : syntax on
顯示行號 : set nu
設置縮進的空格數為 4: set shiftwidth=4
可以自行到網上查找一些好用的配置
三. Linux編譯器-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 命令驗證。
下載動靜態庫
sudo?yum?install?-y?glibc-static
sudo?yum?install?-y?libstbc++-static
gcc 選項
-E 只激活預處理 , 這個不生成文件 , 你需要把它重定向到一個輸出文件里面
-S? 編譯到匯編語言不進行匯編和鏈接
-c? 編譯到目標代碼
-o 文件輸出到 文件
-static 此選項對生成的文件采用靜態鏈接
-g? 生成調試信息。 GNU 調試器可利用該信息。
-shared? 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫 .
-O0
-O1
-O2
-O3 編譯器的優化選項的 4 個級別, -O0 表示沒有優化 ,-O1 為缺省值, -O3 優化級別最高
-w? 不生成任何警告信息。
-Wall 生成所有警告信息。
四. Linux調試器-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
readelf?-S?文件名:讀取可執行程序二進制構成的文件debug
在Makefile文件中chang常在依賴關系后加后綴-g,讓可執行程序以debug方式發布。
以debug方式發布的可執行程序具有調試信息。
以debug方式發布的可執行程序比以默認(release)方式發布的可執行程序略大(多了調試信息)

gdb+可執行程序名:進入調試模式

五. Linux項目自動化構建工具-make/Makefile
背景
會不會寫 makefile ,從一個側面說明了一個人是否具備完成大型工程的能力
一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中, makefile 定義了一系列的 規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜 的功能操作
makefile 帶來的好處就是 ——“ 自動化編譯 ” ,一旦寫好,只需要一個 make 命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
make 是一個命令工具,是一個解釋 makefile 中指令的命令工具,一般來說,大多數的 IDE 都有這個命 令,比如:Delphi 的 make , Visual C++ 的 nmake , Linux 下 GNU 的 make 。可見, makefile 都成為了一 種在工程方面的編譯方法。 make是一條命令, makefile 是一個文件,兩個搭配使用,完成項目自動化構建
1、make是一條指令,makefile當前目錄下的一個文件
2、依賴關系、依賴方法
Makefile注釋用#
Make會自動退到makefile中的依賴關系棧式結構
Make會自頂向下掃描makefile,形成的第一個目標文件充當為Make的默認動作
3、問:為什么重復編譯不通過?答:提供編譯效率!
問:怎么做到的?
答:原理如下:
一定是源文件形成可執行,現有源文件,才有可執行。一般而言,源文件的最近修改時間比可執行成文件要老!如果我們修改了原文件,歷史上曾經還有可執行,那么原文件的最近修改時間,一定要比可執行程序要新!
只需要比較,可執行程序的最近修改時間和源文件的最近修改時間:.exe新于.c源文件,不需要重新編譯,.exe老于.c源文件,需要重新編譯。
4、Access(最后一次訪問時間)、Modify(最后一次被修改時間)與Change(權限最后一次修改時間)
文件=文件內容(Modify)+文件屬性(Change)

touch后面如果跟已存在文件,則將所有時間(access、modify、change)更新為最新
touch -a 文件名:更新Access
touch -m 文件名:更新Modify
touch -c 文件名:更新Change
總結:make會根據源文件和目標文件的新舊判定是否需要重新執行依賴關系進行編譯。
若需要總是執行的呢?
5、.PHONY(偽目標):mycode依賴關系,依賴方法總是被執行
編譯效果:

特殊符號:
$@:目標文件
$^:依賴文件
@:不回顯依賴方法
