Linux 軟件包管理器-yum
什么是軟件包及安裝方式
- 在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼, 并進行編譯, 得到可執行程序。
- 但是這樣太麻煩了, 于是有些人把一些常用的軟件提前編譯好, 做成軟件包(可以理解成windows上的安裝程序)放在一個服務器上, 通過包管理器可以很方便的獲取到這個編譯好的軟件包, 直接進行安裝。
- 軟件包和軟件包管理器, 就好比 “App” 和 “應用商店” 這樣的關系。
- yum(Yellow dog Updater, Modified)是Linux下非常常用的一種包管理器. 主要應用在Fedora, RedHat, Centos等發行版上。
安裝程序的方式有:
- 源碼安裝,自己進行編譯執行,生成程序。
- rmp安裝,可能存在大量軟件相互依賴問題,安裝較為麻煩
- yum安裝,相當于window下的軟件商店(會處理好依賴問題)
yum就類似一個應用的商店。
注意關于 yum 的所有操作必須保證主機(虛擬機)網絡暢通!!!
可以通過 ping 指令驗證
查看軟件包
通過yum list命令可以羅列出當前一共有哪些軟件包。但由于包的數目可能非常之多, 這里我們需要使用 grep 命令只篩選出我們關注的包。如查找lrzsz
yum list | grep lrzsz
解析(了解):
- 軟件包名稱: 主版本號.次版本號.源程序發行號-軟件包的發行號.主機平臺.cpu架構。
- “x86_64” 后綴表示64位系統的安裝包, “i686” 后綴表示32位系統安裝包. 選擇包時要和系統匹配。
- “el7” 表示操作系統發行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6。
- 最后一列, base 表示的是 “軟件源” 的名稱, 類似于 “小米應用商店”, “華為應用商店” 這樣的概念。
如何安裝軟件
上面已經說了yum可以理解為一個應用商店,那么我們就可以通過 yum進行一些工具的安裝。如lrzsz
這個工具用于 windows 機器和遠端的 Linux 機器通過 XShell 傳輸文件
安裝軟件需要使用root權限,這里提權使用(需要在信任名單)。
輸入:
sudo yum install lrzsz
之后就會要求你輸入y確認,輸入y之后,出現complete字樣則說明安裝成功。
如何卸載軟件
仍然是一條命令:
sudo yum remove lrzsz
輸入y后出現complete字樣完成卸載。
實現本地機器和云服務器之間的文件互傳
借助剛才安裝的lrzsz實現本地機器和云服務器之間的文件互傳。
將本地文件傳到云服務器
指令:rz
將云端服務器文件傳到本地:
指令:sz 文件名
tree查看
之前說了Linux下的文件系統是一顆多叉樹,一般形式查看目錄效果不好,這里推薦使用tree 來查看目錄。
要想使用tree,就需要到yum里安裝
sudo yum install tree
用法:
tree 目錄
Linux編輯器-vim
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,底行模式直接輸入
:help vim-modes
vim的模式切換
進入vim,在系統提示符號輸入vim及文件名稱后,就進入vim全屏幕編輯畫面:
vim test.c
不過有一點要特別注意,就是你進入vim之后,是處于[正常模式],你要切換到[插入模式]才能夠輸入文字。
-
[正常模式]切換至[插入模式]
- 輸入a
- 輸入i
- 輸入o
-
[插入模式]切換至[正常模式]
- 按Esc
-
[正常模式]切換至[末行模式]
- 「shift + ;」, 其實就是輸入「:」
-
退出vim及保存文件,在[正常模式]下,按一下「:」冒號鍵進入末行模式「Last line mode」,例如:
- w (保存當前文件)
- wq (輸入「wq」,存盤并退出vim)
- q! (輸入q!,不存盤強制退出vim)
- wq! (輸入wq!,存盤并強制退出vim)
vim正常模式命令集
-
插入模式
- 按「i」切換進入插入模式「insert mode」,按“i”進入插入模式后是從光標當前位置開始輸入文件;
- 按「a」進入插入模式后,是從目前光標所在位置的下一個位置開始輸入文字;
- 按「o」進入插入模式后,是插入新的一行,從行首開始輸入文字。
- 記一個就好了,推薦使用i。
-
從插入模式切換為命令模式
- 按「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」一起使用,這樣在退出的時候還可以保存文件。
vim操作實用總結
對于以上這么多操作,我們只需要掌握經常使用的即可。以下列舉常常使用的操作。(正常模式下)
跳躍移動操作:
- shift+g:移動到文本的最后面。
- gg:移動到文本的最前面。
- n+shift+g:移動到指定行數。(n為具體數字,最好用主鍵盤的,功能區的有可能不行)。
- shift+$:移動到當前行末尾。
- shift+^:移動到當前行最前面。
移動操作:
- 可以直接用鍵盤上的光標來上下左右移動,但正規的vim是用小寫英文字母「h」、「j」、「k」、「l」,分別控制光標左、下、上、右移一格。
剪切操作(也可作為刪除操作)
- dd:刪除光標所在行。
- n+dd:從光標所在行開始刪除n行。
- x:每按一次,刪除光標所在位置的一個字符。
- n+x:刪除光標所在位置的“后面(包含自己在內)”n個字符。
拷貝操作
- yy:拷貝光標所在行到緩沖區。
- n+yy:拷貝從光標所在的該行“往下數”n行文字。
粘貼操作
- p;將緩沖區內的字符貼到光標所在位置。注意:所有與“y”有關的復制命令都必須與“p”配合才能完成復制與粘貼功能。
簡單vim配置
當你vim進入編輯時,會發現vim寫代碼時十分矬,跟個記事本一樣,要想使vim用得順手,就需要自己去配置。
配置文件的位置
- 在目錄 /etc/ 下面,有個名為vimrc的文件,這是系統中公共的vim配置文件,對所有用戶都有效。
- 而在每個用戶的主目錄下,都可以自己建立私有的配置文件,命名為:“.vimrc”。例如,/root目錄下,通常已經存在一個.vimrc文件,如果不存在,則創建之。
- 切換用戶成為自己執行 su ,進入自己的主工作目錄,執行 cd ~
- 打開自己目錄下的.vimrc文件,執行 vim .vimrc
但是以上操作不僅有難度,而且需要自己一個一個配置,實在太麻煩了,所以這里推薦執行以指令完成配置。
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
執行該指令建議使用普通用戶執行,不要用root賬號,只為當前用戶配置。不影響其他用戶。
空格數
這時候可以看到就有行號,語法高亮,語法提示,自動縮進,補齊等。
但是它默認的空格數為2,和大家平時用的4有些區別,當然這也可以改。
上面的對應配置在.vimrc里面,進入并修改。
vim .vimrc
找到下面三個值,并將其改為4。
最好用wq!強制保存退出。
Linux編譯器-gcc/g++
一個可執行程序是由代碼經過以下步驟形成的:
- 預處理
- 編譯
- 匯編
- 鏈接
那么每一個步驟會見我們寫的代碼轉化成什么,最終形成一個可執行程序的呢?接下來以gcc為例,對以上步驟進行介紹。
一般使用gcc編譯C語言代碼,格式如下:
gcc [選項] 要編譯的文件 [選項] [目標文件]
gcc編譯:
以此為例,我們對該可執行程序的的預處理,編譯,匯編,鏈接步驟進行介紹。
gcc選項
- -E 只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里面
- -S 編譯到匯編語言不進行匯編和鏈接
- -c 編譯到目標代碼
- -o 文件輸出到 文件
- -static 此選項對生成的文件采用靜態鏈接
- -g 生成調試信息。GNU 調試器可利用該信息。
- -shared 此選項將盡量使用動態庫,所以生成文件比較小,但是需要系統由動態庫
預處理(進行宏替換)
- 預處理功能主要包括宏定義,文件包含,條件編譯,去注釋等。
- 預處理指令是以#號開頭的代碼行。
- 實例:
gcc –E test.c –o test.i
- 不帶選項會直接編譯成最終的可執行程序,這里為查看每一個步驟,需要編譯成對應階段的文件。
- 選項“-E”,該選項的作用是讓 gcc 在預處理結束后停止編譯過程。
- 選項“-o”是指目標文件,“.i”文件為已經過預處理的C原始程序
編譯(生成匯編)
- 在這個階段中,gcc 首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。
- 用戶可以使用“-S”選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
- 實例:
gcc -S test.i -o test.s
匯編(生成機器可識別代碼)
- 匯編階段是把編譯階段生成的“.s”文件轉成目標文件
- 在此可使用選項“-c”就可看到匯編代碼已轉化為“.o”的二進制目標代碼了
- 實例
gcc -c test.s -o test.o
鏈接(生成可執行文件或庫文件)
- 在成功編譯之后,就進入了鏈接階段。
- 實例
gcc test.o -o test.exe
函數庫
上面提到的鏈接是和誰來鏈接呢?在這里就要涉及到一個重要的概念:函數庫
- 我們的C程序中,并沒有定義“printf”的函數實現,且在預編譯中包含的“stdio.h”中也只有該函數的聲明,而沒有定義函數的實現,那么,是在哪里實“printf”函數的呢?
- 最后的答案是:系統把這些函數實現都被做到名為 libc.so.6 的庫文件中去了,在沒有特別指定時,gcc 會到系統默認的搜索路徑“/usr/lib”下進行查找,也就是鏈接到 libc.so.6 庫函數中去,這樣就能實現函數“printf”了,而這也就是鏈接的作用。
安裝靜態庫
云服務器一般是裝有動態庫的(默認連接方式),但是靜態庫一般那是沒有的,想要的話我們可以自己裝上,使用yum安裝。
sudo yum install -y glibc-static libstdc++-static
這里一步到位,將C/C++的靜態庫都裝上了。
函數庫一般分為靜態庫和動態庫兩種。
- 靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名一般為“.a”
- 動態庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。
- 動態庫一般后綴名為“.so”,如前面所述的 libc.so.6 就是動態庫。gcc 在編譯時默認使用動態庫, 若要靜態鏈接只用 -static選項對生成的文件采用靜態鏈接。完成了鏈接之后,gcc 就可以生成可執行文件.
- gcc默認生成的二進制程序,是動態鏈接的,這點可以通過 file 命令驗證。
動態鏈接:
?優點:省空間(磁盤的空間,內存的空間),bin體積小,加載速度快。
?缺點:依賴動態庫,程序可移植性較差。
靜態鏈接:
?優點:不依賴第三方庫,程序的可移植性較高。
?缺點:浪費空間。
我們還可以用ldd
查看鏈接時依賴的庫
(圖中的/lib64/libc.so.6就是當前云服務器當中的C標準庫)
Linux項目自動化構建工具-make/Makefile
為什么要make/makefile?
- 一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作。
- makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
- make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。
- make是一條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構建。
依賴關系和依賴方法
依賴關系:
- 上面的mycode:code.c可以理解為mycode的實現是依賴于code.c的。
依賴方式:
- gcc -o mycode code.c其實就是我們使用gcc將code.c編譯mycode,是具體實現的方法。
make使用
1.在要編譯代碼的同級路徑下創建一個makefile/makefile的普通文件
2.使用vim編輯Makefile完成依賴關系和依賴方法
3. 使用make指令編譯
多個文件時
小技巧
make原理
make是如何工作的,在默認的方式下,也就是我們只輸入make命令,為什么會自動編譯好?原理如下
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 hello.i hello.s hello.o hello -f
- 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根本不理。
- make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,就會退出報錯。
- 有點類似遞歸的過程。
Linux調試器-gdb使用
gdb使用須知
- 程序的發布方式有兩種,debug模式和release模式。
- Linux gcc/g++出來的二進制程序,默認是release模式。
- 要使用gdb調試,必須在源代碼生成二進制程序的時候, 加上 -g 選項。
- 可以看到帶-g的debug版確實比release版大。
gdb命令匯總
進入
指令: gdb?文件名
調試
- 「run/r」:運行代碼(啟動調試)。
- 「next/n」:逐過程調試。
- 「step/s」:逐語句調試。
- 「until?行號」:跳轉至指定行
- 「finish」:執行完當前正在調用的函數后停下來(不能是主函數)。
- 「continue/c」:運行到下一個斷點處。
- 「set?var?變量=x」:修改變量的值為x。
顯示
- 「list/l?n」:顯示從第n行開始的源代碼,每次顯示10行,若n未給出則默認從上次的位置往下顯示.。
- 「list/l?函數名」:顯示該函數的源代碼。
- 「print/p?變量」:打印變量的值。
- 「print/p?&變量」:打印變量的地址。
- 「print/p?表達式」:打印表達式的值,通過表達式可以修改變量的值。
- 「display?變量」:將變量加入常顯示(每次停下來都顯示它的值)。
- 「display?&變量」:將變量的地址加入常顯示。
- 「undisplay?編號」:取消指定編號變量的常顯示。
- 「bt」:查看各級函數調用及參數。
- 「info/i?locals」:查看當前棧幀當中局部變量的值。
斷點
- 「break/b?n」:在第n行設置斷點。
- 「break/b?函數名」:在某函數體內第一行設置斷點。
- 「info?breakpoint/b」:查看已打斷點信息。
- 「delete/d?編號」:刪除指定編號的斷點。
- 「disable?編號」:禁用指定編號的斷點。
- [enable?編號」:啟用指定編號的斷點。
退出gdb
- 「quit/q」:退出gdb