我与乡下少妇的性事_色琪琪综合男人的天堂aⅴ视频_大胸喂奶秘书3p高h_国产一区二区视频在线播放_国产老头gay和老头gay视频_中文字幕亚洲欧美_国产男人搡女人免费视频_伊人色综合久久天天五月婷_崔雪莉被金秀贤握胸动态图_毛片在线视频观看

首頁(yè) > 技術(shù)發(fā)展 > 嵌入式開(kāi)發(fā) | 什么是交叉編譯(CROSS_COMPILE)

嵌入式開(kāi)發(fā) | 什么是交叉編譯(CROSS_COMPILE)

時(shí)間:2020-06-27 來(lái)源:方正智芯 瀏覽:

在嵌入式系統(tǒng)開(kāi)發(fā)中,經(jīng)常會(huì)聽(tīng)到一個(gè)詞:交叉編譯。到底什么是"交叉編譯"呢?為什么要使用"交叉編譯"呢?今天這篇文章,我們來(lái)討論下這個(gè)話(huà)題。

在討論交叉編譯之前,我們先來(lái)聊聊編譯。

1、編譯

在程序開(kāi)發(fā)中,使用高級(jí)語(yǔ)言編寫(xiě)的代碼被稱(chēng)為源代碼,比如用C語(yǔ)言編寫(xiě)的后綴名為.c的文件,或者C++編寫(xiě)的后綴名為.cpp的文件。源代碼不能被機(jī)器執(zhí)行,必須轉(zhuǎn)換成二進(jìn)制的機(jī)器代碼(指令+數(shù)據(jù))才能被CPU執(zhí)行。將源代碼轉(zhuǎn)換成機(jī)器代碼的過(guò)程稱(chēng)為編譯(Compile),編譯的工作需要編譯器(Complier)來(lái)完成。

編譯器對(duì)源代碼進(jìn)行語(yǔ)法檢查,只有沒(méi)有語(yǔ)法錯(cuò)誤的源代碼才能被編譯通過(guò)。源代碼經(jīng)過(guò)編譯后,并沒(méi)有生成最終的可執(zhí)行文件,而是生成一種被稱(chēng)為目標(biāo)文件(Object File)的中間文件。比如,Visual C++的目標(biāo)文件后綴名為.obj,而GCC的目標(biāo)文件后綴名為.o

源代碼可能包含多個(gè)源文件,比如main.c/fun1.c/fun2.c等等,編譯器會(huì)對(duì)源文件逐個(gè)進(jìn)行編譯。因此,有幾個(gè)源文件,就會(huì)生成幾個(gè)目標(biāo)文件;

目標(biāo)文件并不能被執(zhí)行,因?yàn)樗赡艽嬖谝恍﹩?wèn)題,比如源文件之間的引用關(guān)系導(dǎo)致的問(wèn)題。

舉個(gè)例子:文件A.c引用了文件B.c中的變量"EXT_someflag",A.c和B.c分別編譯生成A.o和B.o,A.o中并沒(méi)有變量"EXT_someflag"的定義,必須依靠B.o才能形成完整的代碼。

同樣的情況表現(xiàn)在源代碼對(duì)庫(kù)函數(shù)的引用。

把經(jīng)過(guò)編譯后生成的目標(biāo)文件,按照其內(nèi)在引用關(guān)系彼此相連接而生成一個(gè)完整的、可執(zhí)行的文件的過(guò)程稱(chēng)為鏈接。

鏈接工作由鏈接器完成。

因此,源文件生成可執(zhí)行文件要經(jīng)過(guò)編譯和鏈接兩個(gè)步驟才能完成。為了方便,我們也把這個(gè)過(guò)程統(tǒng)稱(chēng)為編譯。本文的主題"交叉編譯"也是包含了編譯和鏈接的步驟,不再贅述。

與交叉編譯相對(duì)應(yīng)的是"本地編譯(native compile")。

理解本地編譯有助于更好地理解交叉編譯,所以,我們先來(lái)看看什么是本地編譯?

2、本地編譯

所謂"本地編譯",是指編譯源代碼的平臺(tái)和執(zhí)行源代碼編譯后程序的平臺(tái)是同一個(gè)平臺(tái)。這里的平臺(tái),可以理解為CPU架構(gòu)+操作系統(tǒng)。比如,在Intel x86架構(gòu)/Windows 10平臺(tái)下、使用Visual C++編譯生成的可執(zhí)行文件,在同樣的Intel x86架構(gòu)/Windows 10下運(yùn)行。

3、交叉編譯

所謂"交叉編譯(Cross_Compile)",是指編譯源代碼的平臺(tái)和執(zhí)行源代碼編譯后程序的平臺(tái)是兩個(gè)不同的平臺(tái)。比如,在Intel x86架構(gòu)/Linux(Ubuntu)平臺(tái)下、使用交叉編譯工具鏈生成的可執(zhí)行文件,在A(yíng)RM架構(gòu)/Linux下運(yùn)行。

交叉編譯是相對(duì)復(fù)雜的,必須考慮如下幾個(gè)問(wèn)題:

  1. CPU架構(gòu):比如ARM,x86,MIPS等等;

  2. 字節(jié)序:大端(big-endian)和小端(little-endian);

  3. 浮點(diǎn)數(shù)的支持;

  4. 應(yīng)用程序二進(jìn)制接口(Application Binary Interface,ABI);

為什么要使用交叉編譯呢?主要有兩個(gè)原因:

  1. 交叉編譯的目標(biāo)系統(tǒng)一般都是內(nèi)存較小、顯示設(shè)備簡(jiǎn)陋甚至沒(méi)有,沒(méi)有能力在其上進(jìn)行本地編譯;

  2. 有能力進(jìn)行源代碼編譯的平臺(tái)CPU架構(gòu)或操作系統(tǒng)與目標(biāo)平臺(tái)不同;

交叉編譯工具鏈?zhǔn)沁M(jìn)行交叉編譯的必不可少的工具,是嵌入式開(kāi)發(fā)人員必須熟練掌握的技能。我們會(huì)在后續(xù)文章中對(duì)交叉編譯工具鏈進(jìn)行介紹。

版權(quán):如無(wú)特殊注明,文章轉(zhuǎn)載自網(wǎng)絡(luò),侵權(quán)請(qǐng)聯(lián)系cnmhg168#163.com刪除!文件均為網(wǎng)友上傳,僅供研究和學(xué)習(xí)使用,務(wù)必24小時(shí)內(nèi)刪除。
相關(guān)推薦