溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

嵌入式C語(yǔ)言編譯器

發(fā)布時(shí)間:2020-08-01 13:58:56 來(lái)源:網(wǎng)絡(luò) 閱讀:1933 作者:三九感冒靈 欄目:系統(tǒng)運(yùn)維

1.嵌入式C語(yǔ)言編譯器

1.1 GCC與gcc

上述兩者的區(qū)別:
GCC(GUN Compiler Colletion),是指GUN編譯器集合包含眾多語(yǔ)言得到編譯器如C語(yǔ)言(gcc),C++(g++),Java語(yǔ)言(jdk)、D語(yǔ)言(gdc)、等
gcc 則指的是單純的C語(yǔ)言編譯器
當(dāng)代的嵌入式開(kāi)發(fā)已經(jīng)和傳統(tǒng)的嵌入式開(kāi)發(fā)不同,硬件性能的提升使其越來(lái)越接近桌面開(kāi)發(fā),使用的開(kāi)發(fā)語(yǔ)言也越來(lái)越多樣,內(nèi)核和驅(qū)動(dòng)開(kāi)發(fā)使用C語(yǔ)言,應(yīng)用開(kāi)發(fā)使用gcc/g++/gdc等。

1.2交叉編譯

兩種開(kāi)發(fā)模式:
A.非嵌入式開(kāi)發(fā):A(類)機(jī)編寫(源代碼)、編譯得到可執(zhí)行程序,發(fā)布給A(類)機(jī)運(yùn)行。
B.嵌入式開(kāi)發(fā) :A(類)機(jī)編寫(源代碼)、編譯得到可執(zhí)行程序,發(fā)布給B(類)機(jī)運(yùn)行。
為何使用交叉編譯
嵌入式產(chǎn)品由于資源受限,不能直接在嵌入式產(chǎn)品上進(jìn)行編程,所以選擇在PC主機(jī)上進(jìn)行源碼編寫和編譯,最終生成在嵌入式設(shè)備上運(yùn)行的程序。
交叉編譯可以用高性能機(jī)器為低性能機(jī)器開(kāi)發(fā)軟件(包括裸機(jī)軟件、系統(tǒng)級(jí)和應(yīng)用級(jí)軟件)
交叉編譯特點(diǎn):
必須使用專用的交叉編譯工具鏈。由于可執(zhí)行程序不能本地運(yùn)行調(diào)試,因此必須配合一定手段(專用調(diào)試器、JTAG調(diào)試器、USB下載、串口下載、SD啟動(dòng)、網(wǎng)絡(luò)共享等)將可執(zhí)行程序加載到目標(biāo)嵌入式設(shè)備上運(yùn)行及調(diào)試。
gcc如何進(jìn)行交叉編譯?
配置目標(biāo)主機(jī)的編譯工具鏈(如arm-linux),配置工具鏈的具體版本。
根據(jù)具體的目標(biāo)代碼選擇相應(yīng)的工具鏈版本
正確使用關(guān)于硬件體系結(jié)構(gòu)的特殊編譯選項(xiàng)
大型企業(yè)嵌入式開(kāi)發(fā)環(huán)境:
嵌入式C語(yǔ)言編譯器

1.3編譯過(guò)程

我們通常所將的編譯器實(shí)際上是指廣義的編譯器,包含下面四個(gè)部分:
嵌入式C語(yǔ)言編譯器
整個(gè)編譯過(guò)程如下面所示:
嵌入式C語(yǔ)言編譯器
預(yù)處理器完成:頭文件原地展開(kāi)、宏定義替換、注釋刪除工作。
編譯器(狹義上的):完成各種語(yǔ)言到目標(biāo)平臺(tái)的會(huì)變文件的翻譯工作。
匯編器:將平臺(tái)回避那文件編譯成最終的二進(jìn)制文件(.O文件)
鏈接器:將最終的二進(jìn)制文件按照連接腳本的內(nèi)容,鏈接稱為最中的可執(zhí)行文件Linux中為elf文件。
整個(gè)過(guò)程:源碼.c->(預(yù)處理)->預(yù)處理過(guò)的.i源文件->(編譯)->匯編文件.S->(匯編)->目標(biāo)文件.o->(鏈接)->elf可執(zhí)行程序

1.4多語(yǔ)言混合開(kāi)發(fā)

多語(yǔ)言混合開(kāi)發(fā)時(shí)當(dāng)×××發(fā)中常見(jiàn)的開(kāi)發(fā)方式,優(yōu)勢(shì)在于節(jié)省人力成本,提高開(kāi)發(fā)效率。
方式一:目標(biāo)平臺(tái)匯編文件的統(tǒng)一
嵌入式C語(yǔ)言編譯器
行業(yè)案例:
嵌入式C語(yǔ)言編譯器
方式二:目標(biāo)平臺(tái)二進(jìn)制文件的統(tǒng)一
嵌入式C語(yǔ)言編譯器
行業(yè)案例:
嵌入式C語(yǔ)言編譯器
方式三:利用進(jìn)程間通信進(jìn)行協(xié)同
嵌入式C語(yǔ)言編譯器
行業(yè)案例:
嵌入式C語(yǔ)言編譯器

1.5 gcc 編譯選項(xiàng)

預(yù)處理指令: gcc -E file.c -o file.i
編譯指令 : gcc -S file.i -o file.s
匯編指令 : gcc -c file.s -o file.o

生成映射文件: gcc test.c -Wl,-Map=test.map (注意逗號(hào)后面沒(méi)有空格)
宏定義:gcc test.c -D 'TEST="PENGCHAO"' gcc test.c -D TEST=110
獲取系統(tǒng)頭文件路徑; gcc -v file.c

獲取目標(biāo)的完整依賴關(guān)系:gcc -M test.c
獲取目標(biāo)的部分依賴關(guān)系:gcc -MM test.c

制定庫(kù)文件及庫(kù)文件的搜索路徑
-L 指令庫(kù)文件搜索路徑
-l 指定庫(kù)文件名
gcc test.c -L -lfunc

靜態(tài)庫(kù)生成命令:ar -rc libfunc.a func.o
動(dòng)態(tài)庫(kù)生成命令:gcc func.c -o func.o -c -fPIC
gcc -o libfunc.so func.o -shared
nm命令也很有用,它可以用來(lái)查看一個(gè).a文件中都有哪些符號(hào)
ldd命令:作用是可以在一個(gè)使用了共享庫(kù)的程序執(zhí)行之前解析出這個(gè)程序使用了哪些共享庫(kù),并且查看這些共享庫(kù)是否能被找到,能被解析(決定這個(gè)程序是否能正確執(zhí)行)。
注意:動(dòng)態(tài)鏈接庫(kù)運(yùn)行時(shí)需要被加載(運(yùn)行時(shí)環(huán)境在執(zhí)行test程序的時(shí)候發(fā)現(xiàn)他動(dòng)態(tài)鏈接了libfunc.so,于是乎會(huì)去固定目錄(/user/lib)嘗試加載libfunc.so,如果加載失敗則會(huì)打?。篹rror while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
解決辦法:
A.將動(dòng)態(tài)庫(kù)文件拷貝到系統(tǒng)庫(kù)文件目錄(不推薦)
B.將動(dòng)態(tài)庫(kù)文件所在目錄導(dǎo)出到環(huán)境變量LD_LIBRARY_PATH,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path_name

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI