青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

chaosuper85

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  118 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

  1.引言

  Linux操作系統(tǒng)在服務(wù)器領(lǐng)域的應用和普及已經(jīng)有較長的歷史,這源于它的開源特點以及其超越Windows的安全性和穩(wěn)定性。而近年來,Linux操作系統(tǒng)在嵌入式系統(tǒng)領(lǐng)域的延伸也可謂是如日中天,許多版本的嵌入式Linux系統(tǒng)被開發(fā)出來,如ucLinux、RTLinux、ARM-Linux等等。在嵌入式操作系統(tǒng)方面,Linux的地位是不容懷疑的,它開源、它包含TCP/IP協(xié)議棧、它易集成GUI。

  鑒于Linux操作系統(tǒng)在服務(wù)器和嵌入式系統(tǒng)領(lǐng)域愈來愈廣泛的應用,社會上越來越需要基于Linux操作系統(tǒng)進行編程的開發(fā)人員。

  瀏覽許多論壇,經(jīng)常碰到這樣的提問:“現(xiàn)在是不是很流行unix/linux下的c編程?所以想學習一下!但是不知道該從何學起,如何下手!有什么好的建議嗎?各位高手!哪些書籍比較合適初學者?在深入淺出的過程中應該看哪些不同層次的書?比如好的網(wǎng)站、論壇請大家賜教!不慎感激!”

  鑒于讀者的需求,在本文中,筆者將對Linux平臺下C編程的幾個方面進行實例講解,并力求回答讀者們關(guān)心的問題,以與讀者朋友們進行交流,共同提高。在本文的連載過程中,有任何問題或建議,您可以給筆者發(fā)送email:21cnbao@21cn.com,您也可以進入筆者的博客參與討論:http://blog.donews.com/21cnbao

  筆者建議在PC內(nèi)存足夠大的情況下,不要直接安裝Linux操作系統(tǒng),最好把它安裝在運行VMWare虛擬機軟件的Windows平臺上,如下圖:

 

  在Linux平臺下,可用任意一個文本編輯工具編輯源代碼,但筆者建議使用emacs軟件,它具備語法高亮、版本控制等附帶功能,如下圖:

 

  2.GCC編譯器

  GCC是Linux平臺下最重要的開發(fā)工具,它是GNU的C和C++編譯器,其基本用法為:

gcc [options] [filenames]

  options為編譯選項,GCC總共提供的編譯選項超過100個,但只有少數(shù)幾個會被頻繁使用,我們僅對幾個常用選項進行介紹。

  假設(shè)我們編譯一輸出“Hello World”的程序:

/* Filename:helloworld.c */
main()
{
printf("Hello World\n");
}

  最簡單的編譯方法是不指定任何編譯選項:

gcc helloworld.c

  它會為目標程序生成默認的文件名a.out,我們可用-o編譯選項來為將產(chǎn)生的可執(zhí)行文件指定一個文件名來代替a.out。例如,將上述名為helloworld.c的C程序編譯為名叫helloworld的可執(zhí)行文件,需要輸入如下命令:

gcc –o helloworld helloworld.c

  -c選項告訴GCC僅把源代碼編譯為目標代碼而跳過匯編和連接的步驟;

  -S 編譯選項告訴GCC 在為 C代碼產(chǎn)生了匯編語言文件后停止編譯。GCC 產(chǎn)生的匯編語言文件的缺省擴展名是.s,上述程序運行如下命令:

gcc –S helloworld.c

  將生成helloworld.c的匯編代碼,使用的是AT&T匯編。用emacs打開匯編代碼如下圖:

 

 


  -E選項指示編譯器僅對輸入文件進行預處理。當這個選項被使用時,預處理器的輸出被送到標準輸出(默認為屏幕)而不是儲存在文件里。

  -O選項告訴GCC對源代碼進行基本優(yōu)化從而使得程序執(zhí)行地更快;而-O2選項告訴GCC產(chǎn)生盡可能小和盡可能快的代碼。使用-O2選項編譯的速度比使用-O時慢,但產(chǎn)生的代碼執(zhí)行速度會更快。

  -g選項告訴GCC產(chǎn)生能被GNU調(diào)試器使用的調(diào)試信息以便調(diào)試你的程序,可喜的是,在GCC里,我們能聯(lián)用-g和-O (產(chǎn)生優(yōu)化代碼)。

  -pg選項告訴GCC在你的程序里加入額外的代碼,執(zhí)行時,產(chǎn)生gprof用的剖析信息以顯示你的程序的耗時情況。

  3.GDB調(diào)試器

  GCC用于編譯程序,而Linux的另一個GNU工具gdb則用于調(diào)試程序。gdb是一個用來調(diào)試C和C++程序的強力調(diào)試器,我們能通過它進行一系列調(diào)試工作,包括設(shè)置斷點、觀查變量、單步等。
