Week2學習過程報告

1、學習內容javascript

1. 熟悉Linux系統下的開發環境   
2. 熟悉vi的基本操做   
3. 熟悉gcc編譯器的基本原理   
4. 熟練使用gcc編譯器的經常使用選項   
5 .熟練使用gdb調試技術   
6. 熟悉makefile基本原理及語法規範   
7. 掌握靜態庫和動態庫的生成java

2、學習記錄shell

一、Linux下C語言編程環境概述編程

包含:編輯器(vim)、編譯連接器(gcc)、調試器(gdb)、項目管理器vim

二、vi的模式緩存

1)vi的模式:命令行模式、插入模式、底行模式併發

a.命令行模式:用戶能夠上下移動光標進行刪除字符或者整行刪除等,或進行復制、粘貼等,但沒法編輯文字。編輯器

b.插入模式:用戶能夠進行文字編輯輸入,用戶按[esc]可回到命令行模式。函數

c.底行模式:光標位於屏幕的底行,用戶能夠進行文件保存或退出操做,也能夠設置編輯環境,如尋找字符串、列出行號等。工具

三、vi的基本流程

(1)進入 vi,即在命令行下鍵入「vi hello」(文件名)。此時進入的是命令行模式,光標位於屏幕的上方

(2)在命令行模式下鍵入 i 進入插入模式,如圖 3.3 所示。能夠看出,在屏幕底部顯示有「插入」表示插入模式中的輸入狀態,在該模式下能夠輸入文字信息。

(3)最後,在插入模式中,按「Esc」鍵,則當前模式轉入命令行模式,並在底行行中輸入「:wq」(存盤 退出)進入底行模式,如圖 3.4 所示。
這樣,就完成了一個簡單的 vi 操做流程:命令行模式→插入模式→底行模式。

四、 vi的各模式功能鍵

1)命令行模式功能鍵:

2)插入模式功能鍵:按「Esc」鍵可回到命令行模式 

3)底行模式功能鍵:

:wq!:強制保存並退出

五、gcc編譯器所支持編譯源文件的後綴及其解釋

 

六、gcc 編譯流程解析:預處理、編譯、彙編、連接

Linux的可執行文件並無像 Windows 那樣有明顯的.exe後綴名, 只需向其分配x(可執行)權限便可 sudo chmod u+x excutefile

gcc的-E參數可讓gcc在預處理結束後中止編譯過程。

將hello.i編譯爲目標代碼,gcc默認將.i文件當作是預處理後的C語言源代碼,所以它會直接跳過預處理,開始編譯過程。

gcc預處理源文件的時候(第一步),不會進行語法錯誤的檢查。語法檢查會在第二步進行,好比花括號不匹配、行末尾沒有分號、關鍵字錯誤等。

1)預處理階段:在該階段,對包含的頭文件(#include)和宏定義(#define、#ifdef 等)進行處理。在上述代碼的預處理過 程中,編譯器將包含的頭文件 stdio.h 編譯進來,而且用戶可使用 gcc 的選項「-E」進行查看,該選項的 做用是讓 gcc 在預處理結束後中止編譯過程。

例如:[root@localhost gcc]# gcc –E hello.c –o hello.i

選項「-o」是指目標文件,「.i」文件爲已通過􏰄處理的 C 程序。

(gcc 指令的通常格式爲:gcc [選項] 要編譯的文件 [選項] [目標文件] 其中,目標文件可缺省,gcc 默認生成可執行的文件,名爲:編譯文件.out)

2)編譯階段:接下來進行的是編譯階段,在這個階段中,gcc 首先要檢查代碼的規範性、是否有語法錯誤等,以肯定代碼實際要作的工做,在檢查無誤後,gcc 把代碼翻譯成彙編語言。用戶可使用「-S」選項來進行查看, 該選項只進行編譯而不進行彙編,結果生成彙編代碼。 

[root@localhost gcc]# gcc –S hello.i –o hello.s 

3)彙編階段:彙編階段是把編譯階段生成的「.s」文件轉成目標文件,讀者在此使用選項「-c」就可看到彙編代碼已轉化爲「.o」的二進制目標代碼了。 

