嵌入式linux系統(tǒng)與應(yīng)用編程基礎(chǔ)_第1頁
嵌入式linux系統(tǒng)與應(yīng)用編程基礎(chǔ)_第2頁
嵌入式linux系統(tǒng)與應(yīng)用編程基礎(chǔ)_第3頁
嵌入式linux系統(tǒng)與應(yīng)用編程基礎(chǔ)_第4頁
嵌入式linux系統(tǒng)與應(yīng)用編程基礎(chǔ)_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Linux編程基礎(chǔ)部門日期

版本管理修改記錄

審核記錄版本號(hào).作者描述修改日期V01edwardCreated2014-06-01V02xushanModified2014-12-16版本號(hào).職務(wù)簽名修改日期

內(nèi)容組成GCC程序編譯GDB程序調(diào)試Makefile工程管理

GCC簡(jiǎn)介簡(jiǎn)介

Linux系統(tǒng)下的GCC(GNUCCompiler)是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是GNU的代表作之一,GCC可以在多種硬件平臺(tái)上編譯出可執(zhí)行程序,其執(zhí)行效率與一般的編譯器相比提高了20%~30%。

GCC程序編譯過程編譯過程GCC編譯器能將C、C++語言的源程序、匯編程序編譯、鏈接成可執(zhí)行文件。在Linux系統(tǒng)中、可執(zhí)行文件沒有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來區(qū)分可執(zhí)行文件和不可執(zhí)行文件在使用GCC編譯程序是,編譯過程可分為四階段: 1)預(yù)處理(Pre-Processing) 2)編譯(Compiling) 3)匯編(Assembling) 4)鏈接(Linking)

文件類型

GCC通過后綴來區(qū)別輸入文件的類別:后綴名文件類型.cC語言源碼文件.a由目標(biāo)文件構(gòu)成的庫文件.C/.cc/.cxxC++源代碼文件.h頭文件.i預(yù)處理后的C源代碼文件.ii預(yù)處理后C++源代碼文件.o編譯后的目標(biāo)文件.s匯編語言源代碼文件.S經(jīng)過預(yù)編譯的匯編源代碼文件GCC文件類型

GCC演示示例(hello.c): #include<stdio.h> intmain(void) { printf(“hellozynq!\n”); retrun0; }

編譯和運(yùn)行這段程序: #gcchello.c–ohello #./hello

輸出:hellozynq!

GCC基本用法GCC基本用法 gcc[options]filename options:編譯器所需要的編譯選項(xiàng) filename:要編譯的文件名options編譯選項(xiàng) gcc編譯器的編譯選項(xiàng)大約有100多個(gè),其中多數(shù)我們根本就用不到,這里只介紹其中最基本、最常用的參數(shù).–ooutput_filename:確定可執(zhí)行文件的名字為output_filename.如果不給這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out

GCC程序編譯–c:只編譯,不鏈接成可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件。–g:產(chǎn)生調(diào)試工具(GNU的gdb)所必要的符號(hào)信息,要想對(duì)編譯出的程序進(jìn)行調(diào)試,就必須加入這個(gè)選項(xiàng)。-O:對(duì)程序進(jìn)行優(yōu)化編譯、鏈接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、鏈接過程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、鏈接的速度相應(yīng)地要慢一些。-O2:比-O更好的優(yōu)化編譯、鏈接,當(dāng)然整個(gè)編譯、鏈接過程會(huì)更慢。

GCC程序編譯示例(test.c)#include<stdio.h>intmain(void){ doublecounter; doubleresult; doubletemp; for(counter=0;counter<2000.0*2000.0/20.0;counter+=5-1/4){ temp=counter/1979; result=counter; } printf("Resultis%lf\n",result); return0;}

GCC程序編譯 #gcctest.c–otest #time./test #gcc–Otest.cotest #time./test

對(duì)比兩次執(zhí)行的輸出結(jié)果不難看出,程序的性能的確得到了很大幅度的改善

GCC程序編譯-ldirname:將dirname所注冊(cè)的目錄加入到程序的頭文件目錄列表中。C程序中的頭文件包含兩種情況(1)#include<a.h>(2)#include“b.h”

