linux 下c語言程式設計
1.程式設計的概念和理解
1.1程式編譯的過程
在這一操作中,程式完成了複雜的過程。乙個程式的編譯,需要完成詞法分析、語法分析、中間**生成、**優化、目標**生成。
l 詞法分析:指的是對由字元組成的單詞進行處理,從左至右逐個字元地對源程式進行掃瞄,產生乙個個單詞符號。然後把字串的源程式改造成為單詞符號串的中間程式。在編譯程式時,這一過程是自動完成的。編譯程式會對**的每乙個單詞進行檢查。如果單詞發生錯誤,編譯過程就會停止並顯示錯誤。這是需要對程式中的錯誤進行修改。
l 語法分析:語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語句。例如:需要檢查表示式、賦值、迴圈等結構是否完整和符合使用規則。在進行語法分析時,會分析出程式中錯誤的語句,並顯示出結果。如果語法發生錯誤,編譯任務是不能完成的。
l 中間**生成:中間**是源程式的一種內部表示,或稱中間語言。程式進行詞法分析和語法分析以後,將程式轉換成中間**。這一轉換的作用是使應用程式的結構更加簡單和規範。中間**生成操作是乙個中間過程,與使用者無關。
l **優化:指對程式進行多種等價變換,使得從變換後的程式能生成更有效的目標**。使用者可以在編譯程式時設定**優化的引數,可以針對不同的環境和設定進行優化。
l 目標**生成:指的是產生可以執行的應用程式,這是編譯的最後乙個步驟。生成的程式是二進位制的機器語言,使用者只能執行這個程式,而不能開啟這個檔案檢視程式的**。
1.2編譯器
編譯器是將編寫出的程式**轉換成計算機可以執行的程式的軟體。在進行c程式開發時,編寫出的**是源程式是**,是不能直接執行的。需要用編譯器編譯為可以執行的二進位制程式。
在不同的作業系統下面有不同的編譯器。c程式是可以跨平台執行的。但並不是說windows系統下c語言編寫的程式可以直接在linux下面執行。windows下面用c語言編寫的程式,被編譯成exe檔案,這樣的程式只能在windows系統下執行。如果在linux系統下執行,需要將這個程式的源**在linux系統下重新編譯。不同的作業系統下面有不同的編譯器。linux下面編譯生成的程式是不能在windows系統上執行的。
2.gcc編譯器
gcc是linux下能用的c程式編譯器,具有非常強大的程式編譯功能。在linux系統下,c語言編寫的程式**一般要通過gcc編譯成可執行程式。
2.1.gcc編譯器的簡介
2.2.gcc對源程式副檔名的支援
副檔名指的是檔名中最後乙個點以後的部分。
.c為副檔名的檔案,為c語言源**檔案。
.a為副檔名的檔案,是由目標檔案構成的庫檔案。
.c、.cc、.cpp為副檔名的檔案,標識為c++源**檔案。
.h為副檔名的檔案,說明檔案是程式所包含的標頭檔案。
.i為副檔名的檔案,標識檔案是已經預處理過的c源**檔案,一般為中間**檔案。
.ii為副檔名的檔案,標識檔案是已經預處理過的c++源**檔案,一般為中間**檔案。
.o為副檔名的檔案,是編譯後的目標檔案,原始檔生成的中間目標檔案。
.s為副檔名的檔案,是組合語言源**檔案。
.s為副檔名的檔案,是經過預編譯的組合語言源**檔案。
3.c語言的編譯
3.1. 編寫乙個c程式
用vim編寫乙個c程式:vim a.c
3.2. 用gcc編譯程式
輸入命令gcc a.c ,會生成乙個a.out檔案
用命令chmod +x a.out 對這個程式新增可執行許可權。
輸入命令./a.out 執行這個程式
3.3. 檢視gcc的引數
查表 --help
-o常用
4.編譯過程的控制
編譯過程指的是gcc對乙個程式進行編譯時完成的內部處理和步驟。編譯程式時會自動完成預處理(preprocessing)、編譯(compilation)、彙編(assembly)和鏈結(linking)四個步驟。
4.1. 編譯過程簡介
gcc把乙個程式的原始檔,編譯成乙個可執行檔案,中間包括很多複雜的過程。可以用圖來表示編譯中四個步驟的作用和關係。
? 預處理:
? 編譯:
? 彙編:
?
5.gdb除錯程式
所謂除錯,指的是對編好的程式用各種手段進行查錯和排錯的過程。進行這種查錯處理時,並不僅僅是執行一次程式檢查結果,而是對程式的執行過程、程式中的變數進行各種分析和處理。
5.1. gdb 簡介
gdb 是乙個功能強大的除錯工具,可以用來除錯c程式或c++程式。在使用這個工具進行程式除錯時,主要使用gdb進行下面4個方面的操作。
? 啟動程式:在啟動程式時,可以設定程式執行環境。
? 設定斷點:斷點就是可以在程式設計時暫停程式執行的標記。程式會在斷點出停止,使用者便於檢視程式的運**況。這裡的斷點可以是行數、程式名稱或是條件表示式。
? 檢視資訊:在斷點停止後,可以檢視程式的執行資訊和顯示程式變數的值。
? 分步執行:程式可以乙個語句乙個語句的執行,這時可以及時地檢視程式的資訊。
? 改變環境:可以在程式執行時改變程式的執行環境和程式的變數。
5.2. 在程式中加入除錯資訊
為了使用gdb進行程式除錯,需要在編譯程式中加入供gdb使用的除錯資訊。方法是在編譯程式時使用乙個 -g 引數。在終端中輸入下面的命令,在編譯程式時加入除錯資訊。
gcc -g -o a.debug a.c
這時,編譯程式a.c,會生成乙個a.debug的可執行程式。這個可執行程式中加入了供除錯所用的資訊。
5.3. 啟動gdb
在除錯檔案以前,需要啟動gdb。在終端輸入命令gdb開啟
這時,gdb的啟動資訊如下所示。這些提示顯示了gdb的版本和版權資訊。
5.4. 在gdb中載入需要除錯的程式
使用gdb除錯乙個程式之前,需要載入這個程式。引導程式的命令是file。在(gdb)提示符後面輸入下面的命令引導程式a.debug
file a.debug
命令的執行結果如下所示,顯示已經載入了這個檔案,並且使用了系統庫檔案。
5.5. 在gdb中檢視**
用gcc命令編譯程式加入了 -g 命令以後,編譯後的a.debug程式中加入了斷點。可以用list 命令顯示程式的源**和斷點。下面的步驟是檢視加入斷點以後的**。
① 在(gdb)提示符後面輸入下面的命令。
list 1
② 這時,gdb會提示第乙個斷點以前的**。
③ 這時,按「enter」鍵,顯示下乙個斷點以前的**。
④ 按「enter」鍵,顯示下乙個斷點以前的**。
5.6. 在程式中加入斷點
程式會執行到斷點的位置停止下來,等待使用者處理資訊或檢視中間變數。如果自動設定的斷點不能滿足除錯要求,可以用break命令增加程式的斷點。
例如需要在程式第6行增加乙個斷點,可以輸入 下面的命令
break 6
這時gdb顯示的結果如下所示:
在程式的第18行、第19行、第21行增加斷點。
break 18
break 19
break 21
5.7. 檢視斷點
命令「info breakpoint 」可以檢視程式中設定的斷點。
加上相應的斷點編號,可以檢視這個斷點的資訊。
5.8. 執行程式
gdb 中的run 命令可以使這個程式以除錯的模式執行。下面的步驟是分步執行程式,對程式進行除錯。
① 在(gdb)提示符後輸入「run」命令,顯示的結果如下
② 結果顯示了程式中的異常,並將異常記錄到了系統檔案中。然後在程式的第二個斷點的位置第18行停下。
③ 這時輸入「next/step」命令,程式會在下一行停下,結果如下。
④ 輸入「continue」命令,程式會在下乙個斷點的位置停下。
⑤ 輸入「continue」命令,程式執行到結束。結果如下。
注意:「step」命令與「next」命令的作用相似,對程式實現單步執行。不同的是,在遇上函式呼叫時,「step」命令可以進行到函式內部。而「next」命令只是一步完成函式的呼叫。
5.9. 變數的檢視
「print」命令可以在程式的執行中檢視乙個變數的值。
① 程式在第乙個斷點的位置停下。程式進入第18行之前停下,並沒有對i進行賦值。用下面「print i」命令來檢視,結果顯示i現在只是乙個任意值。
Linux下C語言程式設計
include include include include define max 10pthread t thread 2 pthread mutex t mut int number 0 i void thread1 printf thread1 主函式在等我完成任務嗎?n pthread e...
Linux下C語言程式設計概述
linux下的c語言程式設計與在其他環境中的c程式設計一樣,主要涉及到編輯器 編譯鏈結器 偵錯程式及專案管理工具。本篇內容屬於嵌入式學院 嵌入式工程師職業培訓班 一期課程中linux作業系統中的部分內容,這裡我們先對這4種工具進行一下簡單介紹。1 編輯器 linux下的編輯器就如windows下的w...
Linux下C語言程式設計概述
linux下的c語言程式設計與在其他環境中的c程式設計一樣,主要涉及到編輯器 編譯鏈結器 偵錯程式及專案管理工具。本篇內容屬於嵌入式學院嵌入式工程師職業培訓一期課程中linux作業系統中的部分內容,這裡我們先對這4種工具進行一下簡單介紹。1 編輯器 linux下的編輯器就如windows下的word...