linux第七章讀書筆記

Vim編輯器

Vim 僅僅經過鍵盤來在插入和執行命令等多種模式之間切換。這使得Vim能夠不用進行菜單或者鼠標操做,而且最小化組合鍵的操做,對文字錄入員或者程序員能夠大大加強速度和效率。css

CHAPTER 1.VIM快速入門

1、Vim的六種基本模式

1.普通模式

Vim的普通模式用的編輯器命令,好比移動光標,刪除文本等等。這也是Vim啓動後的默認模式,而不是大多數編輯器的插入模式。python

普通模式命令每每須要一個操做符結尾。linux

普通模式進入插入模式的方法:a鍵(append/追加)鍵或者i(insert/插入)鍵。nginx

2.插入模式

在這個模式中,大多數按鍵都會向文本緩衝中插入文本。大多數新用戶但願文本編輯器編輯過程當中一直保持這個模式。程序員

插入模式中回到普通模式:ESC鍵。正則表達式

3.可視模式

與普通模式相似,但移動命令會擴大高亮的文本區域。高亮區域能夠是字符、行或者是一塊文本。當執行一個非移動命令時,命令會被執行到這塊高亮的區域上。sql

4.選擇模式

這個模式中,能夠用鼠標或者光標鍵高亮選擇文本。shell

若是輸入任何字符,Vim會用這個字符替換選擇的高亮文本塊,而且自動進入插入模式。django

5.命令行模式

在命令行模式中能夠輸入會被解釋成並執行的文本。例如執行命令(:鍵),搜索(/和?鍵)或者過濾命令(!鍵)。編程

在命令執行以後,Vim返回到命令行模式以前的模式,一般是普通模式。

6.Ex模式(Ex mode)

這和命令行模式比較類似,在使用:visual命令離開Ex模式前,能夠一次執行多條命令。

※三種經常使用模式的切換:

經常使用模式:普通模式、插入模式和命令行模式。