對(duì)于<>,預(yù)處理程序cpp在系統(tǒng)預(yù)設(shè)的同文件目錄(如/usr/include)中搜尋相應(yīng)的文件;而對(duì)于“”,cpp在當(dāng)前目錄中搜尋頭文件,這個(gè)選項(xiàng)的作用是告訴cpp,如果當(dāng)前目錄中沒有找到需要的頭文件,就到指定的dirname目錄中去尋找。例:gcctest.c–l/home/include–otest

GCC程序編譯–Ldirname:將dirname所指出的目錄加入到庫文件的目錄列表中,在默認(rèn)狀態(tài)下,鏈接程序ld在系統(tǒng)的預(yù)設(shè)路徑中(如/usr/lib)尋找所需要的庫文件,這個(gè)選項(xiàng)告訴鏈接程序,首先到-L指定的目錄中去尋找,然后再到系統(tǒng)預(yù)設(shè)的路徑中尋找-lname:在鏈接時(shí),裝載名字為libname.a的函數(shù)庫,該函數(shù)庫位于系統(tǒng)預(yù)設(shè)的目錄或者由-L選項(xiàng)確定目錄下,如,-lm表示鏈接名為libm.a的數(shù)學(xué)函數(shù)庫。

例:gcctest.c–L/home/lib–lm–otest

GCC程序編譯-static:靜態(tài)鏈接庫文件

例:gcc–statictest.c–otest

庫有動(dòng)態(tài)與靜態(tài)兩種,動(dòng)態(tài)庫通常用.so為后綴,靜態(tài)庫用.a為后綴。當(dāng)使用使用靜態(tài)庫時(shí),連接器找出程序所需要的函數(shù),然后將他們拷貝到可執(zhí)行文件,一旦李連杰成功,靜態(tài)程序庫也就不需要了,然而,對(duì)于動(dòng)態(tài)庫而言,就不是這樣,動(dòng)態(tài)庫會(huì)在執(zhí)行程序內(nèi)流下一個(gè)標(biāo)記,指明當(dāng)程序執(zhí)行時(shí),首先必須載入這個(gè)庫。由于動(dòng)態(tài)庫節(jié)省空間,linux下進(jìn)行連接的缺省操作是首先連接動(dòng)態(tài)庫。

GCC程序編譯-Wall:生成所有的警告信息-w:不生成任何警告信息-DMACRO:定義MARCRO宏,等效于在程序中使用#defineMARCRO

內(nèi)容組成GCC程序編譯GDB程序調(diào)試Makefile工程管理

GDB程序調(diào)試簡(jiǎn)介 GDB是GNU發(fā)布的一款功能強(qiáng)大的程序調(diào)試工具。GDB主要完成以下三個(gè)方面的功能:啟動(dòng)被調(diào)試的程序讓被調(diào)試的程序在指定的位置停住當(dāng)程序被停住時(shí),可以檢查程序狀態(tài)

GDB程序調(diào)試示例(tst.c)#include<stdio.h>intmain(void){ inti; longresult=0; for(i=0;i<=100;i++){ result+=i; } printf("Result=%ld\n“,result); return0;}

GDB程序調(diào)試編譯生成可執(zhí)行文件: #gcc–gtst.c–otst啟動(dòng)GDB #gdbtst在main函數(shù)處設(shè)置斷點(diǎn) (gbd)breakmain運(yùn)行程序 (gdb)run單步運(yùn)行 (gbd)next繼續(xù)運(yùn)行 (gbd)continue

GDB程序調(diào)試GDB命令解析list(l):查看程序break(b)函數(shù)名:在某個(gè)函數(shù)入口處添加斷點(diǎn)break(b)行號(hào):在指定的行添加斷點(diǎn)break(b)文件名:符號(hào):在指定文件的指定行添加斷點(diǎn)break(b)行號(hào)if條件:當(dāng)條件為真時(shí),指定行號(hào)處斷點(diǎn)生效,例如b6ifi=12,當(dāng)i等于12時(shí)第6行斷點(diǎn)生效infobreak:查看所有設(shè)置斷點(diǎn)delete斷點(diǎn)編號(hào):刪除斷點(diǎn)run(r):開始運(yùn)行程序

