實驗說明
1. 環境登入
無需密碼自動登入,系統使用者名shiyanlou,密碼shiyanlou 若不小心登出後,直接重新整理頁面即可
2. 環境使用
完成實驗後可以點選桌面上方的“實驗截圖”儲存并分享實驗結果到微網誌,向好友展示自己的學習進度。實驗樓提供背景系統截圖,可以真實有效證明您已經完成了實驗。 實驗記錄頁面可以在“我的首頁”中檢視,其中含有每次實驗的截圖及筆記,以及每次實驗的有效學習時間(指的是在實驗桌面内操作的時間,如果沒有操作,系統會記錄為發呆時間)。這些都是您學習的真實性證明。
3. 課程來源
VIM 線上手冊
内容一:vim編輯器的使用
1.vim編輯器的三種模式
Ⅰ正常模式:(按Esc或Ctrl+[進入) 左下角顯示檔案名或為空
Ⅱ插入模式:(按i鍵進入) 左下角顯示--INSERT--
Ⅲ可視模式:左下角顯示—VISUAL
2、vim的一些基本操作
Ⅰ、遊标移動:
在進入vim後,按下i鍵進入插入模式。在該模式下您可以輸入文本資訊,下面請輸入如下三行資訊:
12345678
abcdefghijk
shiyanlou.com
按Esc進入普通模式,在該模式下使用方向鍵或者h,j,k,l鍵可以移動遊标。
按鍵 | 說明 |
h | 左 |
l | 右(小寫L) |
j | 下 |
k | 上 |
w | 移動到下一個單詞 |
b | 移動到上一個單詞 |
請嘗試在普通模式下使用方向鍵移動光标到shiyanlou這幾個字母上面
Ⅱ.插入模式
在普通模式下使用下面的鍵将進入插入模式,并可以從相應的位置開始輸入
指令 | |
i | 在目前光标處進行編輯 |
I | 在行首插入 |
A | 在行末插入 |
a | 在光标後插入編輯 |
o | 在目前行後插入一個新行 |
O | 在目前行前插入一個新行 |
cw | 替換從光标所在位置後到一個單詞結尾的字元 |
請嘗試不同的從普通模式進入插入模式的方法,在最後一行shiyanlou前面加上www.,注意每次要先回到普通模式才能切換成以不同的方式進入插入模式
Ⅲ.儲存文檔
指令行模式下儲存文檔:
儲存文檔從普通模式輸入:進入指令行模式,輸入w回車,儲存文檔。輸入:w 檔案名可以将文檔另存為其他檔案名或存到其它路徑下
Ⅳ.退出vim
指令行模式下退出vim:
從普通模式輸入:進入指令行模式,輸入wq回車,儲存并退出編輯
以下為其它幾種退出方式:
:q! | 強制退出,不儲存 |
:q | 退出 |
:wq! | 強制儲存并退出 |
:w <檔案路徑> | 另存為 |
:saveas 檔案路徑 | |
:x | 儲存并退出 |
:wq |
Ⅴ.普通模式下退出vim
普通模式下輸入Shift+zz即可儲存退出vim
Ⅵ.删除文本
1.普通模式下删除vim文本資訊
進入普通模式,使用下列指令可以進行文本快速删除:
x | 删除遊标所在的字元 |
X | 删除遊标所在前一個字元 |
Delete | 同x |
dd | 删除整行 |
dw | 删除一個單詞(不适用中文) |
d$或D | 删除至行尾 |
d^ | 删除至行首 |
dG | 删除到文檔結尾處 |
d1G | 删至文檔首部 |
除此之外,你還可以在指令之前加上數字,表示一次删除多行,如:
2dd表示一次删除2行
内容二:Linux下C語言程式設計基礎
實驗目的
1. 熟悉Linux系統下的開發環境
2. 熟悉vi的基本操作
3. 熟悉gcc編譯器的基本原理
4. 熟練使用gcc編譯器的常用選項
5 .熟練使用gdb調試技術
6. 熟悉makefile基本原理及文法規範
7. 掌握靜态庫和動态庫的生成
1 Linux指令
如果使用GUI,Linux和Windows沒有什麼差別。Linux學習應用的一個特點是通過指令行進行使用。
登入Linux後,我們就可以在#或$符後面去輸入指令,有的時候指令後面還會跟着
選項
(options)或
參數
(arguments)。即Linux中指令格式為:
command [options] [ arguments ] //中括号代表是可選的,即有些指令不需要選項也不需要參數
選項
是調整指令執行行為的開關,
選項
不同決定了指令的顯示結果不同。
參數
是指指令的作用對象。
如ls指令,
ls
或
ls .
顯示是目前目錄的内容,這裡“.”就是參數,表示目前目錄,是預設的可以省略。我們可以用
ls -a .
顯示目前目錄中的所有内容,包括隐藏檔案和目錄。其中“-a” 就是選項,改變了顯示的内容,如下圖所示:
GCC 的使用
一、GCC編譯器
gcc 支援編譯的一些源檔案字尾名
字尾 | 源檔案 |
.c | C語言源檔案 |
.C .cc .cxx | C++源檔案 |
.m | Object-C源檔案 |
.i | 經過預處理後的C源檔案 |
.ii | 經過預處理後的C++源檔案 |
.s .S | 彙編語言源檔案 |
.h | 預處理檔案(頭檔案) |
.o | 目标檔案 |
.a | 存檔檔案 |
二、使用GCC的四個步驟
- 預處理: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三、GCC支援的檔案類型
GDB的使用
建議使用CGDB,比GDB好用,熟悉VC的調試方式,可以使用DDD。 注意使用GCC編譯時要加“-g”參數。 參考gdb參考卡GDB最基本的指令有
- gdb programm(啟動GDB)
- b 設斷點(要會設4種斷點:行斷點、函數斷點、條件斷點、臨時斷點)
- run 開始運作程式
- bt 列印函數調用堆棧
- p 檢視變量值
- c 從目前斷點繼續運作到下一個斷點
- n 單步運作
- s 單步運作
- quit 退出GDB
問題:GDB的n(next)指令讓GDB執行下一行,然後暫停。 s(step)指令的作用與此類似,隻是在函數調用時step指令會進入函數,那麼實際使用中應該優先選用哪個?為什麼?
其他幾個我認為應該掌握的調試指令有:
- display 跟蹤變量值的改變
- until 跳出循環
- finish 跳出函數
- help 幫助
- gdb常用代碼指令
- $gdb
- 這樣可以和gdb進行互動了。
- *啟動gdb,并且分屏顯示源代碼:
- $gdb -tui
- 這樣,使用了'-tui'選項,啟動可以直接将螢幕分成兩個部分,上面顯示源代碼,比用list友善多了。這時候使用上下方向鍵可以檢視源代碼,想要指令行使用上下鍵就用[Ctrl]n和[Ctrl]p.
- *啟動gdb調試指定程式app:
- $gdb app
- 這樣就在啟動gdb之後直接載入了app可執行程式,需要注意的是,載入的app程式必須在編譯的時候有gdb調試選項,例如'gcc -g app app.c',注意,如果修改了程式的源代碼,但是沒有編譯,那麼在gdb中顯示的會是改動後的源代碼,但是運作的是改動前的程式,這樣會導緻跟蹤錯亂的。
- *啟動程式之後,再用gdb調試:
- $gdb
- 這裡,是程式的可執行檔案名,是要調試程式的PID.如果你的程式是一個服務程式,那麼你可以指定這個服務程式運作時的程序ID。gdb會自動attach上去,并調試他。program應該在PATH環境變量中搜尋得到。
- *啟動程式之後,再啟動gdb調試:
- 這裡,程式是一個服務程式,那麼你可以指定這個服務程式運作時的程序ID,是要調試程式的PID.這樣gdb就附加到程式上了,但是現在還沒法檢視源代碼,用file指令指明可執行檔案就可以顯示源代碼了。
- **啟動gdb之後的互動指令:
- 互動指令支援[Tab]補全。
- *顯示幫助資訊:
- (gdb) help
- *載入指定的程式:
- (gdb) file app
- 這樣在gdb中載入想要調試的可執行程式app。如果剛開始運作gdb而不是用gdb app啟動的話可以這樣載入app程式,當然編譯app的時候要加入-g調試選項。
- *重新運作調試的程式:
- (gdb) run
- 要想運作準備調試的程式,可使用run指令,在它後面可以跟随發給該程式的任何參數,包括标準輸入和标準輸出說明符(<和> )和shell通配符(*、?、[、])在内。
- 參考資料:一、百度百科
- 二、vaqeteart的部落格—常用gdb代碼大全
make工程管理器
-
makefile是make讀入的唯一配置檔案
在一個makefile中通常包含如下内容:
- 需要由make工具建立的目标體(target),通常是目标檔案或可執行檔案。
- 要建立的目标體所依賴的檔案(dependency_file);
-
建立每個目标體時需要運作的指令(command),這一行必須以制表符(Tab鍵)開頭。
格式:
target: dependency_files
command make的指令行
指令格式 | 含義 |
-C dir | 讀入指定目錄下的makefile |
-f file | 讀入目前目錄下的file檔案作為makefile |
-i | 忽略所有的指令執行錯誤 |
-I dir | 指定被包含的makefile所有目錄 |
-n | 隻列印要執行的指令,但不執行這些指令 |
-p | 顯示make變量資料庫和隐含規則 |
-s | 在執行指令時不顯示指令 |
-w | 如果make在執行過程中改變目錄,則列印目前目錄名 |
作業
将實驗樓中的代碼中除了main函數外的代碼制作成一個靜态庫math.a和一個共享庫math.so;
編寫makefile,讓代碼編譯,上述靜态庫和共享庫的使用自動化
建立函數靜态庫cal1.a:
将靜态庫cal1.a連結到main.o中并生成執行檔案cal1并執行
建立函數動态庫cal2.so
将靜态庫cal2.a連結到main.o中并生成執行檔案cal2并執行
建立靜态庫的makefile檔案
運作make管理器生成cal3執行檔案并執行
建立動态庫makefile檔案
運作make管理器生成cal4執行檔案并執行
遇到的問題
設定斷點的問題上還不夠明白
編譯時剛開始總不成功,後來發現是沒有head.h,補上後就沒問題了