[ 收藏 ] [ 简体中文 ]  
臺灣貨到付款、ATM、超商、信用卡PAYPAL付款,4-7個工作日送達,999元臺幣免運費   在線留言 商品價格為新臺幣 
首頁 電影 連續劇 音樂 圖書 女裝 男裝 童裝 內衣 百貨家居 包包 女鞋 男鞋 童鞋 計算機周邊

商品搜索

 类 别:
 关键字:
    

商品分类

  •  管理

     一般管理学
     市场/营销
     会计
     金融/投资
     经管音像
     电子商务
     创业企业与企业家
     生产与运作管理
     商务沟通
     战略管理
     商业史传
     MBA
     管理信息系统
     工具书
     外文原版/影印版
     管理类职称考试
     WTO
     英文原版书-管理
  •  投资理财

     证券/股票
     投资指南
     理财技巧
     女性理财
     期货
     基金
     黄金投资
     外汇
     彩票
     保险
     购房置业
     纳税
     英文原版书-投资理财
  •  经济

     经济学理论
     经济通俗读物
     中国经济
     国际经济
     各部门经济
     经济史
     财政税收
     区域经济
     统计 审计
     贸易政策
     保险
     经济数学
     各流派经济学说
     经济法
     工具书
     通货膨胀
     财税外贸保险类考试
     英文原版书-经济
  •  社会科学

     语言文字
     社会学
     文化人类学/人口学
     新闻传播出版
     社会科学总论
     图书馆学/档案学
     经典名家作品集
     教育
     英文原版书-社会科学
  •  哲学

     哲学知识读物
     中国古代哲学
     世界哲学
     哲学与人生
     周易
     哲学理论
     伦理学
     哲学史
     美学
     中国近现代哲学
     逻辑学
     儒家
     道家
     思维科学
     马克思主义哲学
     经典作品及研究
     科学哲学
     教育哲学
     语言哲学
     比较哲学
  •  宗教

  •  心理学

  •  古籍

  •  文化

  •  历史

     历史普及读物
     中国史
     世界史
     文物考古
     史家名著
     历史地理
     史料典籍
     历史随笔
     逸闻野史
     地方史志
     史学理论
     民族史
     专业史
     英文原版书-历史
     口述史
  •  传记

  •  文学

  •  艺术

     摄影
     绘画
     小人书/连环画
     书法/篆刻
     艺术设计
     影视/媒体艺术
     音乐
     艺术理论
     收藏/鉴赏
     建筑艺术
     工艺美术
     世界各国艺术概况
     民间艺术
     雕塑
     戏剧艺术/舞台艺术
     艺术舞蹈
     艺术类考试
     人体艺术
     英文原版书-艺术
  •  青春文学

  •  文学

     中国现当代随笔
     文集
     中国古诗词
     外国随笔
     文学理论
     纪实文学
     文学评论与鉴赏
     中国现当代诗歌
     外国诗歌
     名家作品
     民间文学
     戏剧
     中国古代随笔
     文学类考试
     英文原版书-文学
  •  法律

     小说
     世界名著
     作品集
     中国古典小说
     四大名著
     中国当代小说
     外国小说
     科幻小说
     侦探/悬疑/推理
     情感
     魔幻小说
     社会
     武侠
     惊悚/恐怖
     历史
     影视小说
     官场小说
     职场小说
     中国近现代小说
     财经
     军事
  •  童书

  •  成功/励志

  •  政治

  •  军事

  •  科普读物

  •  计算机/网络

     程序设计
     移动开发
     人工智能
     办公软件
     数据库
     操作系统/系统开发
     网络与数据通信
     CAD CAM CAE
     计算机理论
     行业软件及应用
     项目管理 IT人文
     计算机考试认证
     图形处理 图形图像多媒体
     信息安全
     硬件
     项目管理IT人文
     网络与数据通信
     软件工程
     家庭与办公室用书
  •  建筑

  •  医学

     中医
     内科学
     其他临床医学
     外科学
     药学
     医技学
     妇产科学
     临床医学理论
     护理学
     基础医学
     预防医学/卫生学
     儿科学
     医学/药学考试
     医院管理
     其他医学读物
     医学工具书
  •  自然科学

     数学
     生物科学
     物理学
     天文学
     地球科学
     力学
     科技史
     化学
     总论
     自然科学类考试
     英文原版书-自然科学
  •  工业技术

     环境科学
     电子通信
     机械/仪表工业
     汽车与交通运输
     电工技术
     轻工业/手工业
     化学工业
     能源与动力工程
     航空/航天
     水利工程
     金属学与金属工艺
     一般工业技术
     原子能技术
     安全科学
     冶金工业
     矿业工程
     工具书/标准
     石油/天然气工业
     原版书
     武器工业
     英文原版书-工业技
  •  农业/林业

  •  外语

  •  考试

  •  教材

  •  工具书

  •  中小学用书

  •  中小学教科书

  •  动漫/幽默

  •  烹饪/美食

  •  时尚/美妆

  •  旅游/地图

  •  家庭/家居

  •  亲子/家教

  •  两性关系

  •  育儿/早教

     保健/养生
     体育/运动
     手工/DIY
     休闲/爱好
     英文原版书
     港台图书
     研究生
     工学
     公共课
     经济管理
     理学
     农学
     文法类
     医学
  • 嵌入式繫統原理與應用---基於ARM微處理器和Linux操作繫統(修訂
    該商品所屬分類:計算機/網絡 -> 操作繫統/繫統開發
    【市場價】
    430-624
    【優惠價】
    269-390
    【作者】 朱華生、呂莉、熊志文、徐晨光 
    【所屬類別】 圖書  教材  研究生/本科/專科教材  工學圖書  計算機/網絡  操作繫統/繫統開發  LINUX 
    【出版社】清華大學出版社 
    【ISBN】9787302501671
    【折扣說明】一次購物滿999元台幣免運費+贈品
    一次購物滿2000元台幣95折+免運費+贈品
    一次購物滿3000元台幣92折+免運費+贈品
    一次購物滿4000元台幣88折+免運費+贈品
    【本期贈品】①優質無紡布環保袋,做工棒!②品牌簽字筆 ③品牌手帕紙巾
    版本正版全新電子版PDF檔
    您已选择: 正版全新
    溫馨提示:如果有多種選項,請先選擇再點擊加入購物車。
    *. 電子圖書價格是0.69折,例如了得網價格是100元,電子書pdf的價格則是69元。
    *. 購買電子書不支持貨到付款,購買時選擇atm或者超商、PayPal付款。付款後1-24小時內通過郵件傳輸給您。
    *. 如果收到的電子書不滿意,可以聯絡我們退款。謝謝。
    內容介紹



    開本:16開
    紙張:膠版紙
    包裝:平裝-膠訂

    是否套裝:否
    國際標準書號ISBN:9787302501671
    叢書名:21世紀高等學校嵌入式繫統專業規劃教材

    作者:朱華生、呂莉、熊志文、徐晨光
    出版社:清華大學出版社
    出版時間:2018年07月 


        
        
    "

    編輯推薦
    《嵌入式繫統原理與應用---基於ARM微處理器和Linux操作繫統(修訂版)》以ARM微處理器為核心,以Linux操作繫統為基礎,以開發溫度采集繫統項目為主線,介紹嵌入式繫統的開發技術。本書的主要內容包含:嵌入式繫統基礎、基於ARM9處理器的硬件平臺、Linux編程基礎、嵌入式開發環境和繫統移植、Linux驅動程序設計 、Qt/E應用程序設計、嵌入式數據庫應用程序。並附Linux常用命令簡介。本書將溫度采集繫統項目分解成若干個子項目,分別放到各部分的實驗之中,隻要將這些實驗綜合在一起就可能形成一個繫統。 
    內容簡介
    《嵌入式繫統原理與應用---基於ARM微處理器和Linux操作繫統(修訂版)》以ARM微處理器為核心,以Linux操作繫統為基礎,以開發溫度采集繫統項目為主線,介紹嵌入式繫統的開發技術。
    本書的主要內容包含:嵌入式繫統基礎、基於ARM9處理器的硬件平臺、Linux編程基礎、嵌入式開發環境和繫統移植、Linux驅動程序設計 、Qt/E應用程序設計、嵌入式數據庫應用程序。並附Linux常用命令簡介。
    本書將溫度采集繫統項目分解成若干個子項目,分別放到各部分的實驗之中,隻要將這些實驗綜合在一起就可能形成一個繫統。
    本書適合高等院校計算機、電子、通信等專業嵌入式方向的教材,也可作為嵌入式領域科研人員的技術參考書。
    目錄
    目錄

    第1章嵌入式繫統基礎

    1.1嵌入式繫統的定義

    1.2嵌入式繫統的發展歷程

    1.2.1嵌入式繫統的由來

    1.2.2嵌入式繫統發展的四個階段

    1.2.3嵌入式繫統的發展趨勢

    目錄


     


    第1章嵌入式繫統基礎


     


    1.1嵌入式繫統的定義


     


    1.2嵌入式繫統的發展歷程


     


    1.2.1嵌入式繫統的由來


     


    1.2.2嵌入式繫統發展的四個階段


     


    1.2.3嵌入式繫統的發展趨勢


     


    1.3嵌入式繫統的特點


     


    1.4嵌入式繫統的結構


     


    1.5嵌入式處理器


     


    1.5.1嵌入式處理器的特點


     


    1.5.2嵌入式處理器的分類


     


    1.5.3典型的嵌入式處理器


     


    1.6嵌入式操作繫統


     


    1.7實例: 網絡溫度采集繫統


     


    1.8練習題


     


    第2章基於ARM9處理器的硬件平臺


     


    2.1ARM處理器簡介


     


    2.1.1ARM處理器核的體繫結構


     


    2.1.2ARM微處理器核


     


    2.1.3ARM編程模型


     


    2.1.4ARM指令集


     


    2.2S3C2410X控制器簡介


     


    2.2.1S3C2410X內部結構


     


    2.2.2存儲控制器


     


    2.2.3NAND Flash控制器


     


    2.2.4時鐘和電源管理


     


    2.2.5GPIO端口


     


    2.2.6ADC和觸摸屏接口


     


    2.2.7PWM定時器


     


    2.2.8通用異步收發器


     


    2.2.9中斷控制器


     


    2.3S3C2410X外圍硬件電路


     


    2.3.1電源電路


     


    2.3.2復位電路


     


    2.3.3NAND Flash接口電路


     


    2.3.4SDRAM接口電路


     


    2.3.5UART串口電路


     


    2.4練習題


     


    第3章Linux繫統編程基礎


     


    3.1GCC編譯器


     


    3.1.1GCC概述


     


    3.1.2GCC編譯過程


     


    3.1.3GCC選項


     


    3.2GDB調試器


     


    3.2.1GDB的基本使用方法


     


    3.2.2GDB基本命令


     


    3.2.3GDB典型實例


     


    3.3Make工具的使用


     


    3.3.1Makefile的基礎知識


     


    3.3.2Makefile的應用


     


    3.3.3自動生成Makefile


     


    3.4Linux應用程序設計


     


    3.4.1文件操作編程


     


    3.4.2時間編程


     


    3.4.3多線程編程


     


    3.5練習題


     


    第4章嵌入式交叉編譯環境及繫統裁剪


     


    4.1嵌入式交叉編譯環境構建


     


    4.1.1嵌入式常用調試方法


     


    4.1.2交叉編譯環境構建


     


    4.1.3串口通信軟件配置


     


    4.1.4Flash程序燒寫


     


    4.2Bootloader程序


     


    4.2.1初識Bootloader程序


     


    4.2.2常用的Linux Bootloader


     


    4.2.3vivi的裁剪和編譯


     


    4.3Linux操作繫統的裁剪和編譯


     


    4.3.1內核的裁剪和編譯


     


    4.3.2根文件繫統的構建


     


    4.4練習題


     


    第5章Linux驅動程序設計


     


    5.1Linux驅動程序概述


     


    5.1.1設備驅動原理


     


    5.1.2設備分類


     


    5.1.3設備文件接口


     


    5.1.4驅動程序的加載方法


     


    5.1.5設備驅動的重要數據結構


     


    5.1.6驅動程序常用函數介紹


     


    5.2虛擬字符設備Demo驅動程序設計


     


    5.2.1Demo字符設備


     


    5.2.2Demo驅動程序設計


     


    5.2.3Demo測試程序設計


     


    5.3A/D驅動程序設計


     


    5.3.1ADC工作原理


     


    5.3.2A/D驅動程序設計


     


    5.3.3溫度采集應用程序設計


     


    5.4練習題


     


    第6章Qtopia Core應用程序設計


     


    6.1嵌入式GUI概述


     


    6.2Qtopia Core簡介


     


    6.2.1Qt簡介


     


    6.2.2Qt的體繫結構


     


    6.3Qtopia Core開發環境的構建


     


    6.4Qtopia Core程序開發基礎


     


    6.4.1Qt中的主要類


     


    6.4.2信號和槽


     


    6.5Qtopia Core程序的結構與實例


     


    6.6Qtopia Core交叉編譯


     


    6.7練習題


     


    第7章嵌入式數據庫


     


    7.1嵌入式數據庫概述


     


    7.1.1為什麼需要嵌入式數據庫


     


    7.1.2什麼是嵌入式數據庫


     


    7.1.3常用的嵌入式數據庫


     


    7.2SQLite數據庫


     


    7.2.1SQLite安裝


     


    7.2.2SQLite命令


     


    7.2.3SQLite數據類型


     


    7.2.4SQLite的API函數


     


    7.3基於Qtopia Core和SQLite的圖書管理繫統


     


    7.4練習題


     


    附錄ALinux常用命令的使用


     


    A.1基本命令


     


    A.1.1管理文件和目錄命令


     


    A.1.2進程、關機和線上查詢命令


     


    A.1.3其他常用命令


     


    A.2網絡命令


     


    A.3服務器配置


     


    A.3.1FTP服務器


     


    A.3.2Telnet服務器


     


    A.3.3NFS服務器


     


    附錄Bvi基本操作


     


    B.1vi簡介


     


    B.2vi基本操作


     


    B.3基本命令


     


    參考文獻

    前言
    前言前言
    近年來,隨著嵌入式繫統產品的迅猛發展,社會對嵌入式技術人纔的需求也越來越多,學習嵌入式技術的人員數量也在迅速增加。由於嵌入式繫統的多樣性,增加了嵌入式繫統學習和開發的難度。為了讓初學者能較為全面地學習嵌入式繫統的開發過程,為將來從事嵌入式領域的工作奠定基礎,我們編寫了本教材。全書共分7章,第1章講述嵌入式繫統基礎知識、嵌入式處理器和嵌入式操作繫統等,便於讀者對嵌入式繫統有初步認識。第2章講述ARM繫列處理器、S3C2410X控制器內部結構及外圍電路等,讓讀者對嵌入式硬件平臺有一個全面的認識。第3章講述GCC編譯工具的使用,以及Linux繫統文件操作、時間獲取和多線程編程等內容,為以後的嵌入式軟件開發打基礎。第4章講述交叉編譯環境的構建,以及Linux繫統軟件的裁剪和編譯等。第5章講述驅動程序基礎,以及Linux繫統字符設備驅動程序的設計,重點講解了A/D驅動程序設計。第6章講述Qtopia Core嵌入式圖形界面應用程序設計。第7章講述嵌入式數據庫程序設計,並通過實例講解了數據庫在圖形界面中的應用。書後附有Linux常用命令和vi的使用。本書由朱華生、呂莉、熊志文和徐晨光共同編著。其中,朱華生編寫了第1章,呂莉編寫了第2、3、4章,熊志文編寫了第6、7章,徐晨光編寫了第5章、附錄A和B,全書由朱華生統稿。在本書的編寫過程中,得到了清華大學出版社和南昌工程學院的大力支持和幫助,在此表示衷心感謝。鋻於作者水平有限,對於教材的內容及文字的不妥之處,望讀者批評指正。編者希望在汲取大家意見和建議的基礎上,不斷修改和完善書中的有關內容,力爭下一次改版後的內容更加充實正確。任何批評和建議請發到zhuhuasheng@sohu.com,以便共同提高。

    編者2018年3月
    在線試讀
    第3章Linux繫統編程基礎本章首先介紹GCC編譯器的編譯過程及常用選項的使用,通過實例講述GDB調試器的使用方法,然後介紹Make工具的使用,後介紹文件操作、時間獲取和創建線程等任務的編程方法。3.1GCC編譯器3.1.1GCC概述
    GCC(GNU C Compiler)是GUN項目的C編譯器套件,也是GNU軟件家族中具有代表性的產品之一。GCC目前支持的體繫結構有四十餘種,如x86、ARM、PowerPC等繫列處理器; 能運行在不同的操作繫統上,如Linux、Solaris、Windows CE等操作繫統; 可完成C、C 、Objective C等源文件向運行在特定CPU硬件上的目標代碼的轉換。GCC的執行效率與一般的編譯器相比平均效率要高20%~30%。GCC是Linux平臺下常用的編譯器之一,它也是Linux平臺編譯器事實上的標準。同時,在使用Linux操作繫統的嵌入式開發領域,GCC也是使用普遍的編譯器之一。GCC編譯器與GUN Binutils工具包是緊密集成的,如果沒有Binutils工具,GCC也不能正常工作。Binutils是一繫列開發工具,包括連接器、彙編器和其他用於目標文件和檔案的工具。Binutils工具集裡主要包含以下一繫列程序: addr2line、ar、as、c 、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings和strip,它包含的庫文件有: libiberty.a、libbfd.a、libbfd.so、libopcodes.a和libopcodes.so。在Linux操作繫統中,文件的後綴名不代表文件的類型,但為了提高工作效率,通常會給每種文件定義一個後綴名。GCC支持的文件類型比較多,具體如表3.1所示。

    表3.1GCC支持的文件類型


    後綴說明後綴說明

    .cC源程序.ii經過預處理的C 程序.a由目標文件構成的檔案文件(庫文件).mObjective C源程序.C.ccC 源程序.o編譯後的目標程序.h頭文件.s彙編語言源程序.i經過預處理的C程序.S經過預編譯的彙編程序

    3.1.2GCC編譯過程下面通過一個常用的例子來說明GCC的編譯過程。利用文本編輯器創建hello.c文件,程序內容如下。第3章Linux繫統編程基礎本章首先介紹GCC編譯器的編譯過程及常用選項的使用,通過實例講述GDB調試器的使用方法,然後介紹Make工具的使用,後介紹文件操作、時間獲取和創建線程等任務的編程方法。3.1GCC編譯器3.1.1GCC概述
    GCC(GNU C Compiler)是GUN項目的C編譯器套件,也是GNU軟件家族中具有代表性的產品之一。GCC目前支持的體繫結構有四十餘種,如x86、ARM、PowerPC等繫列處理器; 能運行在不同的操作繫統上,如Linux、Solaris、Windows CE等操作繫統; 可完成C、C 、Objective C等源文件向運行在特定CPU硬件上的目標代碼的轉換。GCC的執行效率與一般的編譯器相比平均效率要高20%~30%。GCC是Linux平臺下常用的編譯器之一,它也是Linux平臺編譯器事實上的標準。同時,在使用Linux操作繫統的嵌入式開發領域,GCC也是使用普遍的編譯器之一。GCC編譯器與GUN Binutils工具包是緊密集成的,如果沒有Binutils工具,GCC也不能正常工作。Binutils是一繫列開發工具,包括連接器、彙編器和其他用於目標文件和檔案的工具。Binutils工具集裡主要包含以下一繫列程序: addr2line、ar、as、c 、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings和strip,它包含的庫文件有: libiberty.a、libbfd.a、libbfd.so、libopcodes.a和libopcodes.so。在Linux操作繫統中,文件的後綴名不代表文件的類型,但為了提高工作效率,通常會給每種文件定義一個後綴名。GCC支持的文件類型比較多,具體如表3.1所示。

    表3.1GCC支持的文件類型


    後綴說明後綴說明

    .cC源程序.ii經過預處理的C 程序.a由目標文件構成的檔案文件(庫文件).mObjective C源程序.C.ccC 源程序.o編譯後的目標程序.h頭文件.s彙編語言源程序.i經過預處理的C程序.S經過預編譯的彙編程序

    3.1.2GCC編譯過程下面通過一個常用的例子來說明GCC的編譯過程。利用文本編輯器創建hello.c文件,程序內容如下。
    #include
    void main()
    {
    char msg[80]="Hello,world!";
    printf( "%s\n",msg);
    }

    編寫完後,執行以下編譯指令。
    #gcc hello.c       
    因為編譯時沒有加任何選項,所以會默認生成一個名為a.out的可執行文件。執行該文件的命令及結果如下。
    #./a.out
    Hello,world!

    使用GCC由C語言源代碼程序生成可執行文件要經歷4個過程,如圖3.1所示。

    圖3.1GCC編譯過程


    1. 預編譯預編譯(preprocessing)的主要功能是讀取源程序,並對頭文件(include)、預編譯語句(如define等)和一些特殊符號進行分析和處理。如把頭文件復制到源文件中,並將輸出的內容送到繫統的標準輸出。源代碼中的預編譯指示以“#”為前綴。通過在GCC後加上E選項完成對代碼的預編譯。命令如下。
    # gcc E hello.c

    執行命令時,控制臺上會有數千行的輸出,其中大多數來自stdio.h頭文件,也有部分是聲明。預編譯主要完成以下3個具體任務。(1) 把include中的頭文件復制到要編譯的源文件中。(2) 用實際值替代define文本。(3) 在調用宏的地方進行宏替換。下面通過實例test.c來理解預編譯完成的工作。test.c的代碼如下。
    #define number (1 2*3)
    int main()
    {
    int n;
    n=number 3;
    return 0;
    }

    對test.c文件進行預編譯,輸入以下命令。
    #gcc E test.c 
    執行命令後會顯示如下內容。
    # 1 "test.c"
    # 1 ""
    # 1 ""
    # 1 "test.c"


    main()
    {
    int n;
    n=(1 2*3) 3;
    return 0;
    }

    如果要將預編譯結果保存在test.i文件中,可以輸入以下命令。
    #gcc E test.c o test.i

    2. 編譯編譯(compilation)的主要功能包括兩部分,部分是檢查代碼的語法,如果出現語法錯誤,則給出錯誤提示代碼,並結束編譯; 隻有在代碼無語法錯誤的情況下,纔能進入第二部分。第二部分是將預編譯後的文件轉換成彙編語言,並自動生成後綴為.s的文件。編譯的命令如下。
    #gcc S test.c
    執行命令後會生成一個名為test.s的彙編程序,文件內容如下。
    .file"test.c"
    .text
    .align 2
    .globl main
    .typemain,@function
    main:
    pushl%ebp
    movl%esp, %ebp
    subl $8, %esp
    andl $-16, %esp
    movl $0, %eax
    subl %eax, %esp
    movl$10,-4(%ebp)
    movl$0, %eax
    leave
    ret
    .Lfe1:
    .sizemain,.Lfe1main
    .ident"GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.27)"

    3. 彙編彙編(assembly)的主要功能是將彙編語言代碼變成目標代碼(機器代碼)。彙編隻是將彙編語言代碼轉換成目標代碼,但不進行連接,目標代碼不能在CPU上運行。彙編使用選項為c,它會自動生成一個後綴名為.o的目標程序。彙編的命令如下。

    #gcc c test.c

    執行命令後會生成一個名為test.o的目標文件,目標文件是一個二進制文件,所以不能用文本編輯器來查看它的內容。4. 連接連接(linking)的主要功能是連接目標代碼,並生成可執行文件。連接的命令如下。
    #gcc o test test.o
    也可以執行以下命令。
    #gcc o test test.c
    執行命令後會生成一個名為test的可執行文件。通過執行./test命令,就可以運行指定的程序。命令中的“./”是指在當前目錄下執行程序。3.1.3GCC選項GCC編譯器提供了較多的選項。選項必須以“”開始,常用的選項如表3.2所示。

    表3.2GCC的常用選項


    選項說明

    c編譯生成目標文件,後綴為.oE 隻進行預編譯,不做其他處理g在執行程序中包括標準調試信息I DirName將DirName加入到頭文件的搜索目錄列表中L DirName將DirName加入到庫文件的搜索目錄列表中,在默認情況下gcc隻鏈接共享庫l FOO鏈接名為libFOO的函數庫O整個源代碼會在編譯、連接過程中進行優化處理,可執行文件的執行效率可以提高,但是編譯、連接的速度就相應的要慢些O2比O有更好的優化能力,但編譯連接速度就更慢o FileName指定輸出文件名,如果沒有指定,默認文件名是a.outpipe在編譯過程的不同階段間使用管道S隻編譯不彙編,生成彙編代碼static鏈接靜態庫wall指定產生全部的警告信息

    1. 輸出文件選項如果不使用任何選項進行編譯,生成的可執行文件都是a.out。如果要指定輸出的文件名,可以使用選項o。例如將源文件hello.c編譯成可執行文件hello。命令格式如下。
    #gcc o hello hello.c

    2. 鏈接庫文件選項Linux操作繫統下的庫文件包括兩種格式,一種是動態鏈接庫,另一種是靜態鏈接庫。動態鏈接庫的後綴為.so,靜態鏈接庫的後綴為.a。動態鏈接庫是在程序運行過程中進行動態加載,靜態鏈接庫是在編譯過程中完成靜態加載。使用GCC編譯時,編譯器會自動調用C標準庫文件,但當要使用到標準庫以外的庫文件時,一定要使用選項l來指定具體庫的文件名,否則會報編譯錯誤,如報undefined reference to ‘xxxx’錯誤。Linux操作繫統下的庫文件都是以lib三個字母開頭的,因此在使用l選項指定鏈接的庫文件名時可以省去l、i、b三個字母。例如,有一個多線程程序pthread.c,需要用到libpthread.a或libpthread.so庫文件(文件保存在/usr/lib目錄)。編譯生成一個名為pthread的可執行程序的命令格式如下。
    #gcc pthread.c lpthread o pthread
    GCC在默認情況下,優先使用動態鏈接庫,當需要強制使用靜態鏈接庫時,需要加上static選項。使用靜態鏈接庫,編譯生成一個名為pthreads的可執行程序的命令格式如下。
    #gcc pthread.c static lpthread o pthreads
    可以使用ls l命令查看文件的大小,會發現pthreads比pthread文件大很多。
    rwxrxrx  1 root  root     12014  12月 28 22:22 pthread
    rwxrxrx  1 root  root    589856  12月 28 22:22 pthreads

    3. 指定頭文件目錄選項編譯時,編譯器會自動到默認目錄(一般為/usr/include)尋找頭文件,但當文件中的頭文件不在默認目錄時,就需要使用I選項來指定頭文件所在的目錄(或稱文件所在的路徑)。如果不指定頭文件所在的目錄,編譯時會報xxx.h: No such file or directory錯誤。假設someapp.c程序中有一個自定義的頭文件放置在/usr/local/include/someapp目錄下,則命令格式如下。
    #gcc I /usr/local/include/someapp o someapp someapp.c

    4. 指定庫文件目錄選項編譯時,編譯器會自動到默認目錄(一般為/usr/lib)尋找庫文件,但當編譯時所用的庫文件不在默認目錄時,就需要使用L選項來指定庫文件所在的目錄。如果不指定庫文件所在的目錄,編譯時會報cannot find lxxx錯誤。假設程序my.c需要使用libnew.so庫文件,且該庫文件保存在/home/someuser/lib目錄,則命令格式如下。
    #gcc my.c L/home/someuser/lib lnew o my

    5. 警告選項在編譯過程中,編譯器的警告信息對於程序員來說是非常重要的,GCC包含完整的警告提示功能,以便確定代碼是否正確,盡可能實現可移植性。GCC的編譯器警告選項如表3.3所示。

    表3.3GCC的警告選項


    類型說明

    Wall啟用所有警告信息Werror在發生警告時取消編譯操作,即將警告看作是錯誤w禁用所有警告信息

    下面通過一實例來了解如何在編譯時產生警告信息。example.c的代碼如下。
    #include
    int main () 

    int x,y; 
    for(x=1;x<=5;x ) 
    printf("x=%d\n",x);  
    }

    使用以下命令進行編譯。
    #gcc example.c
    編譯過程沒有任何提示信息,生成一個a.out可執行文件。如果加入Wall選項進行編譯,命令如下。
    # gcc Wall example.c o example
    編譯過程將會出現下面的警告信息。
    example.c: In function 'main':
    example.c:4: warning: unused variable 'y'
    example.c:7: warning: control reaches end of nonvoid function 

    第1條警告信息的意思是: 在main函數有警告信息。第2條警告信息的意思是: 指出變量y在程序中未使用。第3條警告信息的意思是: main函數的返回類型是int,但在程序中沒有return語句。GCC給出的警告從嚴格意義上不算錯誤,但是可能會成為錯誤的棲息之地。所以在嵌入式軟件開發時,需要重視警告信息,好根據警告信息對源程序進行修改,直至編譯時沒有任何警告信息。Werror選項會要求GCC將所有的警告信息當成錯誤進行處理,需要將所有的警告信息都修改後纔能生成可執行文件。命令如下。
    #gcc Wall Werror example.c o example
    當需要忽略警告信息時,可以使用w選項,命令如下。
    #gcc w example.c o example

    6. 調試選項代碼通過了編譯並不代表能正常工作。可以通過調試器檢查代碼,以便更好地找到程序中的問題。Linux下主要采用的是GDB調試器。在使用GDB之前,在執行程序中要包括標準調試信息,加入的方法是采用調試選項g。具體的命令如下。
    #gcc g c hello.c
    #gcc g o hello hello.o

    7. 優化選項優化選項的作用在於縮減代碼規模和提高代碼執行效率,常用的選項有以下幾個。(1) O、O1: 整個源代碼會在編譯、連接過程中進行優化處理,可執行文件的執行效率可以提高,但是編譯、連接的速度會相應慢些。對於復雜函數,優化編譯會占用較多的時間和相當大的內存。在O1下,編譯會盡量減少代碼的體積和代碼的運行時間,但是並不執行會花費大量時間的優化操作。(2) O2: 除了不涉及空間和速度交換的優化選項,執行幾乎所有的優化工作。比O有更好的優化效果,但編譯連接速度更慢。O2將會花費更多的編譯時間同時也會生成性能更好的代碼。但並不執行循環展開和函數“內聯”優化操作。(3) O3: 在O2的基礎上加入函數內聯、循環展開和其他一些與處理器特性相關的優化工作。下面通過optimize.c程序觀察一下優化前後的效果。
    #include  
    int main(void)
    {
    double counter;
    double result;
    double temp;
    for (counter=0;counter<2000.0*2000.0*2000.0/20.0 2020; counter = (5-1)/4)
    {
    temp = counter / 1979;
    result = counter;
    }
    printf("Result is %lf\\n", result);
    return 0;
    }

    不加優化選項進行編譯,程序執行耗時如下。
    # gcc optimize.c o optimize
    # time ./optimize
    Result is 400002019.000000\n
    real0m4.203s
    user 0m4.190s
    sys0m0.020s

    增加優化選項進行編譯,程序執行耗時如下。
    # gcc O1 optimize.c o optimize1
    # time ./optimize1
    Result is 400002019.000000\n
    real0m1.064s
    user 0m1.060s
    sys0m0.010s

    3.2GDB調試器應用程序的調試是開發過程中必不可少的環節之一。Linux下的GNU的調試器稱為GDB(GUN Debugger),該軟件早由Richard Stallman編寫。GDB是一個用來調試C和C 語言程序的調試器,它能使開發者在程序運行時觀察程序的內部結構和內存的使用情況。GDB主要可以完成下面4個方面的功能。(1) 啟動程序,按照程序員自定義的要求運行程序。(2) 單步執行、設置斷點,可以讓被調試的程序在所指定的斷點處停住。(3) 監視程序中變量的值。(4) 動態地改變程序的執行環境。3.2.1GDB的基本使用方法下面通過一個例子test.c介紹GDB的基本使用方法,test.c文件的代碼如下。
    #include
    int sum(int n);
    main()
    {
    int  s=0;
    int i,n;
    for(i=0;i<=50;i )
    {
    s=i s;
    }
    s=s sum(20);
    printf("the result is  %d\n",s);
    }
    int sum(int n)
    {
    int total=0;
    int i;
    for(i=0;i<=n;i )
    total=total i;
    return (total);
    }

    使用GDB調試器,必須在編譯時加入調試選項g,命令如下。
    #gcc g test.c o test
    #gdb test<進入gdb調試環境
    GNU gdb Red Hat Linux(5.3post0.20021129.18rh)
    Copyright 2003 Free Software Foundation, Inc.  
    GDB is free software, covered by the GNU General Public License, and you are  
    welcome to change it and/or distribute copies of it under certain conditions.  
    Type "show copying" to see the conditions.  
    There is absolutely no warranty for GDB.Type "show warranty" for details.  
    This GDB was configured as "i386redhatlinuxgnu"...
    (gdb) l<相當於list,查看源代碼
    1#include
    2int sum(int n);
    3main()
    4{
    5int  s=0;
    6int i,n;
    7for(i=0;i<=50;i )
    8{
    9s=i s;
    10}
    (gdb) l
    11s=s sum(20);
    12printf("the result is  %d\n",s);
    13}
    14int sum(int n)
    15{
    16int total=0;
    17int i;
    18for(i=0;i<=n;i )
    19total=total i;
    20return (total);
    (gdb) l
    21}
    (gdb) break 7        <在源代碼第7行設置斷點
    Breakpoint 1 at 0x804833f: file test.c,line 7.
    (gdb) break sum     <在源代碼sum函數處設置斷點
    Breakpoint 2 at 0x804838a: file test.c,line 16.
    (gdb) info break     <顯示斷點信息
    Num TypeDisp Enb AddressWhat
    1 breakpointkeep y 0x0804833f in main at test.c:7
    2 breakpointkeep y 0x0804838a in main at test.c:16
    (gdb)  r           <運行程序
    Staring program: /lvli/test
    Breakpoint 1, main () at test.c:7
    7for(i=0;i<=50;i )
    (gdb) n           <在個斷點處停止,n相當於next,單步執行
    9s=i s;
    (gdb) n
    7for(i=0;i<=50;i )
    (gdb) print s      <輸出變量s的值
    $1 = 0
    (gdb) c          <相當於continue,繼續執行
    Continuing.
    Breakpoin 2 ,sum(n=20) at test.c:16
    16int total=0;
    (gdb) c
    Continuing.
    the result  is 1485
    Program exited with code 024.
    (gdb) q       <退出gdb

    3.2.2GDB基本命令GDB命令很多,可以通過help來幫助,方法是: 在啟動GDB後,輸入help命令。
    (gdb)help
    List of classes of commands:
    aliases  Aliases of other commands
    breakpoints  Making program stop at certain points
    data  Examining data
    files  Specifying and examining files
    internals  Maintenance commands
    obscure  Obscure features
    running  Running the program
    stack  Examining the stack
    status  Status inquiries
    support  Support facilities
    tracepoints  Tracing of program execution without stopping the program
    userdefined  Userdefined commands
     Type "help" followed by a class name for a list of commands in that class.
    Type "help" followed by command name for full documentation.
    Command name abbreviations are allowed if unambiguous.
    因為GDB命令有很多,所以將它們分成許多種類。help命令隻列出了GDB的命令種類,如果要查看某一種類下的具體命令,可以在help命令後加類名,具體格式如下。
    help
    例如想了解running類下的具體命令,可以輸入以下命令。 
    help running
    常用的GDB命令如表3.4所示。

    表3.4GDB常用命令描述


    命令描述

    backtrace顯示程序中的當前位置和表示如何到達當前位置的棧跟蹤break設置斷點cd改變當前工作目錄clear清除停止處的斷點continue從斷點處開始繼續執行delete刪除一個斷點或監測點display程序停止時顯示變量或表達式file裝入要調試的可執行文件info查看程序的各種信息kill終止正在調試的程序list列出源文件內容續表


    命令描述

    make使用戶不退出GDB就可以重新產生可執行文件next執行一行代碼,從而執行其整體的一個函數print顯示變量或表達式的值pwd顯示當前工作目錄quit退出GDBrun執行當前被調試的程序set給變量賦值shell不退出GDB就執行UNIX shell命令step執行一行代碼且進入函數內部watch設置監視點,使用戶能監視一個變量或表達式的值而不管它何時變化

    3.2.3GDB典型實例下面的程序中植入了錯誤,通過這個存在錯誤的程序掌握如何利用GDB進行程序調試。有一個bug.c程序,它的功能是將輸入的字符串逆序顯示在屏幕上,源代碼如下。 
    #include
    #include
    int main(void)
    {
    int i,len;
    char str[]="hello";
    char *rev_string;
    len=strlen(str);
    rev_string=(char *)malloc(len 1);
    printf("%s\n",str);
    for(i=0;irev_string[len-i]=str[i];
    rev_string[len 1]='\0';
    printf("the reverse string is%s\n",rev_string);
    }

    程序的編譯和運行結果如下。
    # gcc o bug bug.c
    # ./bug
    hello
    the reverse string is
    以上運行的結果是錯誤的,正確結果如下。
    hello
    the reverse string is olleh
    這時,可以使用GDB調試器來查看問題在哪兒。具體步驟是: 編譯時加上g調試選項,然後再對可執行程序進行調試,命令如下。
    # gcc g o bug bug.c
    # gdb bug
     執行命令後,進入調試環境,顯示如下。 
    (gdb) l<列出源文件內容
    1#include
    2#include
    3int main(void)
    4{
    5 int i,len;
    6 char str[]="hello";
    7 char *rev_string;
    8 len=strlen(str);
    9 rev_string=(char *)malloc(len 1);
    10printf("%s\n",str);
    (gdb) l
    11for(i=0;i12 rev_string[len-i]=str[i];
    13rev_string[len 1]='\0';
    14printf("the reverse string is%s\n",rev_string);
    15}
    (gdb) break 8      <在源代碼第8行設置斷點
    Breakpoint 1 at 0x80483b2: file example.c, line 8.
    (gdb) r    <運行程序
    Starting program: /lvli/program/bugg/bug
     Breakpoint 1, main () at bug.c:8
    8 len=strlen(str);
    (gdb) n   <在個斷點處停止,n相當於next,單步執行
    9 rev_string=(char *)malloc(len 1);
    (gdb) print len    <輸出變量len的值
    $1 = 5
    (gdb) n  <單步執行
    10printf("%s\n",str);
    (gdb) n
    hello
    11for(i=0;i(gdb) n
    12 rev_string[len-i]=str[i];
    (gdb) n
    11for(i=0;i(gdb) n
    12 rev_string[len-i]=str[i];
    (gdb) n
    11for(i=0;i(gdb) print rev_string[5]  <輸出rev_string[5]的值
    $2 = 104 'h'
    (gdb) print rev_string[4]  <輸出rev_string[4]的值
    $3 = 101 'e'
    (gdb) n
    12 rev_string[len-i]=str[i];
    (gdb) n
    11for(i=0;i(gdb) print rev_string[3]
    $4 = 108 'l'
    (gdb) n
    12 rev_string[len-i]=str[i];
    (gdb) n
    11for(i=0;i(gdb) print rev_string[2]
    $5 = 108 'l'
    (gdb) n
    12 rev_string[len-i]=str[i];
    (gdb) n
    11for(i=0;i(gdb) print rev_string[1]
    $6 = 111 'o'
    (gdb) n
    13rev_string[len 1]='\0';
    (gdb) n
    14printf("the reverse string is%s\n",rev_string);
    (gdb) print rev_string[0]  <輸出rev_string[0]的值
    $7 = 0 '\0'
    (gdb) c <相當於continue,繼續執行
    Continuing.
    the reverse string is

    通過以上調試過程可見,錯誤的根源在於沒有給rev_string[0]賦值,所以rev_string[0]為'\0',導致字符串輸出為空。可以將rev_string[len-i]改成rev_string[len-1-i],這樣結果就是期待的結果。3.3Make工具的使用在大型軟件項目的開發過程中,通常有成百上千個源文件,如Linux內核源文件。如果每次都通過手工輸入GCC命令進行編譯,非常不方便,所以引入了Make工具來解決這個問題。Make工具可以將大型的開發項目分解成為多個更易於管理的模塊,簡潔明了地理順各個源文件之間紛繁復雜的相互依賴關繫,後自動完成編譯工作。Make工具主要的作用是通過Makefile文件來描述源程序之間的相互關繫,並自動完成維護編譯工作。Makefile文件需要嚴格按照語法進行編寫,文件中需要說明如何編譯各個源文件並連接生成可執行文件,並定義源文件之間的依賴關繫等。 3.3.1Makefile的基礎知識1. Makefile文件
    Makefile是描述文件依賴關繫的說明,它由若干個規則組成,每個規則的格式如下。目標: 依賴關繫
     命令
    其中: 目標是指make終需要創建的東西。另外,目標也可以是一個make執行的動作名稱,如目標clean,可以稱這樣的目標為“偽目標”。依賴關繫是指編譯目標體要依賴的一個或多個文件列表。命令是指為了從指定的依賴體創建出目標體所需執行的命令。一個規則可以有多個命令行,每一條命令占一行。注意: 每一個命令的個字符必須是制表符Tab,如果使用空格會導致錯誤,make會在執行過程中顯示Missing Separator(缺少分隔符)並停止。在3.1節中創建了一個名為hello.c的文件,並使用命令gcc o hello hello.c生成了一個可執行文件hello。如果要利用make工具生成可執行程序,則首先要在hello.c所在的目錄下編寫一個Makefile文件,文件內容如下。
    all: hello.o
     gcc  hello.o o hello
    hello.o:hello.c
     gcc c hello.c o hello.o 
    clean:
     rm *.o hello

    以上共有3個規則,個規則是生成hello可執行程序,第二個規則是生成hello.o目標文件,第三個規則是刪除hello和後綴為.o的所有文件。上面例子中的編譯器是GCC,而在嵌入式項目開發中經常要使用交叉編譯器,如本書采用的交叉編譯器是armlinuxgcc。如果要交叉編譯hello.c程序,就要將Makefile文件中所有gcc替換成armlinuxgcc,如果一個一個修改會非常麻煩,所以在Makefile中引進變量來解決。使用變量將上面的Makefile文件改寫為如下形式。
    CC=gcc
    OBJECT=hello.o
    all:$(OBJECT)
    $(CC) $(OBJECT) o hello
    $(OBJECT):hello.c
    $(CC) c hello.c o $(OBJECT)
    clean:
    rm *.o hello

    在文件中,CC和OBJECT是定義的兩個變量,它們的值分別是gcc和hello.o。變量的引用方法是: 把變量用括號括起來,並在前面加上“$”。例如引用變量CC,就可以寫成$(CC)。變量一般在Makefile文件的頭部進行定義,按照慣例,變量名一般使用大寫字母。變量的內容可以是命令、文件、目錄、變量、文件列表、參數列表、常量、目標名等。如果要對上面的hello.c進行交叉編譯,可以將Makefile文件改寫為如下形式。
    CROSS=armlinux
    CC=$(CROSS)gcc
    OBJECT=hello.o
    all:$(OBJECT)
    $(CC) $(OBJECT) o hello
    $(OBJECT):hello.c
    $(CC) c hello.c o $(OBJECT)
    clean:
    rm *.o hello

    2. Make工具的使用Makefile文件編寫完成以後,需要通過make工具來執行,命令格式如下。
    #make [target]
    參數target是指要處理的目標名。make命令會自動查找當前目錄下的Makefile或makefile文件,如果文件存在就執行,否則報錯。如果make命令後面沒有任何參數,則表示處理Makefile文件中的個目標。例如,如果使用前面編寫好的Makefile文件,執行make命令或make all命令,都表示執行all目標,即生成hello文件; 執行make clean命令,表示執行clean目標,即刪除hello和後綴為.o的所有文件。GUN Make工具在當前工作目錄中按照GNUmakefile、makefile、Makefile的順序搜索Makefile文件,也可以通過f參數指定描述文件。如果編寫的Makefile文件名為zhs,則可以通過make f zhs命令來執行。Make工具的選項很多,讀者可以到make工具參考書上查找。3.3.2Makefile的應用3.3.1節隻介紹了Makefile的簡單編寫和使用方法,本節通過實例來詳細講解Makefile的應用。1. 所有文件均在一個目錄下的Makefile的編寫現有7個文件分別是m.c、m.h、study.c、listen.c、visit.c、play.c、watch.c。m.c文件的內容如下。
    #include
    main()
    {
    int i;
    printf("please input the value of i from 1 to5:\n");
    scanf("%d",&i);
    if(i==1)
    visit();
    else  if(i==2)
    study();
    else  if(i==3)
    play();
    else  if(i==4)
    watch();
    else  if(i==5)
    listen();
    else
    printf("nothing to do\n");
    printf("This is a woderful day\n");
    }

    study.c文件的內容如下。
    void study()
    {
    printf("study embedded system today\n");
    }
    listen.c文件的內容如下。
    #include
    void listen()
    {
    printf("listen   english today\n");
    }

    play.c文件的內容如下。
    #include
    void play()
    {
    printf("play football today\n");
    }

    visit.c文件的內容如下。
    #include
    void visit()
    {
    printf("visit friend today\n");
    }
    watch.c文件的內容如下。
    #include
    void watch()
    {
    printf("watch TV today\n");
    }
    m.h文件的內容如下。
    void visit();
    void listen();
    void watch();
    void study();
    void play();
    從上面的代碼可以看出這些文件之間的相互依賴關繫,如圖3.2所示。

    圖3.2文件之間的依賴關繫


    現在利用這7個程序生成一個名為m的可執行程序,Makefile文件可編寫如下。
    CC=gcc
    TARGET=All
    OBJECTS= m.o visit.o listen.o watch.o study.o play.o
    $(TARGET):$(OBJECTS)
    $(CC)  $(OBJECTS) o m
    m.o:m.c m.h
    $(CC) c m.c  o m.o
    visit.o:visit.c
    $(CC) c visit.c o visit.o
    listen.o:listen.c
    $(CC) c listen.c o listen.o
    watch.o:watch.c
    $(CC) c watch.c o watch.o
    study.o:study.c
    $(CC) c study.c o study.o
    play.o:play.c
    $(CC) c play.c o play.o
    clean:
    rm *.o

    這個Makefile文件可以通過預定義變量來簡化。常見預定義變量如表3.5所示。

    表3.5Makefile預定義變量


    變量說明

    $@規則的目標所對應的文件名$*不包含擴展名的目標文件名稱$ 所有的依賴文件,以空格分開,並以出現的先後為序,可能包含重復的依賴文件$%如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱$<規則中的個依賴文件名$^規則中所有依賴的列表,以空格為分隔符$?規則中日期新於目標的所有依賴文件的列表,以空格為分隔符$(@D)目標文件的目錄部分(如果目標在子目錄中)$(@F)目標文件的文件名部分(如果目標在子目錄中)

    現用$@、$<、$^來改寫上述Makefile文件。
    CC=gcc
    TARGET=All
    OBJECTS= m.o visit.o listen.o watch.o study.o play.o
    $(TARGET):$(OBJECTS)
    $(CC) $^ o m
    m.o:m.c m.h
    $(CC) c $< o $@
    visit.o:visit.c
    $(CC) c $< o $@
    listen.o:listen.c
    $(CC) c $< o $@
    watch.o:watch.c
    $(CC) c $< o $@
    study.o:study.c
    $(CC) c $< o $@
    play.o:play.c
    $(CC) c $< o $@
    clean:
    rm *.o

    從修改後的Makefile文件可以看出,各個文件的編譯命令幾乎沒有區別,所以進一步用%和*兩個通配符來簡化。
    CC=gcc
    TARGET=All
    OBJECTS= m.o visit.o listen.o watch.o study.o play.o
    $(TARGET):$(OBJECTS)
    $(CC) $^ o m
    *.o:*.c 
    $(CC) c $< o $@
    clean:
    rm *.o

    2. 編寫文件在不同目錄下的Makefile假設程序的目錄結構為: 源文件、可執行文件和Makefile在src目錄中,頭文件在include目錄中,obj存放.o文件。就需要指定文件和頭文件路徑。仍以上面的程序為例。Makefile文件如下。
    CC=gcc
    SRC_DIR=./
    OBJ_DIR=../obj/
    INC_DIR=../include/
    TARGET=all
    $(TARGET):$(OBJ_DIR)m.o $(OBJ_DIR)visit.o $(OBJ_DIR)listen.o $(OBJ_DIR)watch.o\ $(OBJ_DIR)study.o $(OBJ_DIR)play.o
      $(CC) $^ o $(SRC_DIR)m
    $(OBJ_DIR)m.o:$(SRC_DIR)m.c $(INC_DIR)m.h
      $(CC) I$(INC_DIR) c o $@ $<
    $(OBJ_DIR)visit.o:$(SRC_DIR)visit.c
      $(CC) c $< o @
    $(OBJ_DIR)listen.o:$(SRC_DIR)listen.c
      $(CC) c $< o @
    $(OBJ_DIR)watch.o:$(SRC_DIR)watch.c
      $(CC) c $< o @
    $(OBJ_DIR)study.o:$(SRC_DIR)study.c
      $(CC) c $< o @
    $(OBJ_DIR)play.o:$(SRC_DIR)play.c
      $(CC) c $< o @
    clean:
      rm $(OBJ_DIR)*.o

    3.3.3自動生成Makefile編寫Makefile確實不是一件輕松的事,尤其對於一個較大的項目而言更是如此。本節要講的autoTools繫列工具正是為此而設的,它隻需用戶輸入簡單的目標文件、依賴文件、文件目錄等就可以輕松地生成Makefile。另外,這些工具還可以完成繫統配置信息的收集,方便地處理各種移植性的問題。autoTools是繫列工具,它包含了aclocal、autoscan、autoconf、autoheader和automake工具,使用autoTools主要就是利用各個工具的腳本文件來生成後的Makefile文件。其總體流程如圖3.3所示。

    圖3.3自動生成Makefile的流程圖


    以3.1.2節中的hello.c為例介紹自動生成Makefile的過程。1. autoscan
    # ls
    hello.c
    # autoscan
    # ls
    autoscan.log  configure.scan  hello.c

    2. 創建configure.in文件configure.in是autoconf的腳本配置文件,是在configure.scan基礎上修改的。修改如下。
    # vi configure.scan
    #*Autoconf*//以“#”號開始的行為注釋
    AC_PREREQ(2.59)         //本文件要求的autoconf版本
    AC_INIT(hello,1.0)        // AC_INIT宏用來定義軟件的名稱和版本等信息
    AM_INIT_AUTOMAKE(hello,1.0)//是automake所的宏,軟件名稱和版本號
    AC_CONFIG_SRCDIR([hello.c])    //用來偵測所指定的源碼文件是否存在
    AC_CONFIG_HEADER([config.h])//用於生成config.h文件,以便au







     
    網友評論  我們期待著您對此商品發表評論
     
    相關商品
    在線留言 商品價格為新臺幣
    關於我們 送貨時間 安全付款 會員登入 加入會員 我的帳戶 網站聯盟
    DVD 連續劇 Copyright © 2024, Digital 了得網 Co., Ltd.
    返回頂部