普通→插入: i 或 a 插入→普通: Esc 或 Ctrl + [ 普通→命令行: : 命令行→普通:Esc 或 Ctrl + [

命令行模式下輸入wq ,回車後保存並退出。

2、進入Vim

1.使用vim命令進入vim界面

(1)vim後面加上你要打開的已存在的文件名,或者不存在的文件名做爲新建文件。

$ vim practice_1.txt

(2)直接使用vim也能夠打開vim編輯器,可是不會打開任何文件。

$ vim

(3)進入命令行模式後輸入:e 文件路徑 一樣能夠打開相應文件。

2.遊標移動

在進入vim後,按下i鍵進入插入模式,在該模式下能夠輸入文本信息;按Esc進入普通模式,在該模式下使用方向鍵或者h,j,k,l鍵能夠移動遊標。
具體按鍵以下:

h       左
l       右(小寫L)
j 下 k 上 w 移動到下一個單詞 b 移動到上一個單詞

3、進入插入模式

在普通模式下使用下面的鍵將進入插入模式,並能夠從相應的位置開始輸入。具體按鍵對應以下:

i 在當前光標處進行編輯 I 在行首插入 A 在行末插入 a 在光標後插入編輯 o 在當前行後插入一個新行 O 在當前行前插入一個新行 cw 替換從光標所在位置後到一個單詞結尾的字符

※每次要先回到普通模式才能切換成以不一樣的方式進入插入模式

4、保存文檔

命令行模式下保存文檔

(1)從普通模式輸入:進入命令行模式,輸入w回車,保存文檔。

(2)輸入:w 文件名能夠將文檔另存爲其餘文件名或存到其它路徑下.

5、退出vim

1.命令行模式下退出vim

從普通模式輸入:進入命令行模式,輸入wq回車,保存並退出編輯

如下爲其它幾種退出方式:

:q! 強制退出,不保存 :q 退出 :wq! 強制保存並退出 :w <文件路徑> 另存爲 :saveas 文件路徑 另存爲 :x 保存並退出 :wq 保存並退出

2.普通模式下退出vim

普通模式下輸入Shift+zz便可保存退出vim

6、刪除文本

1.普通模式下刪除vim文本信息

進入普通模式,使用下列命令能夠進行文本快速刪除:

x   刪除遊標所在的字符
X   刪除遊標所在前一個字符
Delete 同x dd 刪除整行 dw 刪除一個單詞(不適用中文) d$或D 刪除至行尾 d^ 刪除至行首 dG 刪除到文檔結尾處 d1G 刪至文檔首部

CHAPTER 2. VIM文檔編輯

1、vim重複命令

1.重複執行上次命令

在普通模式下.(小數點)表示重複上一次的命令操做。

2.執行指定次數相同的命令

進入普通模式輸入N,N表示重複後面的次數。

在普通模式下, dw或者daw(delete a word)刪除一個單詞,因此dnw(n替換爲相應數字)表示刪除n個單詞

2、遊標的快速跳轉

普通模式下,下列命令可讓光標快速調轉到指定位置,咱們分別討論快速實現行間跳轉行內跳轉

1.行間跳轉

  • nG(n Shift+g) 遊標移動到第 n 行
  • gg 遊標移動到到第一行
  • G(Shift+g) 到最後一行

※ 小技巧:Ctrl+o快速回到上一次(跳轉前)光標所在位置

2.行內跳轉

普通模式下使用下列命令在行內按照單詞爲單位進行跳轉

w 到下一個單詞的開頭 e 到下一個單詞的結尾 b 到前一個單詞的開頭 ge 到前一個單詞的結尾 0或^ 到行頭 $ 到行尾 f<字母> 向後搜索<字母>並跳轉到第一個匹配的位置(很是實用) F<字母> 向前搜索<字母>並跳轉到第一個匹配的位置 t<字母> 向後搜索<字母>並跳轉到第一個匹配位置以前的一個字母(不經常使用) T<字母> 向前搜索<字母>並跳轉到第一個匹配位置以後的一個字母(不經常使用)

※ ~能夠將遊標所在字母轉換大小寫

3、複製粘貼和剪切

1.複製及粘貼文本(普通模式中

1) 複製——y

yy複製遊標所在的整行(3yy表示複製3行) y^ 複製至行首,或y0。不含光標所在處字符。 y$ 複製至行尾。含光所在處字符。 yw 複製一個單詞。 y2w 複製兩個單詞。 yG 複製至文本末。 y1G 複製至文本開頭。

2) 粘貼——p

p(小寫)表明粘貼至光標後(下) P(大寫)表明粘貼至光標前(上)

2.剪切及粘貼

dd刪除命令就是剪切,剪切後就可使用p來粘貼。

※實用功能:交換上下行——ddp,快速交換光標所在行與它下面的行。

CHAPTER3 查找替換

1、字符的替換及撤銷(Undo操做)

替換和Undo命令都是針對普通模式下的操做

1) r+<待替換字母> 將遊標所在字母替換爲指定字母 2) R 連續替換,直到按下Esc 3) cc 替換整行,即刪除遊標所在行,並進入插入模式 4) cw 替換一個單詞,即刪除一個單詞,並進入插入模式 5) C(大寫) 替換遊標之後至行末 6) ~ 反轉游標所在字母大小寫 7) u{n} 撤銷一次或n次操做 8) U(大寫) 撤銷當前行的全部修改 9) Ctrl+r redo,即撤銷undo的操做

2、快速縮進

1.使用命令進行快速調整縮進操做(普通模式下)

>> 整行將向右縮進(使用,用於格式化代碼超爽) << 整行向左回退 : 進入命令行模式下對shiftwidth值進行設置能夠控制縮進和回退的字符數

2.shiftwidth命令

shiftwidth命令是指上一節>>命令產生的縮進(能夠簡寫成sw), 普通模式下輸入:進入命令行模式下對shiftwidth值進行設置,能夠控制縮進和回退的字符數。

1) 獲取目前的設定值 :set shiftwidth? 2) 設置縮進爲10個字符 :set shiftwidth=10

3.調整文本位置(命令行模式下

1)  :ce(center) 使本行內容居中 2) :ri(right) 使本行文本靠右 3) :le(left) 使本行內容靠左

3、查找

1.快速查找(普通模式下

a)  輸入 / 而後鍵入須要查找的字符串 按回車後就會進行查找。 
b)  ?與/功能相同,只不過?是向上而/是向下查找。 
c) 進入查找以後,輸入n和N能夠繼續查找 n表示繼續查找,N反向查找。

2.高級查找(普通模式下

a)  \*尋找遊標所在處的單詞
b)  \#同上,但 \* 是向前(上)找,#則是向後(下)找 c) g\*同\* ,但部分符合該單詞便可 d) g\#同\# ,但部分符合該單詞便可

