1.軟件包管理器
1.1什么是軟件包
? 在Linux下安裝軟件, ?個通常的辦法是下載到程序的源代碼, 并進?編譯, 得到可執?程序.
? 但是這樣太?煩了, 于是有些?把?些常?的軟件提前編譯好, 做成軟件包(可以理解成windows上
的安裝程序)放在?個服務器上, 通過包管理器可以很?便的獲取到這個編譯好的軟件包, 直接進?安
裝.
? 軟件包和軟件包管理器, 就好? "App" 和 "應?商店" 這樣的關系.
? yum(Yellow dog Updater, Modified)是Linux下?常常?的?種包管理器. 主要應?在Fedora,
RedHat, Centos等發?版上.
? Ubuntu:主要使?apt(Advanced Package Tool)作為其包管理器。apt同樣提供了?動解決依
賴關系、下載和安裝軟件包的功能。
1.2Linux軟件生態(重要)?
1.3yum具體操作?
?1.查看軟件包:
注意事項:
? 安裝軟件時由于需要向系統?錄中寫?內容, ?般需要 sudo 或者切到 root 賬?下才能完成.
? yum/apt安裝軟件只能?個裝完了再裝另?個. 正在yum/apt安裝?個軟件的過程中, 如果再嘗試?
yum/apt安裝另外?個軟件, yum/apt會報錯.
? 如果 yum / apt報錯, 請??百度.
3.卸載軟件:sudo yum remove [-y] lrzsz(windows與Linux之間互傳文件的軟件)
2.編譯器Vim
?1.vim的基本概念:
vim有好多種模式(主要三種):1.命令模式(command mode). 2.插入模式(insert mode). 3.底行模式(last line mode)
?2.vim命令集
?
?:!? 不用退出vim就可以進行指令。??
Ctrl + w + w多個分屏間循環移動光標;Ctrl + w + l:把光標移到右邊的分屏;Ctrl + w + h:把光標移到左邊的分屏
shift+z+z : 快捷鍵保存并退出
3.vim配置
3.編譯器gcc/g++
背景知識
1. 預處理(進?宏替換/去注釋/條件編譯/頭?件展開等)
2. 編譯(?成匯編)
3. 匯編(?成機器可識別代碼)
4. 連接(?成可執??件或庫?件)
?
?
?ldd:用于顯示可執行程序或動態鏈接庫所依賴的其他共享庫。
2.動態鏈接和靜態鏈接:
1.在我們的實際開發中,不可能將所有代碼放在?個源?件中,所以會出現多個源?件,?且多個源? 件之間不是獨?的,?會存在多種依賴關系,如?個源?件可能要調?另?個源?件中定義的函數, 但是每個源?件都是獨?編譯的,即每個*.c?件會形成?個*.o?件,為了滿?前?說的依賴關系,則 需要將這些源?件產?的?標?件進?鏈接,從?形成?個可以執?的程序。這個鏈接的過程就是靜態鏈接。靜態鏈接的缺點很明顯:
? 浪費空間:因為每個可執?程序中對所有需要的?標?件都要有?份副本,所以如果多個程序對
同?個?標?件都有依賴,如多個程序中都調?了printf()函數,則這多個程序中都含有
printf.o,所以同?個?標?件都在內存存在多個副本;
? 更新?較困難:因為每當庫函數的代碼修改了,這個時候就需要重新進?編譯鏈接形成可執?程
序。但是靜態鏈接的優點就是,在可執?程序中已經具備了所有執?程序所需要的任何東西,在
執?的時候運?速度快。
?2.動態鏈接的出現解決了靜態鏈接中提到問題。動態鏈接的基本思想是把程序按照模塊拆分成各個相對獨?部分,在程序運?時才將它們鏈接在?起形成?個完整的程序,?不是像靜態鏈接?樣把所有程序模塊都鏈接成?個單獨的可執??件。動態鏈接其實遠?靜態鏈接要常?得多。
3.靜態庫和動態庫
? 我們的C程序中,并沒有定義“printf”的函數實現,且在預編譯中包含的“stdio.h”中也只有該
函數的聲明,?沒有定義函數的實現,那么,是在哪?實“printf”函數的呢?
? 最后的答案是:系統把這些函數實現都被做到名為 libc.so.6 的庫?件中去了,在沒有特別指定
時,gcc 會到系統默認的搜索路徑“/usr/lib”下進?查找,也就是鏈接到 libc.so.6 庫函數中去,這樣
就能實現函數“printf”了,?這也就是鏈接的作?
?1.靜態庫是指編譯鏈接時,把庫?件的代碼全部加?到可執??件中,因此?成的?件?較?,但在運 ?時也就不再需要庫?件了。其后綴名?般為“.a ”
2.動態庫與之相反,在編譯鏈接時并沒有把庫?件的代碼加?到可執??件中,?是在程序執?時由 運?時鏈接?件加載庫,這樣可以節省系統的開銷。動態庫?般后綴名為“.so”,如前?所述的 libc.so.6 就是動態庫。gcc 在編譯時默認使?動態庫。完成了鏈接之后,gcc 就可以?成可執?? 件。
3.gcc默認?成的?進制程序,是動態鏈接的,這點可以通過 file 命令驗證。
4.自動化構建-make/Makefile
1.背景
? ?個?程中的源?件不計數,其按類型、功能、模塊分別放在若?個?錄中,makefile定義了?
系列的規則來指定,哪些?件需要先編譯,哪些?件需要后編譯,哪些?件需要重新編譯,甚?
于進?更復雜的功能操作? makefile帶來的好處就是?“?動化編譯”,?旦寫好,只需要?個make命令,整個?程完全
?動編譯,極?的提?了軟件開發的效率。? make是?個命令?具,是?個解釋makefile中指令的命令?具,?般來說,?多數的IDE都有這
個命令,?如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可?,makefile
都成為了?種在?程??的編譯?法。? make是?條命令,makefile是?個?件,兩個搭配使?,完成項??動化構建。
myproc:myproc.cgcc -o myproc myproc.c
.PHONY:clean
clean:rm -f myproc//注:這里的間距必須用tab
2.基本使用?
?3.進一步理解
1. make會在當前?錄下找名字叫“Makefile”或“makefile”的?件。2.如果 myproc 所依賴的 myproc.o ?件不存在,那么 make 會在當前?件中找?標為
myproc.o ?件的依賴性,如果找到則再根據那?個規則?成 myproc.o ?件。(這有點像?
個堆棧的過程)3.這就是整個make的依賴性,make會?層??層地去找?件的依賴關系,直到最終編譯出第?個
?標?件。4.make只管?件的依賴性,即,如果在我找了依賴關系之后,冒號后?的?件還是不在,那么對
不起,我就不?作啦。
1.wildcard函數:
這是 Makefile 中的一個內置函數:用于展開為當前目錄下所有符合模式的文件列表
如:模式是*.c,所以$(wildcard *.c)會查找當前目錄下所有擴展名為.c的文件,
并將這些文件名組成一個列表賦值給變量SRC。
例如,如果當前目錄下有main.c、utils.c兩個 C 源文件,那么SRC的值就會是main.c utils.c。2.OBJ=$(SRC:.c=.o)
變量替換語法:將變量SRC中所有文件名的后綴.c替換為.o。
?
*5.Linux第一個程序-進度條
預備知識:0.int a = 123456;
printf("%d", a);在顯示器上它并不是整數而是字符串1.回車換行問題:
回車換行(\n)不是一個概念:它是先回到該行的最前面(\r),再換行.2.用戶緩沖區問題:
示例:
#include<stdio.h>
#include<unistd.h>
int main()
{printf("hello world");sleep(2);return 0;
}//現象是先休眠兩秒,再出現hello world但是程序執行的順序一定是從上到下,那在sleep時,hello world字符串哪去了?
答:在C語言緩沖區中!!!
緩沖區刷新我們才能看到之前存儲在緩沖區里的內容緩沖區刷新策略:
1.\nor\r\n,\n之前所有內容,全部刷新到顯示器
2.程序退出的時候,曾經的歷史數據,會被刷新
3.我們還可以強制刷新看到:int fflush(FILE *stdout)
【extern FILE *stdout (標準輸出->顯示器)】
可以直接從之前寫好的mv過來?
./count(用于運行當前目錄下名為?count
?的可執行文件," ./ " 表示當前目錄)?
改進后若把9改為10,則10,90,80...(側面說明了打到顯示器上的是字符串不是整數,所以往前覆蓋時只蓋住了1,而不是10)
cat *(*是通配符,代表當前目錄下所有文件) ;vs 文件(分屏操作)
cp ../Makefile .? (將上一級目錄中的?Makefile
?文件復制到當前所在的目錄中);
cp?用于復制文件或目錄的命令;?
../Makefile
?指的是當前目錄上一級目錄中的名為?Makefile
?的文件。.
?表示目標位置,這里的?.
?代表當前目錄。
man 用于查找命令的用法
?這里當rate超過100要手動修改一下等于100,不然會導致越界!!!ovo
6.版本控制器Git
1.理解git的作用
為了能夠更?便我們管理不同版本的?件,便有了版本控制器。所謂的版本控制器,就是能讓你了解到?個?件的歷史,以及它的發展過程的系統。通俗的講就是?個可以記錄?程的每?次改動和版本迭代的?個管理系統,同時也?便多?協同作業。
?2. 將linux代碼提交到git上:
?3.gitignore(忽略次要文件)
4.git status(用于查看當前工作目錄和暫存區的狀態)
git status
命令能清晰顯示哪些文件被修改、哪些文件是新增的、哪些文件被刪除,以及哪些文件已被添加到暫存區等待提交等信息,幫助開發者隨時掌握倉庫的狀態。
5.git pull(將更新同步到本地倉庫,保證本地代碼與遠程倉庫代碼一致)
6.git log(以倒序的方式顯示所有提交記錄)
.......git還有很多知識,會單獨出一章。。。
7.調試器 - gdb/cgdb使用
1.基本了解
? 程序的發布?式有兩種, debug 模式和 release 模式, Linux gcc/g++ 出來的?進制程
序,默認是 release 模式。? 要使?gdb調試,必須在源代碼?成?進制程序的時候, 加上 -g 選項,如果沒有添加,程序?法被
編譯1.Debug:程序員自己用,添加調試信息的
2.Release:給別人的,用戶,測試,不添加調試信息的
?grep文本搜索工具
2.調試命令--cgdb
調試的本質:定位問題!!!list/l 行號0:查看代碼
b 行號:打斷點
info b:查看斷點
d 斷點編號:刪除
?退出:ctrl + d 或 quit
?找問題時可以用二分查找的策略
3.調試技巧?
1.watch / 條件斷點
注意:
? 條件斷點添加常?兩種?式:1. 新增 2. 給已有斷點追加
? 注意兩者的語法有區別,不要寫錯了。
? 新增: b ?號/?件名:?號/函數名 if i == 30(條件)
? 給已有斷點追加:condition 2 i==30, 其中2是已有斷點編號,沒有if