實驗二 Linux下C語言編程基礎
一、實驗目的
1. 熟悉Linux系統下的開發環境
2. 熟悉vi的基本操作
3. 熟悉gcc編譯器的基本原理
4. 熟練使用gcc編譯器的常用選項
5 .熟練使用gdb調試技術
6. 熟悉makefile基本原理及語法規范
7. 掌握靜態庫和動態庫的生成
二、實驗步驟
1. 快捷鍵
Ubuntu中:
2. vim
VIM是一個非常好的文本編輯器,很多專業程序員使用VIM編輯代碼,即使以后你不編寫程序,只要跟文本打交道,都應該學學VIM,可以瀏覽參考一下普通人的編輯利器——Vim。
VIM學習曲線非常陡峭,各種編輯器學習曲線如下圖(有調侃的意思):
VI來說,一開始就需要相當大的技能,但一旦掌握這些技能,則你將會越來越熟練,這跟五筆打字很類似。我們建議通過實踐練習來學習具體來說通過VIMTUTOR或玩游戲(Vim大冒險或PacVim)來學習。
VIMTUTOR是個實踐教程,通過實踐30分鍾讓你對VIM編輯器入門,只要在命令行中輸入vimtutor,然后跟着教程練習就可以了。如下圖:
然后你可以把這張圖做計算機的桌面背景,每天學習一兩個鍵:
想當程序員用這張專門給程序員的鍵盤圖:
程序員有幾個鍵提示一下:
- 大寫“K”可以用來查找函數的幫助信息:查看 man page,命令模式下,將光標放在函數名上,按"K"可以直接察看 man page。
- 幾個設置
:set nu 顯示行號
:set ai 自動縮行
:set ts=4 設置一個 TAB 鍵等於幾個空格
- 移動光標
[[ 轉到上一個位於第一列的"{"
]] 轉到下一個位於第一列的"{"
{ 轉到上一個空行
} 轉到下一個空行
gd 轉到當前光標所指的局部變量的定義
深入學習參考:
- 簡明 Vim 練級攻略
- 七個高效的文本編輯習慣(以Vim為例)(視頻)
- 所需即所獲:像 IDE 一樣使用 vim
- VIM教程與學習資料匯總
3. gcc
GNU CC(簡稱為gcc)是GNU項目中符合ANSI C標准的編譯系統,能夠編譯用C、C++和Object C等語言編寫的程序。gcc又是一個交叉平台編譯器,它能夠在當前CPU平台上為多種不同體系結構的硬件平台開發軟件,因此尤其適合在嵌入式領域的開發編譯。
GCC編譯代碼的過程如下:
我們可以把編譯過程分成四步,以編譯hello.c生成可執行文件hello為例,如下圖:
- 預處理: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的參數連起來是“ESc”,相應輸入的文件的后綴是“iso”,這樣記憶起來就容易多了。
學習GCC的另外一個重點是:參考教材《深入理解計算機系統》 7.6,7.10節,學習靜態庫,動態庫的制作。
4. 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 幫助
學習參考:
5. make與makefile
三、練習
1.練習vimtutuor至少一遍;
2.使用vim 輸入以下代碼,聯系使用“K”查找幫助文檔:
3.練習gcc編譯運行代碼;
4.練習gdb調試代碼;
5.把上述代碼中除了main函數外的代碼制作成一個靜態庫math.a和一個共享庫math.so;
6.編寫makefile,讓代碼編譯,上述靜態庫和共享庫的使用自動化。
實驗遇到的問題:
在gcc的編譯過程中器匯編處理出現了問題。
加入了main函數也沒有成功。導致后續實驗無法成功。
實驗心得:
剛開始學習還是有些吃力。加上以前基礎也不好,任重道遠。好好努力,希望能盡快熟悉linux系統。
大三了自己也希望大學能夠學習東西。