Linux軟件包管理器yum
Linux下安裝軟件方式:
- 源代碼安裝
- rpm安裝——Linux安裝包
- yum安裝——解決安裝源、安裝版本、安裝依賴的問題
yum對應于Windows系統下的應用商店
使用Linux系統的人:大部分是職業程序員
客戶端怎么知道去哪里下載軟件?
Linux生態:
- 開源(一種商業戰略)
- 開源不等于免費
選操作系統的標準:生態好(使用者的角度)
站在OS的設計者和推動者,他們應該做什么?
提供云服務器和軟件服務
安裝rzsz
Windows和Linux下消息互傳
yum list |grep lrzsz
yum install lrzsz.x86_64
yum remove -y lrzsz.x86_64#-y:是否詢問
yum怎么知道去哪里下載?
yum內置下載鏈接
yum install -y epel-release#擴展yum源
Linux編輯器-vim使用
vim:文本編寫——寫代碼(多模式編輯器)
命令模式(默認模式):用戶所有的輸入都會被當作命令,一般不會作為文本輸入
命令模式下光標定位
gg:定位光標到最開始行
G:定位光標到最結尾行
n+G:定位光標到第n行
(n)yy:復制光標所在行(后n行)
(n)p:粘貼(n重復行)到光標所在下一行
(n)dd:剪切、刪除(n行)
u:撤銷命令
ctrl+r:撤銷之前的撤銷
$:定位光標到當前行結尾
^:定位光標到當前行開始
w、b:光標按照單詞進行行內、跨行移動
h、j、k、l:光標按左、下、上、右移動
~:對光標所在字符進行大小寫轉換
(n)r:對光標及其之后共n個字符替換為新的字符(需輸入)
R:替換模式,對光標所在內容進行重新輸入
(n)x:對光標及其之后的字符進行刪除,共刪除n位
底行模式下命令
多文件如何處理?
vs+文件名:打開另一個文件編輯窗口
ctrl+ww:窗口光標切換
光標在哪一個窗口里面,就對哪一個窗口進行操作。
w!:強制保存
q!:強制退出
set nu:調出行號
set nonu:去掉行號
vim的簡單配置
touch .vimrc
vim .vimrc
#一個用戶一個vim配置文件,不會互相影響,不建議給root做配置
給普通用戶添加白名單
sudo#新建的普通用戶無法sudo,必須添加到白名單
#在root下操作
ll /etc/sudoers
#在/etc/sudoers中root ALL=(ALL) ALL下方添加
#用戶名 ALL=(ALL) ALL
Linux編譯器-gcc/g++使用
gcc mycode.c#用來編譯C語言
g++ mycode.cpp#用來編譯CPP
背景知識
為什么在windows或Linux上能編譯運行對應的源文件?
需要在系統中提前安裝C/C++開發相關的頭文件、庫文件
C/C++開發環境不僅僅指的是vs、gcc、g++,更重要的是語言本身的頭文件和庫文件。
安裝vs,要選擇對應的開發包,同步也在下載對應的頭文件和庫文件
編譯型語言安裝開發包一定需要下載對應的頭文件和庫文件
ls /usr/include/#linux下頭文件和庫文件所在位置
程序運行過程
- 預處理
gcc -E mycode.c -o mycode.i#生成.i文件
- 去注釋
- 頭文件展開
- 條件編譯
#ifndef
#else
#endif
- 宏替換
條件編譯的應用場景:
提供社區版和專業版的軟件公司,需要維護兩份代碼嗎?
不需要!根據不同的編譯條件,在專業版裁減掉社區版不需要的功能即可。
- 編譯(生成匯編)
gcc -S mycode.c -o mycode.s#生成.s文件
- 匯編(生成機器可識別代碼)
gcc -c mycode.s -o mycode.o#生成mycode.o文件
od mycode.o#查看二進制文件內容
#mycode.o:可重定位目標二進制文件,簡稱目標文件,windows下的obj文件,不可以獨立執行,需要經過鏈接后才能執行
- 鏈接(生成可執行文件或庫文件)
gcc mycode.o -o mytest#直接生成可執行文件mytest
#將可重定位目標二進制文件和庫文件進行鏈接才能形成可執行程序
動態庫&&靜態庫
Linux下:.so(動態庫)、.a(靜態庫)
Windows下:.dll(動態庫)、.lib(靜態庫)
庫有自己的命名規則:libname.so.XXX
機器默認值只會安裝動態庫
庫其實就是把愿望呢間經過一定的翻譯,然后打包——只給你提供一個文件即可,不用給你提供太多的源文件,也可以達到隱藏源文件的目的。
頭文件提供方法的聲明+庫文件提供方法的實現+你的代碼=你的軟件
庫的價值:不讓我們做重復動作
我們的.o和庫是如何鏈接的?
動態鏈接
動態庫(共享庫)
動態庫不能缺失,一旦對應的動態庫缺失,影響的不止一個程序,可能導致很多程序都無法正常運行。
ldd mytest#查看可執行程序依賴的動態庫
靜態鏈接
在編譯器使用靜態庫進行靜態鏈接的時候,會將自己的方法拷貝到目標程序中,該程序以后不會再依賴靜態庫
gcc mycode.c -o mytest
ldd mytest
#在Linux中,編譯形成可執行程序,默認采用的就是動態鏈接,提供動態庫
gcc mycode.c -o mytest -static#靜態鏈接(體積變大)
#在Linux中,如果要采用靜態鏈接的方式形成可執行程序,需要添加-static選項
centos yum安裝C/C++靜態庫
sudo yum install -y glibc-static
sudo yum install -y libstdc++-static
- 如果沒有靜態庫,能否執行-static?
不能
- 如果沒有動態庫,但是有靜態庫,而且gcc能找到?
gcc mycode.c -o mytest也可以運行,gcc默認優先動態鏈接
-static的本質:改變鏈接優先級
-
可執行程序不一定全是動態鏈接或者靜態鏈接,可能都包括。
-
如果加-static,所有的鏈接要求都需要是靜態鏈接
動靜態鏈接的優缺點
動態庫:
優點:動態庫是共享庫,可以有效的節省資源(磁盤空間、內存空間、網絡空間)
缺點:動態庫一旦缺失,會導致各個程序無法運行
靜態庫:
優點:靜態庫不依賴庫,程序可以獨立運行
缺點:體積大,比較消耗資源
Linux項目自動化構建工具-make/Makefile
make是一條指令
Makefile是當前目錄下的一個文件
mycode: mycode.c#依賴關系gcc -o mytest mycode.c#依賴方法clean:rm -f mycode
- 依賴關系+依賴方法
make會自動推導Makefile中的依賴關系(棧式結構)
- 為什么只能make一次?
沒有必要多次make,提高我們的編譯效率
怎么做到的?
比較源文件和可執行程序的Modify(最近修改)時間
源文件形成可執行文件。
先有源文件,才有可執行。一般而言,源文件的Modify時間要比可執行的Modify時間早
如果我們更改了源文件,歷史上還有可執行,那么源文件的Modify一定比可執行晚。
stat mytest#查看mytest的文件時間
#Access:文件被訪問
#Change:文件屬性被修改
#Modify:文件內容被修改
touch mytest#mytest已存在,把mytest的所有時間更新成最新的
make會根據源文件和可執行的新舊,判斷是否需要重新執行依賴關系進行編譯!
mycode: mycode.cgcc -o $@ $^
#$@:目標文件
#$^:源文件.PHONY:clean#偽目標,總是被執行
clean:rm -f mycode
使用git命令行
什么是git?
具有網絡功能的版本控制器(開源)
client和server是一體的
本地倉庫+遠端倉庫
git如何使用?
yum install git
git clone 鏈接
git add mycode
git commit -m "自己的練習代碼"
git push
git的其他問題
git log#提交日志
git status#提交狀態
#.gitignore
Linux調試器-gdb使用
debug&&release
debug可以被追蹤、調試,形成可執行程序的時候會有調試信息
gcc默認編譯是release方式發布的,不能直接調試
如果要以debug方式發布,必須攜帶-g選項
gcc -o mytest mycode.c -g
要被gdb調試,必須以debug方式發布
gdb命令
gdb mycode.c#開始調試mycode.c
q#退出調試,退出后上次調試信息會自動被清理掉
l 行號#顯示源代碼,每次列10行(行號所在位置在中間)
l 函數名#列出某個函數的源代碼。
r#運行程序
b 行號#在行號打斷點
info b#查看斷點信息
d 斷點編號#刪除對應的斷點信息
b 文件:行號#在對應文件行號打斷點
n#逐過程
s#逐語句
p 變量#查看變量的信息
display 變量#常顯示變量的信息
undisplay 編號#取消編號對應的常顯示
until 行號#調試轉到對應的行、快速跳過函數代碼快
finish#結束當前函數的調試
c#跳到下一個斷點
disable 斷點編號#禁用斷點
undisable 斷點編號#啟用斷點
set 變量#設置變量的值
bt#查看各級函數調用及參數
info locals#查看當前棧幀局部變量的值