※以上查找n,N 的繼續查找命令依然能夠用

CHAPTER4 高級功能入門

1、多文件編輯

1.使用vim編輯多個文件

編輯多個文件有兩種形式,一種是在進入vim前使用的參數就是多個文件。另外一種就是進入vim後再編輯其餘的文件。

若是

同時建立兩個新文件並編輯:

$ vim 1.txt 2.txt

命令行模式下輸入:n編輯2.txt文件,能夠加!即:n!強制切換,以前一個文件的輸入沒有保存,僅僅切換到另外一個文件

命令行模式下輸入:N編輯1.txt文件,能夠加!即:N!強制切換,以前文件內的輸入沒有保存,僅僅是切換到另外一個文件
即加!爲強制切換不保存。

2.進入vim後打開新文件(命令行模式

1)  e 3.txt 打開新文件3.txt 2) e# 回到前一個文件 3) ls能夠列出之前編輯過的文檔 4) b 2.txt(或者編號)能夠直接進入文件2.txt編輯 5) bd 2.txt(或者編號)能夠刪除之前編輯過的列表中的文件項目 6) e! 4.txt,新打開文件4.txt,放棄正在編輯的文件 7) f 顯示正在編輯的文件名 8) f new.txt,改變正在編輯的文件名字爲new.txt

3.恢復文件

若是由於斷電等緣由形成文檔沒有保存,能夠採用恢復方式,vim -r進入文檔後,輸入:

ewcover 1.txt

來恢復

2、可視模式命令簡介(普通模式)

1. v(小寫) 進入字符選擇模式,就能夠移動光標,光標走過的地方就會選取。再次按下v會後就會取消選取。 2. Shift+v(小寫) 進入行選擇模式,按下V以後就會把整行選取,您能夠上下移動光標選更多的行,一樣,再按一次Shift+v就能夠取消選取。 3. Ctrl+v(小寫) 這是區域選擇模式,能夠進行矩形區域選擇,再按一次Ctrl+v取消選取。 4. d 刪除選取區域內容 5. y 複製選取區域內容

3、視窗操做簡介

(1)命令行模式下

:new打開一個新的vim視窗,並進入視窗編輯一個新文件 :sp 1.txt 打開新的橫向視窗來編輯1.txt :vsp 2.txt 打開新的縱向視窗來編輯1.txt

(2)普通模式下

Ctrl+w打開一個新的vim視窗,並進入視窗編輯一個新文件 Ctrl-w s 將當前窗口分割成兩個水平的窗口 Ctrl-w v 將當前窗口分割成兩個垂直的窗口 Ctrl-w q 即 :q 結束分割出來的視窗。若是在新視窗中有輸入須要使用強制符!即:q! Ctrl-w o 打開一個視窗而且隱藏以前的全部視窗 Ctrl-w j 移至下面視窗 Ctrl-w k 移至上面視窗 Ctrl-w h 移至左邊視窗 Ctrl-w l 移至右邊視窗 Ctrl-w J 將當前視窗移至下面 Ctrl-w K 將當前視窗移至上面 Ctrl-w H 將當前視窗移至左邊 Ctrl-w L 將當前視窗移至右邊 Ctrl-w - 減少視窗的高度 Ctrl-w + 增長視窗的高度

4、文檔加密

建立加密文檔

$ vim -x file1

5、在vim執行外部命令

在命令行模式中輸入 ! 能夠執行外部的shell命令

:!ls 用於顯示當前目錄的內容 :!rm FILENAME用於刪除名爲 FILENAME 的文件 :w FILENAME可將當前 VIM 中正在編輯的文件另存爲 FILENAME 文件

6、幫助系統

vim中的查看幫助:

普通模式下按F1打開vim本身預設的幫助文檔

命令行模式下輸入:h shiftwidth 打開名爲shiftwidth的幫助文件

命令行模式下輸入:ver 顯示版本及參數

7、功能設定

1.vim的功能設定

能夠在編輯文件的時候進行功能設定,如命令行模式下輸入:set nu(顯示行數),設定值退出vim後不會保存。

要永久保存配置須要修改vim配置文件。 vim的配置文件~/.vimrc,能夠打開文件進行修改,不過務必當心不要影響vim正常使用

2.獲取目前的設定(命令行模式

1) :set或者:se顯示全部修改過的配置 2) :set all 顯示全部的設定值 3) :set option? 顯示option的設定值 4) :set nooption 取消當期設定值