其最常用的命令如下:

  file:裝入想要調(diào)試的可執(zhí)行文件。
  kill:終止正在調(diào)試的程序。
  list:列表顯示源代碼。
  next:執(zhí)行一行源代碼但不進入函數(shù)內(nèi)部。
  step:執(zhí)行一行源代碼而且進入函數(shù)內(nèi)部。
  run:執(zhí)行當前被調(diào)試的程序
  quit:終止gdb
  watch:監(jiān)視一個變量的值
  break:在代碼里設(shè)置斷點,程序執(zhí)行到這里時掛起
  make:不退出gdb而重新產(chǎn)生可執(zhí)行文件
  shell:不離開gdb而執(zhí)行shell

  下面我們來演示怎樣用GDB來調(diào)試一個求0+1+2+3+…+99的程序:

/* Filename:sum.c */
main()
{
int i, sum;
sum = 0;
for (i = 0; i < 100; i++)
{
sum + = i;
}

printf("the sum of 1+2+...+ is %d", sum);
}

  執(zhí)行如下命令編譯sum.c(加-g選項產(chǎn)生debug信息):

gcc –g –o sum sum.c

  在命令行上鍵入gdb sum并按回車鍵就可以開始調(diào)試sum了,再運行run命令執(zhí)行sum,屏幕上將看到如下內(nèi)容:

 

  list命令:

  list命令用于列出源代碼,對上述程序兩次運行l(wèi)ist,將出現(xiàn)如下畫面(源代碼被標行號):

 

  根據(jù)列出的源程序,如果我們將斷點設(shè)置在第5行,只需在gdb 命令行提示符下鍵入如下命令設(shè)置斷點:(gdb) break 5,執(zhí)行情況如下圖:

 

  這個時候我們再run,程序會停止在第5行,如下圖:

 

  設(shè)置斷點的另一種語法是 break <function>,它在進入指定函數(shù)(function)時停住。

  相反的,clear用于清除所有的已定義的斷點,clear <function>清除設(shè)置在函數(shù)上的斷點, clear <linenum>則清除設(shè)置在指定行上的斷點。

  watch命令:
   
  watch命令用于觀查變量或表達式的值,我們觀查sum變量只需要運行watch sum:

 

   watch <expr>為表達式(變量)expr設(shè)置一個觀察點,一量表達式值有變化時,程序會停止執(zhí)行。

  要觀查當前設(shè)置的watch,可以使用info watchpoints命令。

  next、step命令:

   next、step用于單步執(zhí)行,在執(zhí)行的過程中,被watch變量的變化情況將實時呈現(xiàn)(分別顯示Old value和New value),如下圖:

 

   next、step命令的區(qū)別在于step遇到函數(shù)調(diào)用,會跳轉(zhuǎn)到到該函數(shù)定義的開始行去執(zhí)行,而next則不進入到函數(shù)內(nèi)部,它把函數(shù)調(diào)用語句當作一條普通語句執(zhí)行。

  4.Make

  make是所有想在Linux系統(tǒng)上編程的用戶必須掌握的工具,對于任何稍具規(guī)模的程序,我們都會使用到make,幾乎可以說不使用make的程序不具備任何實用價值。

  在此,我們有必要解釋編譯和連接的區(qū)別。編譯器使用源碼文件來產(chǎn)生某種形式的目標文件(object files),在編譯過程中,外部的符號參考并沒有被解釋或替換(即外部全局變量和函數(shù)并沒有被找到)。因此,在編譯階段所報的錯誤一般都是語法錯誤。而連接器則用于連接目標文件和程序包,生成一個可執(zhí)行程序。在連接階段,一個目標文件中對別的文件中的符號的參考被解釋,如果有符號不能找到,會報告連接錯誤。

  編譯和連接的一般步驟是:第一階段把源文件一個一個的編譯成目標文件,第二階段把所有的目標文件加上需要的程序包連接成一個可執(zhí)行文件。這樣的過程很痛苦,我們需要使用大量的gcc命令。

  而make則使我們從大量源文件的編譯和連接工作中解放出來,綜合為一步完成。GNU Make的主要工作是讀進一個文本文件,稱為makefile。這個文件記錄了哪些文件(目的文件,目的文件不一定是最后的可執(zhí)行程序,它可以是任何一種文件)由哪些文件(依靠文件)產(chǎn)生,用什么命令來產(chǎn)生。Make依靠此makefile中的信息檢查磁盤上的文件,如果目的文件的創(chuàng)建或修改時間比它的一個依靠文件舊的話,make就執(zhí)行相應的命令,以便更新目的文件。

  假設(shè)我們寫下如下的三個文件,add.h用于聲明add函數(shù),add.c提供兩個整數(shù)相加的函數(shù)體,而main.c中調(diào)用add函數(shù):