[root@localhost gcc]# gcc –c hello.s –o hello.o 

4)連接階段:在成功編􏰂以後,就進入了連接􏰁段。 系統把函數的實現都放到名爲 libc.so.6 的庫文件中去了,在沒有特別指定時, gcc 會到系統默認的搜索路徑「/usr/lib」下進行查找,也就是連接到 libc.so.6 􏰃數庫中去,這樣就能􏰇使用各種函數了,而這也正是連接的做用。 

􏰃函數庫有􏰈靜態庫和動態庫兩種。靜􏰈態庫是指編􏰂譯連接時,將庫文件的代碼所有加入可執行文件中,所以生成的文件比較大,但在運行時也就再也不須要庫文件了。其後􏰉名一般爲「.a」。動態庫與之相反,在編譯􏰂連接時並無將庫文件的代碼加入可執行文件中,而是在程序執行時加載庫,這樣能夠節省系統的開銷。通常動態庫的後􏰉名爲「.so」,如前面所述的 libc.so.6 就是動態庫。gcc 在編譯時默認使用動態庫。 完成了連接以後,gcc 就能夠生成可執行文件。

[root@localhost gcc]# gcc hello.o –o hello 

[root@localhost gcc]# ./hello 

七、gcc 編􏰂譯選項 

gcc 有超過 100 個可用選項,主要包括整體選項􏰋􏰌和出錯選項、優化選項和體系結構相關選項。

(1)經常使用選項

a.「-I dir」:「-I dir」選項能夠在頭文件的搜索路徑列表中添加 dir 目錄。因爲 Linux 中頭文件都默認 放到了「/usr/include/」目錄下,所以,當用戶但願添加放置在其餘位置的頭文件時,就能夠經過「-I dir」 選項來指定,這樣,gcc 就會到相應的位置查找對應的目錄。 

好比在「/root/workplace/gcc」下有兩個文件,可在 gcc 命令行中加入「-I」選項:

[root@localhost gcc]# gcc hello1.c –I /root/workplace/gcc/ -o hello1 

gcc 就可以執行出正確結果 。

(在 include 􏰶􏰷中,􏰸<>􏰹表􏰺在􏰔􏰻􏰼􏰽中􏰾􏰿􏱀文件,􏰸􏰸􏰹􏰹表􏰺在本目 小知識 錄中􏰾􏰿。􏱁在上􏱂中,可把 hello1.c 的􏰸#include<my.h>􏰹改成􏰸#include 「my.h」􏰹,

􏱃不須要加上􏰸-I􏰹選􏰑了。)

(2)庫選項

 

在 Linux 中的每 個程序都會連接到一個或者多個庫,函數庫有􏰈態庫和動態庫兩種,􏰈態庫是一系列的目標文件(.o 文件)的歸􏰣文件(文件名格式爲 libname.a),若是在編􏰂某個程序時連接􏰈態庫,則連接器將會搜索􏰈態庫,從中􏱜取出它所須要的目標 文件並直接複製到該程序的可執行二進制文件(ELF 格式文件)之中;動態庫(文件名格式爲 libname.so[.主 版本號.次版本號.發行號])在程序編􏰂時並不會被連接到目標代碼中,而是在程序運行時才被載入。 

咱們所編寫的.c文件均可以製做一個􏰃函數庫。過程以下:

 a.靜態庫的建立和使用

使用歸檔工具ar將一些目標文件集成在一塊兒。例如:

[root@localhost lib]# gcc -c haha.c

[root@localhost lib]# ar rcsv libpow.a haha.o

a - haha.o

下面編譯主程序,它將會連接到剛生成的靜態庫haha.a:

[root@localhost lib]# gcc -o heihei heihei.c -L. -lpow

[root@localhost lib]# ./heihei 2 10

2^10=1024

其中,選項「-L dir」的功能與「-I dir」相似,可以在庫文件的搜索路徑列表中添加 dir 目錄,而「-lname」 選項指示編譯􏰂時連接到庫文件 libname.a 或者 libname.so。本實例中,程序heihei.c 須要使用當前目錄下的一個靜􏰈態庫 libpow.a。

