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的文件:
要編譯這個程序,只要在命令行下執行如下命令:
這樣,gcc 編譯器會生成一個名為hello的可執行文件,然後執行./hello就可以看到程序的輸出結果了。
命令行中 gcc表示用gcc來編譯源程序,-o 選項表示要求編譯器輸出的可執行文件名為hello ,而hello.c是源程序文件。從程序員的角度看,只需簡單地執行一條gcc命令就可以了;
但從編譯器的角度來看,卻需要完成一系列非常繁雜的工作。首先,gcc需要調用預處理程序cpp,由它負責展開在源文件中定義的宏,並向其中插入#include語句所包含的內容;
接著,gcc會調用ccl和as將處理後的源代碼編譯成目標代碼;最後,gcc會調用鏈接程序ld,把生成的目標代碼鏈接成一個可執行程序。
為了更好地理解gcc的工作過程,可以把上述編譯過程分成幾個步驟單獨進行,並觀察每步的運行結果。
第一步要進行預編譯,使用-E參數可以讓gcc在預處理結束後停止編譯過程:
此時若查看hello.i文件中的內容,會發現stdio.h的內容確實都插到文件裏去了,而且被預處理的宏定義也都作了相應的處理。
怎麽來寫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文件
再編寫sub.c文件
最後編寫test.h文件,
用這三個簡單的文件,我們就可以編寫文件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的目標文件刪掉。
運行make編譯鏈接程序
查看輸出結果
linux下的C語言程序設計