3.set功能的說明(命令行模式

1)  :set autoindent(ai) 設置自動縮進 2) :set autowrite(aw) 設置自動存檔,默認未打開 3) :set background=dark或light,設置背景風格 4) :set backup(bk) 設置自動備份,默認未打開 5) : set cindent(cin) 設置C語言風格縮進

這些均可以在配置文件中設置好,沒必要非要在命令行模式中輸入。

深刻理解計算機系統

CHAPTER1 LINUX基礎

1 Linux命令

Linux中命令格式爲:

command [options] [arguments] 命令 [選項] [參數]

中括號表明是可選的,即有些命令不須要選項也不須要參數。

1) 選項是調整命令執行行爲的開關,選項不一樣決定了命令的顯示結果不一樣。

2) 參數是指命令的做用對象。

2 man命令

man是manul的縮寫,咱們能夠經過man man來查看man的幫助

幫助文檔包含:

1 Executable programs or shell commands(用戶命令幫助) 2 System calls (系統調用幫助) 3 Library calls (庫函數調用幫助) 4 Special files (usually found in /dev) 5 File formats and conventions eg /etc/passwd(配置文件幫助) 6 Games 7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) 8 System administration commands (usually only for root) 9 Kernel routines [Non standard] 

解釋一下:

1是普通的Linux命令 2是系統調用,操做系統的提供的服務接口 3是庫函數, C語言中的函數 5是指文件的格式,好比passwd, 就會說明這個文件中各個字段的含義 6是給遊戲留的,由各個遊戲本身定義 7是附件還有一些變量,好比向environ這種全局變量在這裏就有說明 8是系統管理用的命令,這些命令只能由root使用,如ifconfig

man -k

man有一個-k 選項用起來很是好,這個選項讓你學習命令、編程時有了一個搜索引擎,能夠觸類旁通。結合後面學習的grep 命令和管道,能夠多關鍵字查找:

man -k key1 | grep key2 | grep key3 | ...

3 cheat 命令

「做弊命令」,簡單備忘單

它提供顯示Linux命令使用案例,包括該命令全部的選項和簡短但尚可理解的功能。

4 其餘核心命令

查找,搜索相關的核心命令還有find,locate,grep,whereis,which,其中:

1) find查找一個文件在系統中的什麼位置,locate是神速版本的find(Windows下有個Everything工具和locate相似). 2) grep 能夠對文件**全文檢索**,支持**正則表達式**,正則表達式也是一個重要的元知識。 3) whereis,which告訴你使用的命令工具裝在什麼地方。 which比whereis更精確,直接定位到可執行文件。

※grep 管道相關, 前面的輸出做爲後面的輸入

在多關鍵字檢索時,用** | grep **分隔開,這點見 man -k

CHAPTER2 LINUX下C語言開發基礎

c語言開發步驟

(1).c 或者 .h 文件編寫 ——vim

(2)對文件編譯 ——gcc

(3)調試 ——gcd

(4)項目管理或維護 ——make

1、編譯工具vim

1.安裝

sudo apt-get install vim

2.三種模式

命令行模式
插入模式
底行模式

這裏說的三種模式與以前的vim編輯器實驗中的有差異,分別對應實驗指導書中的普通模式、插入模式、命令行模式。

3.常規配置

進入配置文件:
:echo $VIM 進入並改動: sudo /usr/share/vim/vimrc

設置c語言高亮風格:

if has("syntax") syntax on endif

這裏是on,就打開高亮。

在下面一羣.set的部分,能夠加入一些設定,好比:

set showmatch 高亮顯示{, }, (, ), [, 或者 ] 的匹配狀況 set autoindent 縮進 set nu 顯示行號 set ai 自動縮行 set ts=4 設置一個 TAB 鍵等於幾個空格

快捷鍵-移動光標

[[ 轉到上一個位於第一列的"{" ]] 轉到下一個位於第一列的"{" { 轉到上一個空行 } 轉到下一個空行 gd 轉到當前光標所指的局部變量的定義

4.快捷幫助菜單

:help :help iccf

除了vim以外,還有Emacs和gedit,都是圖形化的文本編輯器,gedit不經常使用。

2、編譯器GCC

1.安裝gcc的頭文件、庫文件

sudo apt-get install build-essential

安裝到usr/lib中,到usr/bin中(可執行文件),到usr/include中(頭文件)

2.GCC選項列表