b.動態庫的建立和使用

數顯使用gcc的-fPIC選項爲動態庫創造一個目標文件:

[root@localhost lib]# gcc -fPIC -Wall -c haha.c

接下來使用-shared選項和已建立的位置無關目標代碼,生成一個動態庫libpow.so

[root@localhost lib]#  gcc -shared -o libpow.so haha.o

下面編譯主程序,它將會連接到剛生成的動態庫libpow.so

[root@localhost lib]# gcc -o heihei heihei.c -L. -lpow

在運行可執行程序以前,須要註冊動態庫的路徑名。其方法有幾種:修改/etc/ld.so.conf 文件,或者修改 LD_LIBRARY_PATH 環境􏰦變量,或者將庫文件直接複製到/lib 或者/usr/lib 目錄下(這兩個目錄爲系統的默認的庫路徑名)。 

[root@localhost lib]# op libpow.so /lib

[root@localhost lib]# ./heihei 2 10

2^10=1024

動態庫只有當使用它的程序執行時才被連接使用,而不是將須要的部分直接編􏰂入可執行文件中,而且一 個動態庫能夠被多個程序使用故可稱爲共享庫,而􏰈靜態庫將會整合到程序中,所以在程序執行時不用加載靜態庫。 從而可知,連接到􏰈靜態庫會使用戶的程序􏰧􏰨,而且難以升級,可是可能會比較容易部署􏰩。而 連接到動態庫會使用戶的程序輕便,而且易於升級,可是會難以部署􏰩。

(3)告警和出錯選項

a.「-ansi」

該選項強制 gcc 生成標準語法所要求的􏰋􏰌告警信息,儘管這還並不能保證全部沒有警告􏰌􏰋的程序都是符合 ANSI C 標準的。沒法發現無效數據類型的錯誤。如(long long)

b.「-pedantic」

打􏰵印ANSI C標準所列出的所有警告􏰌􏰋信息,一樣也保證全部沒有警告􏰌􏰋的程序都是符合ANSI C標準的。 可以查出無效數據類型的錯誤。

c.

「-Wall」
打􏰵印gcc 可以􏱜供的全部有用的􏲙􏰌報警信息。 可以找出未使用的變量,但不能找出無效數據類型的錯誤。

另外,gcc 還能夠利用選項對單獨的常見錯誤分別指定警告􏰌􏰋。

(4)優化選項

gcc 能夠對代碼進行優化,它經過編􏰂選項「-On」來􏱎制優化代碼的生成,其中 n 是一個表明優化級別的整數。對於不一樣版本的 gcc 來說,n 的取值􏰝􏵙範圍及其對應的優化效果可能並不徹底相同,比較􏵚典型的􏰝􏵙是從0變化到2或3。 

不一樣的優化級別對應不一樣的優化處理工做。如使用優化選項「-O」主要進行線程􏱆跳轉(Thread Jump)和􏱇 􏱈延遲退棧(Deferred Stack Pops)兩種優化。使用優化選項「-O2」除了完成全部「-O1」級別的優化以外,同時還要進行一些􏱊額外的􏰇調整工做,如處理器指令􏰇度等。選項「-O3」則還包括循環展開和其餘一些與處理器特性相關的優化工做。 

(5)體系結構相關選項 

 

 

八、gdb調試器

gdb 調試器是一款 GNU 開發組織併發布的 UNIX/Linux 下的程序􏰇調試工具。

它能夠實現:

  1. 啓動程序,能夠按照用戶自定義的要求爲所欲爲的運行程序。
  2. 可以讓被調試的程序在用戶所指定的調試的斷點處停住 (斷點能夠是條件表達式)。
  3. 當程序停住時,能夠檢查此時程序中所發生的事。
  4. 動態地改變程序的執行環境。
  5. 從上面來看,gdb和通常的調試工具區別不大,基本上也是完成這些功能,不過在細節上,會發現gdb這個調試工具的強大。你們可能習慣了圖形化的調試工具,但有時候,命令行的調試工具卻有着圖形化工具所不能完成的功能。­­­­­­­­­­­­­­­­­­­­­­­­­­­

