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) $ 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的方式以下:
九、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 -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()"這樣的提示。