(1)經常使用選項
-c 只編譯不連接,生成目標文件.o -S 只編譯不彙編,生成彙編代碼 -E 只進行預編譯,不作其餘處理 -g 在可執行程序中包含標準調試信息 -o file 將file文件指定爲輸出文件 -v 打印出編譯器內部編譯各過程的命令行信息和編譯器的版本 -I dir 在頭文件的搜索路徑列表中添加dir目錄
(2)庫選項
-static 進行靜態編譯,即連接靜態庫,禁止使用動態庫 -shared 1.能夠生成動態庫文件 2.進行動態編譯,儘量的連接動態庫,沒有動態庫時纔會連接同名靜態庫 -L dir 在庫文件的搜索路徑列表中添加dir目錄 -lname 連接稱爲libname.a或者libname.so的庫文件。 若是兩個庫文件都存在,根據編譯方式是static仍是shared進行連接 -fPIC 生成使用相對地址的位置無關的目標代碼, (-fpic) 而後一般使用gcc的-static選項從該pic目標文件生成動態庫文件。

3.編譯過程

預處理:gcc –E hello.c –o hello.i; gcc –E調用cpp 生成中間文件 編 譯:gcc –S hello.i –o hello.s; gcc –S調用ccl 翻譯成彙編文件 匯 編:gcc –c hello.s –o hello.o; gcc -c 調用as 翻譯成可重定位目標文件 鏈 接:gcc hello.o –o hello ; gcc -o 調用ld** 建立可執行目標文件

-o後面是接的你給生成的文件指定的名字,若是不指定,則默認爲a.out

在命令行上運行這個可執行目標文件須要輸入它的名字:

./a.out 

爲何?

Window下,搜索一個東西會從當前目錄下,找不到去PATH環境變量中找;Linux下只從PATH環境變量中找,因此即便當前目錄有,也要指出來; "."表示當前目錄,「./libvector.a」 表示用當前目錄下的libvector.a庫文件。 凡是不帶前綴的,都是PATH中有,但不安全。

因此其實這行代碼只是在輸入它的名字, ./ 表示當前目錄

外殼調用操做系統中一個叫加載器的函數,拷貝可執行文件p中的代碼和數據到存儲器,而後將控制轉移到這個程序的開頭。

技巧:前三步,GCC的參數連起來是「ESc」,相應輸入的文件的後綴是「iso」

4.靜態庫

(1)靜態連接

像Unix ld程序這樣的靜態連接器,以一組可重定位目標文件命令行參數做爲輸入,生成一個徹底連接的能夠加載和運行的可執行目標文件做爲輸出。

爲了構造可執行文件,連接器必須完成兩個主要任務:

  • 符號解析
  • 重定位

目標文件純粹是字節塊的集合,連接器將這些塊連接起來,肯定被鏈接塊的運行時位置,而且修改代碼和數據塊中的各類位置。

(2)靜態庫

全部的編譯系統都提供一種機制,將全部相關的目標模塊打包成爲一個單獨的文件,稱爲靜態庫,能夠做爲連接器的輸入。當連接器構造一個輸出的可執行文件時,它只拷貝靜態庫裏被應用程序引用的目標模塊。

在Unix系統中,靜態庫以一種稱爲存檔的特殊文件格式存放在磁盤中。存檔文件是一組鏈接起來的可重定位目標文件的集合,有一個頭部用來描述每一個成員目標文件的大小和位置。存檔文件由後綴.a識別。

建立靜態庫需用用到AR工具

※AR工具的使用:

1.ar基本用法

  ar命令能夠用來建立、修改庫,也能夠從庫中提出單個模塊。

  下面是ar命令的格式:

ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...

{dmpqrtx}部分稱爲操做選項

[abcfilNoPsSuvV]部分稱爲任選項

{dmpqrtx}中的操做選項在命令中只能而且必須使用其中一個,它們的含義以下:

