www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]初學(xué)時(shí)最好從命令行入手,這樣可以熟悉從編寫程序、編譯、調(diào)試和執(zhí)行的整個(gè)過(guò)程。編寫程序可以用vi或其它編輯器編寫。

初學(xué)時(shí)最好從命令行入手,這樣可以熟悉從編寫程序、編譯、調(diào)試和執(zhí)行的整個(gè)過(guò)程。編寫程序可以用vi或其它編輯器編寫。

編譯則使用gcc命令。要往下學(xué)習(xí)首先就得熟悉gcc命令的用法。

gcc命令提供了非常多的命令選項(xiàng),但并不是所有都要熟悉,初學(xué)時(shí)掌握幾個(gè)常用的就可以了,到后面再慢慢學(xué)習(xí)其它選項(xiàng),免得因選項(xiàng)太多而打擊了學(xué)習(xí)的信心。

一. 常用編譯命令選項(xiàng)

假設(shè)源程序文件名為test.c。

1. 無(wú)選項(xiàng)編譯鏈接

用法:#gcc test.c

作用:將test.c預(yù)處理、匯編、編譯并鏈接形成可執(zhí)行文件。這里未指定輸出文件,默認(rèn)輸出為a.out。

2. 選項(xiàng) -o

用法:#gcc test.c -o test

作用:將test.c預(yù)處理、匯編、編譯并鏈接形成可執(zhí)行文件test。-o選項(xiàng)用來(lái)指定輸出文件的文件名。

3. 選項(xiàng) -E

用法:#gcc -E test.c -o test.i

作用:將test.c預(yù)處理輸出test.i文件。

4. 選項(xiàng) -S

用法:#gcc -S test.i

作用:將預(yù)處理輸出文件test.i匯編成test.s文件。

5. 選項(xiàng) -c

用法:#gcc -c test.s

作用:將匯編輸出文件test.s編譯輸出test.o文件。

6. 無(wú)選項(xiàng)鏈接

用法:#gcc test.o -o test

作用:將編譯輸出文件test.o鏈接成最終可執(zhí)行文件test。

7. 選項(xiàng)-O

用法:#gcc -O1 test.c -o test

作用:使用編譯優(yōu)化級(jí)別1編譯程序。級(jí)別為1~3,級(jí)別越大優(yōu)化效果越好,但編譯時(shí)間越長(zhǎng)。

二. 多源文件的編譯方法

如果有多個(gè)源文件,基本上有兩種編譯方法:

[假設(shè)有兩個(gè)源文件為test.c和testfun.c]

1. 多個(gè)文件一起編譯

用法:#gcc testfun.c test.c -o test

作用:將testfun.c和test.c分別編譯后鏈接成test可執(zhí)行文件。

2. 分別編譯各個(gè)源文件,之后對(duì)編譯后輸出的目標(biāo)文件鏈接。

用法:

#gcc -c testfun.c //將testfun.c編譯成testfun.o

#gcc -c test.c //將test.c編譯成test.o

#gcc -o testfun.o test.o -o test //將testfun.o和test.o鏈接成test

以上兩種方法相比較,第一中方法編譯時(shí)需要所有文件重新編譯,而第二種方法可以只重新編譯修改的文件,未修改的文件不用重新編譯。

gcc編程環(huán)境基礎(chǔ)5--編譯時(shí)頭文件和庫(kù)文件路徑指定

※預(yù)處理(preprocessing),編譯(compilation),匯編(assembly)和連接(linking)

※include的header文件,連結(jié)數(shù)據(jù)庫(kù),系統(tǒng)定義,總共有下列來(lái)源指定gcc去那找.