(1) $ gdb testgdb <---------- 啓動gdb

(gdb) break 16 <-------------------- 設置斷點,在源程序第16行處。

(gdb) break func <-------------------- 設置斷點,在函數func()入口處。

(gdb) info break <-------------------- 查看斷點信息。

(gdb) r <--------------------- 運行程序,run命令簡寫

(gdb) n <--------------------- 單條語句執行,next命令簡寫。

(gdb) c <--------------------- 繼續運行程序,continue命令簡寫。 Continuing.

(gdb) p i<--------------------- 打印變量i的值,print命令簡寫。

(gdb) bt <--------------------- 查看函數堆棧。

(gdb) finish <--------------------- 退出函數。

(gdb) c <--------------------- 繼續運行。

(gdb) q <--------------------- 退出gdb。

(2)gdb主要調試的是C/C++的程序。要調試C/C++的程序,首先在編譯時,必需要把調試信息加到可執行文件中。使用編譯器(cc/gcc/g++)的 -g 參數便可。例如:

$ gcc -g hello.c -o hello

$ g++ -g hello.cpp -o hello

若是沒有-g,將看不見程序的函數名和變量名,代替它們的全是運行時的內存地址。當用-g把調試信息加入,併成功編譯目標代碼之後,看看如何用gdb來調試。

啓動gdb的方式以下:

  1. gdb <program> program也就是執行文件,通常在當前目錄下。
  2. gdb <program> core 用gdb同時調試一個運行程序和core文件,core是程序非法執行後,core dump後產生的文件。
  3. gdb <program> <PID> 若是程序是一個服務程序,那麼能夠指定這個服務程序運行時的進程ID。gdb會自動attach上去,並調試它。program應該在PATH環境變量中搜索獲得。 gdb啓動時,能夠加上一些gdb的啓動開關,詳細的開關能夠用gdb -help查看。下面只列舉一些比較經常使用的參數: -symbols <file> -s <file> 從指定文件中讀取符號表。 -se file 從指定文件中讀取符號表信息,並把它用在可執行文件中。 -core <file> -c <file> 調試時core dump的core文件。 -directory <directory> -d <directory> 加入一個源文件的搜索路徑。默認搜索路徑是環境變量中PATH所定義的路徑。

九、makefile

$ vim Makefile

有了這個Makefile,不論何時修改源文件,只要執行一下make命令,全部必要的從新編譯將自動執行。make程序利用Makefile中的數據,生成並遍歷以test爲根節點的樹;

test(目標文件):prog.o code.o(依賴文件列表)

   tab(至少一個tab的位置) gcc prog.o code.o -o test(命令)

  .......

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

一個目標,即make最終須要建立的文件,如可執行文件和目標文件;

目標也能夠是要執行的動做,如‘clean’;

一個或多個依賴文件的列表,一般是編譯目標文件所須要的其餘文件。

以後的一系列命令,是make執行的動做,一般是把指定的相關文件編譯成目標文件的編譯命令,每一個命令佔一行,並以tab開頭(初學者務必注意:是tab,而不是空格)

執行以上Makefile後就會自動化編譯

如:

$ make

gcc -c prog.c -o prog.o

gcc -c code.c -o code.o

gcc prog.o code.o -o test

最後就會多產生: porg.o code.o test這三個文件,執行./test查看結果

make clean會執行rm -f *.o test這條命令,完成 clean 操做。

Makefile還能夠定義和使用宏(也稱作變量),從而使其更加自動化,更加靈活,在Makefile中定義宏的格式爲:

macroname = macrotext

使用宏的格式爲:

$(macroname)

================================================================

實驗樓操做筆記:

一、從教程vimtutor中退出只需輸入":q!"

二、h:光標左移,l:光標右移,j:光標下行,k:光標上行

三、x:刪除光標處字符

四、i:在光標處前一個位置插入字符

五、esc:恢復爲正常狀態

六、a:在光標位置輸入文本

七、wq:保存文本後並退出

八、dw:刪除以光標所在位置開頭的單詞

九、d$:刪除從光標處直至末尾的部分文本