/* 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));
}

  怎樣為上述三個文件產(chǎn)生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文件執(zhí)行g(shù)cc -c add.c -o add.o命令產(chǎn)生add.o目標代碼,利用main.c和add.h文件執(zhí)行g(shù)cc -c main.c -o main.o命令產(chǎn)生main.o目標代碼,最后利用main.o和add.o文件(兩個模塊的目標代碼)執(zhí)行g(shù)cc main.o add.o -o test命令產(chǎn)生可執(zhí)行文件test。

  我們可在makefile中加入變量,另外。環(huán)境變量在make過程中也被解釋成make的變量。這些變量是大小寫敏感的,一般使用大寫字母。Make變量可以做很多事情,例如:

  i) 存儲一個文件名列表;
  ii) 存儲可執(zhí)行文件名;
  iii) 存儲編譯器選項。

  要定義一個變量,只需要在一行的開始寫下這個變量的名字,后面跟一個=號,再跟變量的值。引用變量的方法是寫一個$符號,后面跟(變量名)。我們把前面的 makefile 利用變量重寫一遍(并假設(shè)使用-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)目標,可用來清除編譯過程中產(chǎn)生的中間文件,例如在上述makefile文件中添加下列代碼:

clean:
rm -f *.o

  運行make clean時,將執(zhí)行rm -f *.o命令,刪除所有編譯過程中產(chǎn)生的中間文件。

  不管怎么說,自己動手編寫makefile仍然是很復雜和煩瑣的,而且很容易出錯。因此,GNU也為我們提供了Automake和Autoconf來輔助快速自動產(chǎn)生makefile,讀者可以參閱相關(guān)資料。

  5.小結(jié)

  本章主要闡述了Linux程序的編寫、編譯、調(diào)試方法及make,實際上就是引導讀者學習怎樣在Linux下編程,為后續(xù)章節(jié)做好準備。

posted on 2009-08-04 09:01 chaosuper 閱讀(534) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品在线| 欧美裸体一区二区三区| 麻豆亚洲精品| 国产精品久久网| 亚洲午夜精品一区二区| 国产精品99久久久久久有的能看 | 久久久久久久性| 久久精品网址| 欧美激情1区2区3区| 国产精品va在线播放我和闺蜜| 国产精品推荐精品| 伊人色综合久久天天| 亚洲精品国产精品乱码不99 | 99re6这里只有精品视频在线观看 99re6这里只有精品 | 午夜精品久久久久久久| 久久综合狠狠综合久久综青草| 欧美+日本+国产+在线a∨观看| 欧美精品一区二区三区蜜臀 | 9久re热视频在线精品| 亚洲一级特黄| 免播放器亚洲一区| 99亚洲精品| 美女91精品| 国产在线拍揄自揄视频不卡99| 亚洲精品影院在线观看| 久久都是精品| 99亚洲一区二区| 欧美成年人网站| 国产一区二区三区四区在线观看 | 美女91精品| 国产女主播一区| 一区二区欧美日韩| 欧美aa在线视频| 欧美一区二区精品| 国产精品日韩在线一区| 日韩视频免费在线观看| 蜜臀va亚洲va欧美va天堂| 亚洲制服欧美中文字幕中文字幕| 欧美顶级大胆免费视频| 国产中文一区二区三区| 亚洲综合视频1区| 亚洲精品午夜| 欧美黄色成人网| 亚洲日本中文字幕| 欧美激情精品久久久久久蜜臀 | 欧美亚洲一区| 亚洲视频在线观看三级| 欧美日韩三级一区二区| 亚洲国产婷婷综合在线精品| 这里只有精品在线播放| 亚洲成人自拍视频| 久久高清福利视频| 国产精品一区二区在线| 午夜精品一区二区三区在线| 夜夜精品视频| 欧美视频日韩视频在线观看| 99riav国产精品| 亚洲人线精品午夜| 欧美日韩不卡| 在线中文字幕不卡| 一区二区三区日韩精品| 欧美日韩一区二区三区在线视频| 91久久久久久久久| 91久久久国产精品| 欧美日韩国产综合新一区| 在线视频欧美日韩| 亚洲视频一二区| 国产一区二区三区日韩欧美| 老色鬼久久亚洲一区二区| 久久综合激情| 日韩网站免费观看| 亚洲午夜av在线| 国外精品视频| 亚洲国产精品嫩草影院| 欧美午夜三级| 久久久国产一区二区| 开心色5月久久精品| 亚洲另类视频| 亚洲欧美精品伊人久久| 好吊日精品视频| 亚洲日本理论电影| 国产免费成人在线视频| 欧美sm极限捆绑bd| 欧美日韩亚洲一区三区 | 亚洲女人天堂成人av在线| 亚洲一区二区三区在线视频| 韩国av一区二区三区四区| 亚洲经典在线看| 国产亚洲精品bv在线观看| 亚洲国产精品久久91精品| 国产精品乱码久久久久久| 免播放器亚洲| 国产日韩欧美在线播放不卡| 亚洲国产成人91精品| 国产精品亚洲а∨天堂免在线| 老司机午夜精品视频在线观看| 欧美久久视频| 久久躁狠狠躁夜夜爽| 欧美日韩综合| 欧美国产高潮xxxx1819| 欧美日韩日韩| 欧美 日韩 国产精品免费观看| 国产精品成人一区二区三区夜夜夜 | 亚洲欧美久久| 好男人免费精品视频| 亚洲电影有码| 国产精品日韩一区二区三区| 欧美激情按摩在线| 国产精品爽爽ⅴa在线观看| 欧美/亚洲一区| 国产农村妇女毛片精品久久麻豆| 亚洲激情在线激情| 国产午夜精品福利| 老司机一区二区| 国产精品一区在线播放| 一区二区免费看| 久久av一区二区三区漫画| 一本色道久久88精品综合| 亚洲在线视频一区| 亚洲乱码精品一二三四区日韩在线| 国产精品视屏| 中文一区二区| 亚洲一区二区av电影| 欧美激情精品久久久久久黑人| 你懂的一区二区| 激情婷婷久久| 久久av一区二区三区漫画| 欧美在线观看一区二区| 国产精品美女在线观看| 一区二区三区日韩欧美精品| 一区二区久久久久久| 免费在线观看精品| 欧美大香线蕉线伊人久久国产精品| 国产日产精品一区二区三区四区的观看方式 | 新狼窝色av性久久久久久| 欧美欧美在线| 亚洲看片免费| 亚洲特级片在线| 国产精品久久久久久久久免费樱桃| 一本大道久久a久久精品综合| 日韩系列在线| 欧美日韩网站| 亚洲一区影院| 久久久亚洲人| 亚洲风情亚aⅴ在线发布| 欧美大片免费观看| 99国产精品| 午夜影院日韩| 激情久久综艺| 欧美激情综合色| 亚洲一区制服诱惑| 久久综合狠狠综合久久激情| 亚洲国产视频一区| 欧美视频在线观看免费| 欧美一区二区三区成人| 欧美成人小视频| 亚洲在线视频一区| 国产一区视频在线看| 嫩草国产精品入口| 亚洲视频观看| 欧美 日韩 国产一区二区在线视频| 亚洲欧洲日产国产网站| 国产欧美一区在线| 亚洲欧洲日本一区二区三区| 欧美a级一区二区| 小黄鸭精品aⅴ导航网站入口| 欧美一区二区三区在线播放| 亚洲一区二区三区在线观看视频| 亚洲图片欧洲图片av| 国产精品日日摸夜夜摸av| 一区二区三区毛片| 久久狠狠婷婷| 蜜臀av一级做a爰片久久| 亚洲一区免费视频| 欧美成人中文字幕| 国产精品久久久久久久久借妻| 国产精品伦一区| 在线观看亚洲精品视频| 一区二区三区久久| 亚洲人成绝费网站色www| 99精品福利视频| 久久综合激情| 日韩午夜免费| 美女成人午夜| 激情成人中文字幕| 亚洲图片欧洲图片av| 女主播福利一区| 欧美激情第三页| 亚洲激情综合| 欧美激情精品久久久| 亚洲一区精品在线| 欧美日韩精品一区二区三区四区| 欧美激情中文字幕一区二区| 欧美另类69精品久久久久9999| 欧美日韩另类一区| 99re66热这里只有精品3直播| 亚洲视频一区二区免费在线观看| 欧美国产一区二区在线观看| 午夜精品久久久久久| 国内精品嫩模av私拍在线观看|