d:從庫中刪除模塊。按模塊原來的文件名指定要刪除的模塊。若是使用了任選項v則列出被刪除的每一個模塊。
m:該操做是在一個庫中移動成員。當庫中若是有若干模塊有相同的符號定義(如函數定義),則成員的位置順序很重要。若是沒有指定任選項,任何指定的成員將移到庫的最後。也可使用'a','b',或'i'任選項移動到指定的位置。 p:顯示庫中指定的成員到標準輸出。若是指定任選項v,則在輸出成員的內容前,將顯示成員的名字。若是沒有指定成員的名字,全部庫中的文件將顯示出來。 q:快速追加。增長新模塊到庫的結尾處。並不檢查是否須要替換。'a','b',或'i'任選項對此操做沒有影響,模塊老是追加的庫的結尾處。若是使用了任選項v則列出每一個模塊。 這時,庫的符號表沒有更新,能夠用'ar s'或ranlib來更新庫的符號表索引。 r:在庫中插入模塊(替換)。當插入的模塊名已經在庫中存在,則替換同名的模塊。若是若干模塊中有一個模塊在庫中不存在,ar顯示一個錯誤消息,並不替換其餘同名模塊。默認的狀況下,新的成員增長在庫的結尾處,可使用其餘任選項來改變增長的位置。 t:顯示庫的模塊表清單。通常只顯示模塊名。 x:從庫中提取一個成員。若是不指定要提取的模塊,則提取庫中全部的模塊。

  下面在看看可與操做選項結合使用的任選項:

a:在庫的一個已經存在的成員後面增長一個新的文件。若是使用任選項a,則應該爲命令行中membername參數指定一個已經存在的成員名。
b:在庫的一個已經存在的成員前面增長一個新的文件。若是使用任選項b,則應該爲命令行中membername參數指定一個已經存在的成員名。
c:建立一個庫。無論庫是否存在,都將建立。 f:在庫中截短指定的名字。缺省狀況下,文件名的長度是不受限制的,可使用此參數將文件名截短,以保證與其它系統的兼容。 i:在庫的一個已經存在的成員前面增長一個新的文件。若是使用任選項i,則應該爲命令行中membername參數指定一個已經存在的成員名(相似任選項b)。 l:暫未使用 N:與count參數一塊兒使用,在庫中有多個相同的文件名時指定提取或輸出的個數。 o:當提取成員時,保留成員的原始數據。若是不指定該任選項,則提取出的模塊的時間將標爲提取出的時間。 P:進行文件名匹配時使用全路徑名。ar在建立庫時不能使用全路徑名(這樣的庫文件不符合POSIX標準),可是有些工具能夠。 s:寫入一個目標文件索引到庫中,或者更新一個存在的目標文件索引。甚至對於沒有任何變化的庫也做該動做。對一個庫作ar s等同於對該庫作ranlib。 S:不建立目標文件索引,這在建立較大的庫時能加快時間。 u:通常說來,命令ar r...插入全部列出的文件到庫中,若是你只想插入列出文件中那些比庫中同名文件新的文件,就可使用該任選項。該任選項只用於r操做選項。 v:該選項用來顯示執行操做選項的附加信息。 V:顯示ar的版本。
2.書上的例子:

建立該庫:

gcc -c addvec.c multvec.c ar rcs libvector.a addvec.o multvec.o

根據上面的內容能夠得出,是作了如下動做:

gcc -c只編譯,不鏈接成爲可執行文件。 即:把.c文件編譯成.o文件 ar -r:在庫中插入模塊(替換) -c:建立一個庫 -s:寫入一個目錄文件索引到庫中 即:把兩個.o文件歸檔成靜態庫存檔文件.a而且寫入目錄文件索引到庫中。

省略一個調用addvec庫例程的main2.c

爲了建立它的可執行文件,要編譯和連接輸入文件main2.o和靜態庫libvector.a

gcc -02 -c main2.c gcc -static -o p2 main2.o ./libvector.a

相關指令含義:

gcc -02 和-0都是代碼優化指令,能夠減小編譯時間 -c 只編譯,不鏈接成爲可執行文件 -static 告訴編譯器驅動程序,連接器應該構建一個徹底連接的可執行目標文件 -o 命名生成文件

代碼含義:

第一行,將main2.c文件編譯成main2.o 第二行,將輸出文件命名爲p2,連接輸入文件main2.o和靜態庫libvector.a

學習GCC的另一個重點是:參考教材《深刻理解計算機系統》 7.6,7.10節,學習靜態庫,動態庫的製做。

5.動態連接共享庫

共享庫是一個目標模塊,在運行時能夠加載到任意的存儲器地址,並和一個在存儲器中的程序連接起來。這個過程稱爲動態連接,是由一個叫作動態連接庫的程序來執行的。

共享庫也稱爲共享目標,在Unix系統中一般用.so後綴

微軟的DLL:動態連接庫

構造建立共享庫:(同靜態庫的範例)