十、刪除講解:

十一、dd:刪除一整行;2dd:刪除兩整行

12:u:撤銷上一次操做;U:撤銷一整行所有操做;Ctrl-R:撤銷撤銷動做

1三、dd刪除後的句子會緩存至vim中,用p在欲插入粘貼的位置上方課將上一次剪切的句子貼入

1四、r:用光標指向修改部位,r,而後輸入欲改成的字符。完成替換

1五、c$:更正至光標位置起到句末的部分

1六、shift-g:跳轉至指定行;Ctrl-g:查看文件信息和當前信息

1七、/+字符:自動在文本中向下搜索關鍵詞,?+字符:自動在文本中向上搜索關鍵詞,n向後繼續查找。Shift-n爲向上查找。

1八、%:括號匹配查看

1九、:s/old/new:用new替換文本中第一個相符字符串;:s/old/new/g:替換整行中的相符字符串;#,#s/old/new/g:替換兩行間的匹配串;:%s/old/new/g:替換整個文件中的匹配串;:%s/old/new/gc:進行全文替換時需詢問用戶確認

20、Shift+zz:保存退出vim

2一、行間轉換:

 

2二、行內轉換:

2三、~:將小寫字母變爲大寫

2四、複製粘貼和剪切:

2五、ddp:交換上下行

2六、替換和撤銷:

2七、使用命令進行快速調整縮進操做

2八、shiftwidth命令

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

:set shiftwidth?查看縮進值默認值;:set shiftwidth=n設置縮進值

2九、設置文本位置

命令行模式下輸入:ce(center)命令使本行內容居中

命令行模式下輸入:ri(right)命令使本行文本靠右

命令行模式下輸入:le(left)命令使本行內容靠左

30、高級查找

3一、同時建立兩個新文件並編輯:$ vim 1.txt 2.txt

默認進入1.txt文件的編輯界面

進入vim後打開新文件

恢復文件:vim -r進入文檔後,輸入:ewcover 1.txt

3一、可視模式選取

3二、視窗操做

:new 打開一個新的vim視窗,並進入視窗編輯一個新文件

3三、文檔加密:$ vim -x file1

3四、在vim執行外部命令:在命令行模式中輸入!能夠執行外部的shell命令

3五、vim中的查看幫助

3六、vim的功能設定:能夠在編輯文件的時候進行功能設定,如命令行模式下輸入:set nu(顯示行數),設定值退出vim後不會保存。要永久保存配置須要修改vim配置文件。 vim的配置文件~/.vimrc,能夠打開文件進行修改,不過務必當心不要影響vim正常使用

3七、獲取目前的設定

3八、set功能的說明

3九、vim進入編譯器後並不會打開任何文件,可是能夠經過:e 文件路徑進入某指定文件

40、I:在行首插入

4一、A:在行末插入

4二、o:在當前行後插入一個新行;O:在當前行前插入一個新行

4三、X:刪除遊標所在前一個字符

4四、d^:刪除至行首

4五、dG:刪除到文檔結尾處;dlG刪除至文檔首部

4六、.表示重複上一次的命令操做

4七、Ctrl+o:跳轉回上次光標的位置

 

=============================================

遇到的問題:

一、在vim教程中,想練習:wq保存文件後退出時,老是將命令錯誤輸入在以下圖的小框內,而後後來使用:q!退出小框後再次輸入:wq<Enter>後就成功了。

二、在Linux實驗GCC的使用這一節中,最後讓咱們試編譯hello.h、hello_print.c、hello_main.c三個文件時,輸入$gcc hello_print.c hello_main.c -o hello會報錯,以下圖:

我嘗試在hello_main.c中加入#include<stdio.h>,再也不報錯。可是卻沒有輸出「Hello,Shi-Yan-Lou」。

後來我刪掉了以上修改,從新編譯,卻又不報錯了。我以爲很奇怪。並且也依舊沒有輸出。

三、makefile中按照實驗指導操做卻老是有報錯,沒法得出自動編譯結果,頻頻出現「未定義調用myfun()"這樣的提示。

相關文章
相關標籤/搜索