20135202閆佳歆-信息安全系統設計基礎第三週學習總結

Vim編輯器

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

CHAPTER 1.VIM快速入門

1、Vim的六種基本模式

1.普通模式

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

普通模式命令每每須要一個操做符結尾。正則表達式

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

2.插入模式

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

插入模式中回到普通模式:ESC鍵。vim

3.可視模式

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

4.選擇模式

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

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

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:

遇到的問題及解決:

1.vim三種模式的不一樣叫法讓我糾結了一陣

2.關於./的含義和靜態庫編寫時候的問題,經過本身思考和詢問老師解決。

3.在學習靜態庫時,看到了ar這個命令沒有學過,經過網上搜索瞭解的它的做用;同時gcc的一些選項的含義也不明白,一樣經過百度搜索獲得答案。

4.作做業的時候,main.c函數裏沒有頭文件stdio.h和head.h,我開始不清楚是否要補上,可是在編譯的時候發現若是不加這兩個頭文件就會不停的編譯出錯,沒法繼續下面的工做,因此這兩個頭文件是確定要補上的。

其餘

此次的做業前半程作的很辛苦,絕大部分是自找的。在前幾天我只知道盲目的學學學,可是太多東西不會,就致使我學的很是辛苦。我喜歡把筆記作的多多的寫的完完整整的,因此在前面的筆記裏我採起的方法是蒐羅手上的各類資料而後集合在一塊兒通通敲上來,力求作到全面。這樣帶來的後果是很是明顯的,我花了大部分的時間來寫個人筆記,可是其實並無真正記住消化多少知識。並且書本上不少內容都看不懂,尤爲一些概念都不清楚。

而後我發現,這是因爲個人學習方法有問題,畢竟做爲打基礎的開始,一切都應該按部就班,我不能妄想一口吃成胖子,一股腦吸收全部知識只能把我壓垮,我如今要作的應該是夯實基礎,而不是對全部內容來者不拒通通吃下,這必然是很是累,並且低效率的。

而後我改變了本身的學習方法以後,就如同撥得雲開見月明,學的更有目的,也更輕鬆。我不應追求筆記多麼多麼詳實,把不少如今根本沒法理解的東西都一股腦的塞給本身,而是先掌握這個知識這個技巧最基本的用法,反覆練習增強熟練度。羅馬不是一天建成的,學習是按部就班的事情,我要注重腳下,夯實基礎。

相關文章
相關標籤/搜索