Linux 下C語言程式設計

2021-06-29 04:24:52 字數 4109 閱讀 9357

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...