gcc -shared -fPIC -o libvector.so addvec.c multvec.c

參數解析:

-fPIC 指示編譯器生成與位置無關的代碼 -shared 指示連接器建立一個共享的目標文件 -o 命名生成文件

動做是把.c文件編譯成爲.o文件,放入新建的共享庫中,而且命名。

連接程序

gcc -o p2 main2.c ./libvector.so

這樣會建立一個可執行目標文件p2,在運行時能夠和動態庫libverctor.so連接。

靜態庫和動態共享庫的代碼區別:

建立

靜態庫的建立須要調用歸檔工具ar: gcc -c addvec.c multvec.c ar rcs libvector.a addvec.o multvec.o 而動態庫只須要gcc便可: gcc -shared -fPIC -o libvector.so addvec.c multvec.c

連接

靜態庫的連接須要先編譯生成.o文件,而後再和庫連接,而且須要staric命令構建一個徹底連接的可執行文件:
gcc -02 -c main2.c gcc -static -o p2 main2.o ./libvector.a 動態庫能夠直接把.c文件和庫文件連接 gcc -o p2 main2.c ./libvector.so

3、調試工具gdb

使用GCC編譯時要加「-g」參數

GDB最基本的命令有:

gdb programm(啓動GDB) l 查看所載入的文件 b 設斷點 info b 查看斷點狀況 run 開始運行程序 bt 打印函數調用堆棧 p 查看變量值 c 從當前斷點繼續運行到下一個斷點 n 單步運行(不進入) s 單步運行(進入) quit 退出GDB

四種斷點:

1.行斷點
b [行數或函數名] <條件表達式>
2.函數斷點
b [函數名] <條件表達式>
3.條件斷點
b [行數或函數名] <if表達式>

4.臨時斷點

tbreak [行數或函數名] <條件表達式>

問題:GDB的n(next)命令讓GDB執行下一行,而後暫停。 s(step)命令的做用與此相似,只是在函數調用時step命令會進入函數,那麼實際使用中應該優先選用哪一個?爲何?

其餘幾個我認爲應該掌握的調試命令有:

display 跟蹤變量值的改變
until 跳出循環
finish 跳出函數
help 幫助
學習參考:

4、Make和Makefile

make工具最主要也是最基本的功能就是根據makefile文件中描述的源程序至今的相互關係來完成自動編譯、維護多個源文件工程

而makefile文件須要按某種語法進行編寫,文件中須要說明如何編譯各個源文件並連接生成可執行文件,要求定義源文件之間的依賴關係。

最終實現——自動化編譯

進入Makefile?

$ vim Makefile

1.Makefile 基本規則

Makefile的通常寫法:

一個Makefile文件主要含有一系列的規則,每條規則包含如下內容:

  • 須要由make工具建立的目標體,一般是可執行文件和目標文件,也能夠是要執行的動做,如‘clean’;

  • 要建立的目標體所依賴的文件,一般是編譯目標文件所須要的其餘文件。

  • 建立每一個目標體時須要運行的命令,這一行必須以製表符TAB開頭

格式爲:

test(目標文件): prog.o code.o(依賴文件列表) tab(至少一個tab的位置) gcc prog.o code.o -o test(命令) ....... 即: target: dependency_files command

2.使用帶宏的 Makefile

Makefile中的宏,也稱做變量

變量是在makefile中定義的名字,用來代替一個文本字符串,該文本字符串稱爲該變量的值。

定義變量的兩種方式:
1)遞歸展開方式 VAR=var (2)簡單方式 VAR:=var
使用變量的格式爲:
$(VAR)
變量的分類
  • 用戶自定義變量
  • 預約義變量
  • 自動變量
  • 環境變量

    做業

  • 練習gcc編譯運行代碼。
  • 練習gdb調試代碼 。
  • 把上述代碼中除了main函數外的代碼製做成一個靜態庫math.a和一個共享庫math.so。
  • 編寫makefile,讓代碼編譯,上述靜態庫和共享庫的使用自動化。

步驟:

已經把這些文檔輸入進去了

報錯:沒有main函數

沒有頭文件,我加了頭文件以後:

正確了

創建靜態庫,並命名爲math1.a

連接main.o和靜態庫math.a(上面已經把main.c編譯成main.o)

運行:

創建動態庫,並命名爲math2.so

運行:

編寫makefile:
靜態庫——math3:

動態庫math4:

相關文章
相關標籤/搜索