當(dāng)初在編譯時(shí)指定的(在~gcc/gcc/collect2.c:locatelib()

寫在specs內(nèi)的

后來(lái)用-D -I -L指定的

gcc環(huán)境變量設(shè)定(編譯的時(shí)候)

ld.so的環(huán)境變量(這是run time的時(shí)候)

1.頭文件

gcc 在編譯時(shí)怎么去尋找所需要的頭文件 :

※所以header file的搜尋會(huì)從-I開始

※然后找gcc的環(huán)境變量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH

※再找內(nèi)定目錄

/usr/include

/usr/local/include

/usr/lib/gcc-lib/i386-linux/2.95.2/include

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3

/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

庫(kù)文件不過(guò)如果裝gcc的時(shí)候,是有給定的prefix的話,那么就是

/usr/include

prefix/include

prefix/xxx-xxx-xxx-gnulibc/include

prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

2.庫(kù)文件

cos()等函式庫(kù)的選項(xiàng)要多加 -lm

編譯的時(shí)候:

※gcc會(huì)去找-L

※再找gcc的環(huán)境變量LIBRARY_PATH

※再找內(nèi)定目錄 /lib /usr/lib /usr/local/lib 這是當(dāng)初compile gcc時(shí)寫在程式內(nèi)的

2.利用Linux系統(tǒng)上已有的研發(fā)庫(kù)

(1).查看庫(kù)文件提供了哪些調(diào)用

能用nm命令自己查看庫(kù)文件提供了哪些調(diào)用

(2).通過(guò)頭文件查看函數(shù)的定義

3.gcc選項(xiàng)

總體選項(xiàng) (Overall Option) :(-c(生成目標(biāo)但不連接) -S(匯編) -E(預(yù)處理) -o file(生成指定的文件) -pipe -v(顯示過(guò)程) -x language (設(shè)定文件所使用的語(yǔ)言,使后綴名無(wú)效`c’, 可用參數(shù)`objective-c’, `c-header’, `c++’, `cpp-output’, `assembler’, and `assembler-with-cpp’))

語(yǔ)言選項(xiàng) (LANGUAGE OPTIONS) :(-ansi 只支持 ANSI 標(biāo)準(zhǔn)的 C 語(yǔ)法.這一選項(xiàng)將禁止 GNU C 的某些特色)

預(yù)處理器選項(xiàng) (Preprocessor Option) :(-Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro 相當(dāng)于C語(yǔ)言中的#undef macro -undef -DMACRO 以字符串“1”定義 MACRO 宏, -DMACRO=DEFN 以字符串“DEFN”定義 MACRO 宏)

匯編器選項(xiàng) (ASSEMBLER OPTION) :(-Wa,option )

連接器選項(xiàng) (LINKER OPTION) :(-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol )

目錄選項(xiàng) (DIRECTORY OPTION) :(-Bprefix -Idir -I- -Ldir)

警告選項(xiàng) (WARNING OPTION) :(-w 不生成所有警告信息,-Wall 生成所有警告信息)

調(diào)試選項(xiàng) (DEBUGGING OPTION) :(-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program )

優(yōu)化選項(xiàng) (OPTIMIZATION OPTION) :(-O0不進(jìn)行優(yōu)化處理,-O或-O1優(yōu)化生成代碼 -O2進(jìn)一步優(yōu)化 -O3比-O2更進(jìn)一步優(yōu)化,包括inline函數(shù))

目標(biāo)機(jī)選項(xiàng) (TARGET OPTION) :(-b machine -V version )

機(jī)器相關(guān)選項(xiàng) (MACHINE DEPENDENT OPTION):(-m486 針對(duì) 486 進(jìn)行代碼優(yōu)化)

代碼生成選項(xiàng) (CODE GENERATION OPTION) :(-fpic -fPIC)

1、用于linux系統(tǒng)下編程的編譯器

概述

GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由 GNU 開發(fā)的編程語(yǔ)言編譯器。它是一套GNU編譯器套裝

以 GPL 及 LGPL 許可證所發(fā)行的自由軟件,也是 GNU計(jì)劃的關(guān)鍵部分,亦是自由的類Unix及蘋果電腦 Mac OS X 操作系統(tǒng)的標(biāo)準(zhǔn)編譯器。

GCC 原名為 GNU C 語(yǔ)言編譯器,因?yàn)樗局荒芴幚?C語(yǔ)言。GCC 很快地?cái)U(kuò)展,變得可處理 C++。之后也變得可處理 Fortran、Pascal、Objective-C、Java, 以及 Ada與其他語(yǔ)言。

歷史

GCC是由理查德·馬修·斯托曼在1985年開始的。他首先擴(kuò)增一個(gè)舊有的編譯器,使它能編譯C,這個(gè)編譯器一開始是以Pastel語(yǔ)言所寫的。Pastel是一個(gè)不可移植的Pascal語(yǔ)言特殊版,這個(gè)編譯器也只能編譯Pastel語(yǔ)言。為了讓自由軟件有一個(gè)編譯器,后來(lái)此編譯器由斯托曼和Len Tower在1987年以C語(yǔ)言重寫并成為GNU專案的編譯器。GCC的建立者由自由軟件基金會(huì)直接管理。

在1997年,一群不滿GCC緩慢且封閉的創(chuàng)作環(huán)境者,組織了一個(gè)名為EGCS〈Experimental/Enhanced GNU Compiler System〉的專案,此專案匯整了數(shù)項(xiàng)實(shí)驗(yàn)性的分支進(jìn)入某個(gè)GCC專案的分支中。EGCS比起GCC的建構(gòu)環(huán)境更有活力,且EGCS最終也在1999年四月成為GCC的官方版本。

GCC目前由世界各地不同的數(shù)個(gè)程序設(shè)計(jì)師小組維護(hù)。它是移植到中央處理器架構(gòu)以及操作系統(tǒng)最多的編譯器。

由于GCC已成為GNU系統(tǒng)的官方編譯器(包括GNU/Linux家族),它也成為編譯與建立其他操作系統(tǒng)的主要編譯器,包括BSD家族、Mac OS X、NeXTSTEP與BeOS。

GCC通常是跨平臺(tái)軟件的編譯器首選。有別于一般局限于特定系統(tǒng)與執(zhí)行環(huán)境的編譯器,GCC在所有平臺(tái)上都使用同一個(gè)前端處理程序,產(chǎn)生一樣的中介碼,因此此中介碼在各個(gè)其他平臺(tái)上使用GCC編譯,有很大的機(jī)會(huì)可得到正確無(wú)誤的輸出程序。

結(jié)構(gòu)

GCC的外部接口長(zhǎng)得像一個(gè)標(biāo)準(zhǔn)的Unix編譯器。使用者在命令列下鍵入gcc之程序名,以及一些命令參數(shù),以便決定每個(gè)輸入檔案使用的個(gè)別語(yǔ)言編譯器,并為輸出程序碼使用適合此硬件平臺(tái)的組合語(yǔ)言編譯器,并且選擇性地執(zhí)行連結(jié)器以制造可執(zhí)行的程序。

每個(gè)語(yǔ)言編譯器都是獨(dú)立程序,此程序可處理輸入的原始碼,并輸出組合語(yǔ)言碼。全部的語(yǔ)言編譯器都擁有共通的中介架構(gòu):一個(gè)前端解析符合此語(yǔ)言的原始碼,并產(chǎn)生一抽象語(yǔ)法樹,以及一翻譯此語(yǔ)法樹成為GCC的暫存器轉(zhuǎn)換語(yǔ)言〈RTL〉的后端。編譯器最佳化與靜態(tài)程序碼解析技術(shù)(例如FORTIFY_SOURCE,一個(gè)試圖發(fā)現(xiàn)緩沖區(qū)溢位〈buffer overflow〉的編譯器)在此階段應(yīng)用于程序碼上。最后,適用于此硬件架構(gòu)的組合語(yǔ)言程序碼以Jack Davidson與Chris Fraser發(fā)明的算法產(chǎn)出。

幾乎全部的GCC都由C寫成,除了Ada前端大部分以Ada寫成。

前端接口

前端的功能在于產(chǎn)生一個(gè)可讓后端處理之語(yǔ)法樹。此語(yǔ)法解析器是手寫之遞回語(yǔ)法解析器。

直到最近,程序的語(yǔ)法樹結(jié)構(gòu)尚無(wú)法與欲產(chǎn)出的處理器架構(gòu)脫鉤。而語(yǔ)法樹的規(guī)則有時(shí)在不同的語(yǔ)言前端也不一樣,有些前端會(huì)提供它們特別的語(yǔ)法樹規(guī)則。

在2005年,兩種與語(yǔ)言脫鉤的新型態(tài)語(yǔ)法樹納入GCC中。它們稱為GENERIC與GIMPLE。語(yǔ)法解析變成產(chǎn)生與語(yǔ)言相關(guān)的暫時(shí)語(yǔ)法樹,再將它們轉(zhuǎn)成GENERIC。之后再使用"gimplifier"技術(shù)降低GENERIC的復(fù)雜結(jié)構(gòu),成為一較簡(jiǎn)單的靜態(tài)唯一形式(Static Single Assignment form,SSA)基礎(chǔ)的GIMPLE形式。此形式是一個(gè)與語(yǔ)言和處理器架構(gòu)脫鉤的全域最佳化通用語(yǔ)言,適用于大多數(shù)的現(xiàn)代編程語(yǔ)言。

中介接口

一般編譯器作者會(huì)將語(yǔ)法樹的最佳化放在前端,但其實(shí)此步驟并不看語(yǔ)言的種類而有不同,且不需要用到語(yǔ)法解析器。因此GCC作者們將此步驟歸入通稱為中介階段的部分里。此類的最佳化包括消解死碼、消解重復(fù)運(yùn)算與全域數(shù)值重編碼等。許多最佳化技巧也正在實(shí)作中。

后端接口

GCC后端的行為因不同的前處理器宏和特定架構(gòu)的功能而不同,例如不同的字符尺寸、呼叫方式與大小尾序等。后端接口的前半部利用這些訊息決定其RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉(zhuǎn)換成目標(biāo)架構(gòu)的格式。

GCC的最佳化技巧依其釋出版本而有很大不同,但都包含了標(biāo)準(zhǔn)的最佳化算法,例如循環(huán)最佳化、執(zhí)行緒跳躍、共通程序子句消減、指令排程等等。而RTL的最佳化由于可用的情形較少,且缺乏較高階的資訊,因此比較起近來(lái)增加的GIMPLE語(yǔ)法樹形式[2],便顯得比較不重要。

后端經(jīng)由一重讀取步驟后,利用描述目標(biāo)處理器的指令集時(shí)所取得的資訊,將抽象暫存器替換成處理器的真實(shí)暫存器。此階段非常復(fù)雜,因?yàn)樗仨氷P(guān)照所有GCC可移植平臺(tái)的處理器指令集的規(guī)格與技術(shù)細(xì)節(jié)。

后端的最后步驟相當(dāng)公式化,僅僅將前一階段得到的組合語(yǔ)言碼藉由簡(jiǎn)單的副函式轉(zhuǎn)換其暫存器與內(nèi)存位置成相對(duì)應(yīng)的機(jī)械碼。

基本規(guī)則

gcc所遵循的部分約定規(guī)則:

.c為后綴的文件,C語(yǔ)言源代碼文件;

.a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫(kù)文件;

.C,.cc或.cxx 為后綴的文件,是C++源代碼文件;

.h為后綴的文件,是程序所包含的頭文件;

.i 為后綴的文件,是已經(jīng)預(yù)處理過(guò)的C源代碼文件;

.ii為后綴的文件,是已經(jīng)預(yù)處理過(guò)的C++源代碼文件;

.m為后綴的文件,是Objective-C源代碼文件;

.o為后綴的文件,是編譯后的目標(biāo)文件;

.s為后綴的文件,是匯編語(yǔ)言源代碼文件;

.S為后綴的文件,是經(jīng)過(guò)預(yù)編譯的匯編語(yǔ)言源代碼文件。

執(zhí)行過(guò)程

雖然我們稱Gcc是C語(yǔ)言的編譯器,但使用gcc由C語(yǔ)言源代碼文件生成可執(zhí)行文件的過(guò)程不僅僅是編譯的過(guò)程,而是要經(jīng)歷四個(gè)相互關(guān)聯(lián)的步驟∶預(yù)處理(也稱預(yù)編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和鏈接(Linking)。

命令gcc首先調(diào)用cpp進(jìn)行預(yù)處理,在預(yù)處理過(guò)程中,對(duì)源代碼文件中的文件包含(include)、預(yù)編譯語(yǔ)句(如宏定義define等)進(jìn)行分析。接著調(diào)用cc1進(jìn)行編譯,這個(gè)階段根據(jù)輸入文件生成以.o為后綴的目標(biāo)文件。匯編過(guò)程是針對(duì)匯編語(yǔ)言的步驟,調(diào)用as進(jìn)行工作,一般來(lái)講,.S為后綴的匯編語(yǔ)言源代碼文件和匯編、.s為后綴的匯編語(yǔ)言文件經(jīng)過(guò)預(yù)編譯和匯編之后都生成以.o為后綴的目標(biāo)文件。當(dāng)所有的目標(biāo)文件都生成之后,gcc就調(diào)用。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