天天看點

linux下的C語言程式設計

Linux程式設計基礎知識

Linux下C語言程式設計環境概述 Linux下C語言程式設計常用的編輯器是vim或emacs,編譯器一般用gcc,編譯連結程式用make,跟蹤調試一般使用gdb,項目管理用makefile。

程式安裝目錄

對一個Linux開發人員來說,在使用一種程式設計語言編寫程式以前,對作業系統中程式的儲存位置有一個透徹的了解是很重要的。

Linux下的程式通常都儲存在專門的目錄裡。系統軟體可以在/usr/bin子目錄裡找到。系統管理者為某個特定的主機系統或本地網絡添加的程式可以在/usr/local/bin子目錄裡找到。

頭檔案

對C語言來說,這些頭檔案幾乎永遠儲存在/usr/include及其下級子目錄裡。那些賴于所運作的 UNIX或Linux作業系統特定版本的頭檔案一般可以在/usr/include/sys或/usr/include/linux子目錄裡找到。

在調用C語言編譯器的時候,可以通過給出“ -I”編譯指令标志來引用儲存在下級子目錄或者非标準位置的頭檔案,類似指令如下:

[[email protected] linux]$ gcc -I /usr/openwin/include hello.c

庫檔案

庫檔案是一些預先編譯好的函數的集合,那些函數都是按照可再使用的原則編寫的。

标準的系統庫檔案一般儲存在/lib或者/usr/lib子目錄裡。編譯時要告訴 C語言編譯器(更确切地說是連結程式)應去查找哪些庫檔案。預設情況下,它隻會查找 C語言的标準庫檔案。

gcc編譯器

安裝編譯器:yum -y install gcc

開放、自由和靈活是Linux的魅力所在,而這一點在gcc上的展現就是程式員通過它能夠更好地控制整個編譯過程。 在使用gcc編譯程式時,編譯過程可以細分為4個階段:

● 預處理(Pre-Processing)

● 編譯(Compiling)

● 彙編(Assembling)

● 連結(Linking)

Linux程式員可以根據自己的需要讓gcc在編譯的任何階段結束,檢查或使用編譯器在該階段的輸出資訊,或者對最後生成的二進制檔案進行控制,以便通過加入不同數量和種類的調試代碼來為今後的調試做好準備。

預處理

處理程式中所有帶‘’#‘’的語句,主要的工作:頭檔案的包含和宏的定義。把#include包含進來的頭檔案插入到#include所在的位置,将#define定義的宏用對應的字元串替換。

編譯

檢查代碼是否有文法錯誤。如果有錯,則會報錯,若沒有錯,則會把 .C 檔案編譯成 .S 檔案。

彙編

将所有的 .S 檔案轉化為機器能識别的 .o二進制文 件。

連結

将所有的 .o 檔案和需要的庫檔案連結成一個可執行檔案。

執行個體

建立一個名為3.c的檔案:

linux下的C語言程式設計

要編譯這個程式,隻要在指令行下執行如下指令:

linux下的C語言程式設計

這樣,gcc 編譯器會生成一個名為hello的可執行檔案,然後執行./hello就可以看到程式的輸出結果了。

linux下的C語言程式設計

指令行中 gcc表示用gcc來編譯源程式,-o 選項表示要求編譯器輸出的可執行檔案名為hello ,而hello.c是源程式檔案。從程式員的角度看,隻需簡單地執行一條gcc指令就可以了;

但從編譯器的角度來看,卻需要完成一系列非常繁雜的工作。首先,gcc需要調用預處理程式cpp,由它負責展開在源檔案中定義的宏,并向其中插入#include語句所包含的内容;

接着,gcc會調用ccl和as将處理後的源代碼編譯成目标代碼;最後,gcc會調用連結程式ld,把生成的目标代碼連結成一個可執行程式。

為了更好地了解gcc的工作過程,可以把上述編譯過程分成幾個步驟單獨進行,并觀察每步的運作結果。

第一步要進行預編譯,使用-E參數可以讓gcc在預處理結束後停止編譯過程:

linux下的C語言程式設計

此時若檢視hello.i檔案中的内容,會發現stdio.h的内容确實都插到檔案裡去了,而且被預處理的宏定義也都作了相應的處理。

linux下的C語言程式設計

怎麼來寫Makefile

Makefile的核心是:規則。當執行make指令時,編譯器會讀取目前目錄下的Makefile,然後根據Makefile的規則編譯。規則: 

-------------------------------------------------------------

目标:依賴1 依賴2 … 依賴n

  指令

--------------------------------------------------------------

說明:使用指令,依賴将生成目标       注意:目标在首行頂格寫,而指令前有一個TAB鍵(制表符鍵),不能使用空格代替。

指令執行條件:

1. “依賴”檔案 比 “目标”檔案新(指檔案日期更新)

2. 沒有“目标”這個檔案 滿足上述條件之一,指令就會執行。

根據指令執行條件讓指令再次執行的方法

方法1:用rm指令删除目标檔案test

方法2:用touch指令修改(即更新)a.c b.c a.h,進而使依賴檔案比目标檔案新(指檔案日期更新)。

Linux下C語言的makefile編寫

先來編寫一個最簡單的makefile(其為檔案名)。

首先編寫add.c檔案

linux下的C語言程式設計

再編寫sub.c檔案

linux下的C語言程式設計

最後編寫test.h檔案,

linux下的C語言程式設計

用這三個簡單的檔案,我們就可以編寫檔案makefile的代碼内容了。

test: add.o sub.o

  gcc -o test add.o sub.o

add.o: add.c test.h

  gcc -c add.c //選項 –c 表示隻是編譯(compile)源程式,但并沒有連接配接(link)編譯好的中間目标檔案。

sub.o: sub.c test.h

  gcc -c sub.c

clean: rm -f test *.o //編譯完後,鍵入make clean就會執行這一行語句,即把生成程式test和所有擴充名為.o的目标檔案删掉。

linux下的C語言程式設計

運作make編譯連結程式

linux下的C語言程式設計

檢視輸出結果

linux下的C語言程式設計

轉載于:https://www.cnblogs.com/bfcs/p/10715805.html

繼續閱讀