GDB程序調(diào)試next(n):?jiǎn)尾竭\(yùn)行程序(不進(jìn)入子函數(shù))step(s):?jiǎn)尾竭\(yùn)行(進(jìn)入子函數(shù))continue(c):繼續(xù)運(yùn)行程序print(p)變量名:查看指定變量值finish:運(yùn)行程序,直到當(dāng)前函數(shù)結(jié)束watch變量名:對(duì)指定變量進(jìn)行監(jiān)控quit(q):推出gdb

內(nèi)容組成GCC程序編譯GDB程序調(diào)試Makefile工程管理

Makefile工程管理GNUmake簡(jiǎn)介

Linux程序員必須學(xué)會(huì)使用GNUmake來構(gòu)建和管理自己的軟件工程。GNU的make能夠使整個(gè)軟件工程的編譯、鏈接只需要一個(gè)命令就可以完成。這不過需要我們投入一些時(shí)間去完成一個(gè)或者多個(gè)稱之為Makefile文件的編寫。此文件正是make正常工作的基礎(chǔ)。

Makefile文件描述了整個(gè)工程的編譯、鏈接等規(guī)則。其中包括:工程中的那些源文件需要編譯以及如何編譯;需要?jiǎng)?chuàng)建那些庫文件以及如何創(chuàng)建這些庫文件、如何最后產(chǎn)生我們想要的可執(zhí)行文件。

make是一個(gè)命令工具,它解釋Makefile中的指令。在make執(zhí)行時(shí),需要Makefile

Makefile工程管理示例(Makefile)hello:main.ofunc1.ofunc2.o gccmain.ofunc1.ofunc2.o-ohellomain.o:main.c gcc-cmain.cfunc1.o:func1.c gcc-cfunc1.cfunc2.o:func2.c gcc-cfunc2.c.PHONY:cleanclean: rm-rfhellomain.ofunc1.ofunc2.o

Makefile工程管理Makefile術(shù)語

規(guī)則:用于說明如何生成一個(gè)或多個(gè)目標(biāo)文件,規(guī)則格式如下:

targets:prerequisites

command

目標(biāo)

依賴命令

main.o:main.c gcc–omain.omain.c

問題:那個(gè)是目標(biāo)?那個(gè)是依賴?那個(gè)是命令?

NOTE:命令需要以【TAB】件開始

Makefile工程管理目標(biāo)

在Makefile中,規(guī)則的順序是很重要的,因?yàn)?,Makefile中只應(yīng)該有一個(gè)最終的目標(biāo),其它的目標(biāo)都是被這個(gè)目標(biāo)所連帶出來的,所以一定要讓make知道你的最終目標(biāo)是什么。一般來說,定義在Makefile中的目標(biāo)可能會(huì)很多,但是第一條規(guī)則中的目標(biāo)被確立為最終的目標(biāo)文件名

make命令默認(rèn)在當(dāng)前目錄下尋找makefile或Makefile的工程文件,當(dāng)名字不為這兩者之一時(shí),可以使用如下方法指定:

make-f文件名

Makefile工程管理偽目標(biāo)

Makefile中把那些沒有任何依賴只有可執(zhí)行動(dòng)作的目標(biāo)稱為“偽目標(biāo)”(phonytargets)。

.PHONY:clean .clean: rm–rfhellomain.ofunc1.ofunc2.o

“.PHONY”將“clean”目標(biāo)聲明為偽目標(biāo)

Makefile工程管理變量

hello:main.ofunc1.ofunc2.o gccmain.ofunc1.ofunc2.o–ohello思考1:如果要為hello目標(biāo)添加一個(gè)依賴,如:func3.o,該如何修改?答案1: hello:main.ofunc1.ofunc2.ofunc3.o gccmain.ofunc1.ofunc2.ofunc3.o–ohello答案2: obj=main.ofunc1.ofunc2.ofunc3.o hello:$(obj) gcc$(obj)–ohello

Makefile工程管理自動(dòng)化變量

在makefile中,存在系統(tǒng)默認(rèn)的自動(dòng)化變量$^:代表所有的依賴文件$

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論