Linux下用C语言最基本的程序开发与调试
1.建一個目錄
2.寫代碼,建一個hello.c文件
代碼:
view plaincopy to clipboardprint?- #include?"stdio.h" ??
- main()??
- {??
- printf("Hello?Linux.\n")??
- }??
#include "stdio.h"
main()
{
printf("Hello Linux.\n")
}?
記得最后一定要換行
?
3.編譯
gcc?-o?hello?hello.c
使用gcc?編譯器就會為我們生成一個hello的可執行文件
?
4.輸出
執行./hello就可以看到程序的輸出
結果了.
?
是不是很簡單?
?
命令行中?gcc表示我們是用gcc來編譯我們的源程序,-o?選項表示我們要求編譯
器給我們輸出的可執行文件名為hello?而hello.c是我們的源程序文件.
gcc編譯器有許多選項,一般來說我們只要知道其中的幾個就夠了.?-o選項我們已經知道
了,表示我們要求輸出的可執行文件名.?-c選項表示我們只要求編譯器輸出目標代碼,而
不必要輸出可執行文件.?-g選項表示我們要求編譯器在編譯的時候提供我們以后對程序
進行調試的信息.
知道了這三個選項,我們就可以編譯我們自己所寫的簡單的源程序了,如果你想要知道更
多的選項,可以查看gcc的幫助文檔,那里有著許多對其它選項的詳細說明.
下面我們來演示怎樣用GDB來調試一個求0+1+2+3+…+99的程序:
/* Filename:hello.c */ #include "stdio.h" |
執行如下命令編譯hello.c(加-g選項產生debug信息):
#gcc –g –o?hello sum.c
在命令行上鍵入gdb hello并按回車鍵就可以開始調試sum了,再運行run命令執行sum
#gdb hello
list命令用于列出源代碼,對上述程序兩次運行list,將出現如上畫面(源代碼被標行號)。
根據列出的源程序,如果我們將斷點設置在第5行,只需在gdb 命令行提示符下鍵入如下命令設置斷點:(gdb) break 5
設置斷點的另一種語法是 break <function>,它在進入指定函數(function)時停住。
相反的,clear用于清除所有的已定義的斷點,clear <function>清除設置在函數上的斷點, clear <linenum>則清除設置在指定行上的斷點。
watch命令:
watch命令用于觀查變量或表達式的值,我們觀查sum變量只需要運行watch sum
watch <expr>為表達式(變量)expr設置一個觀察點,一量表達式值有變化時,程序會停止執行。
要觀查當前設置的watch,可以使用info watchpoints命令。
next、step命令:
next、step用于單步執行,在執行的過程中,被watch變量的變化情況將實時呈現(分別顯示Old value和New value)
next、step命令的區別在于step遇到函數調用,會跳轉到到該函數定義的開始行去執行,而next則不進入到函數內部,它把函數調用語句當作一條普通語句執行。
make是所有想在Linux系統上編程的用戶必須掌握的工具,對于任何稍具規模的程序,我們都會使用到make,幾乎可以說不使用make的程序不具備任何實用價值。
在此,我們有必要解釋編譯和連接的區別。編譯器使用源碼文件來產生某種形式的目標文件(object files),在編譯過程中,外部的符號參考并沒有被解釋或替換(即外部全局變量和函數并沒有被找到)。因此,在編譯階段所報的錯誤一般都是語法錯誤。而連接器則用于連接目標文件和程序包,生成一個可執行程序。在連接階段,一個目標文件中對別的文件中的符號的參考被解釋,如果有符號不能找到,會報告連接錯誤。
編譯和連接的一般步驟是:第一階段把源文件一個一個的編譯成目標文件,第二階段把所有的目標文件加上需要的程序包連接成一個可執行文件。這樣的過程很痛苦,我們需要使用大量的gcc命令。
而make則使我們從大量源文件的編譯和連接工作中解放出來,綜合為一步完成。GNU Make的主要工作是讀進一個文本文件,稱為makefile。這個文件記錄了哪些文件(目的文件,目的文件不一定是最后的可執行程序,它可以是任何一種文件)由哪些文件(依靠文件)產生,用什么命令來產生。Make依靠此makefile中的信息檢查磁盤上的文件,如果目的文件的創建或修改時間比它的一個依靠文件舊的話,make就執行相應的命令,以便更新目的文件。
假設我們寫下如下的三個文件,add.h用于聲明add函數,add.c提供兩個整數相加的函數體,而main.c中調用add函數:
| /* filename:add.h */ extern int add(int i, int j); /* filename:add.c */ int add(int i, int j) { return i + j; } /* filename:main.c */ #include "add.h" main() { int a, b; a = 2; b = 3; printf("the sum of a+b is %d", add(a + b)); } |
怎樣為上述三個文件產生makefile呢?如下:
| test : main.o add.o gcc main.o add.o -o test main.o : main.c add.h gcc -c main.c -o main.o add.o : add.c add.h gcc -c add.c -o add.o |
上述makefile利用add.c和add.h文件執行gcc -c add.c -o add.o命令產生add.o目標代碼,利用main.c和add.h文件執行gcc -c main.c -o main.o命令產生main.o目標代碼,最后利用main.o和add.o文件(兩個模塊的目標代碼)執行gcc main.o add.o -o test命令產生可執行文件test。
我們可在makefile中加入變量,另外。環境變量在make過程中也被解釋成make的變量。這些變量是大小寫敏感的,一般使用大寫字母。Make變量可以做很多事情,例如:
i) 存儲一個文件名列表;
ii) 存儲可執行文件名;
iii) 存儲編譯器選項。
要定義一個變量,只需要在一行的開始寫下這個變量的名字,后面跟一個=號,再跟變量的值。引用變量的方法是寫一個$符號,后面跟(變量名)。我們把前面的 makefile 利用變量重寫一遍(并假設使用-Wall -O –g編譯選項):
| OBJS = main.o add.o CC = gcc CFLAGS = -Wall -O -g test : $(OBJS) $(CC) $(OBJS) -o test main.o : main.c add.h $(CC) $(CFLAGS) -c main.c -o main.o add.o : add.c add.h $(CC) $(CFLAGS) -c add.c -o add.o |
makefile 中還可定義清除(clean)目標,可用來清除編譯過程中產生的中間文件,例如在上述makefile文件中添加下列代碼:
| clean: rm -f *.o |
運行make clean時,將執行rm -f *.o命令,刪除所有編譯過程中產生的中間文件。
不管怎么說,自己動手編寫makefile仍然是很復雜和煩瑣的,而且很容易出錯。因此,GNU也為我們提供了Automake和Autoconf來輔助快速自動產生makefile,讀者可以參閱相關資料。
7.小結
本章主要闡述了Linux程序的編寫、編譯、調試方法及make,實際上就是引導讀者學習怎樣在Linux下編程,為后續章節做好準備。
參考:
Linux下的C編程實戰之開發平臺搭建
http://dev.yesky.com/474/7596974.shtml
Linux系統下的C語言編程入門:
http://dev.yesky.com/topic/299/7654799.shtml
C語言初學者入門講座
http://www.programfan.com/article/subject1.asp
linux操作系統下c語言編程入門<unix操作系統下同樣適用>
http://www.chinaunix.net/jh/23/56653.html
總結
以上是生活随笔為你收集整理的Linux下用C语言最基本的程序开发与调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄山风景区一般玩几天
- 下一篇: SQL Server 存储过程的分页方案