1. 什麼是交叉編譯,為什麼要使用交叉編譯
交叉編譯的概念(來自網路):
簡單地說,就是在一個平台上生成另一個平台上的可執行代碼。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86 linux平台實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平台實際上是Intel x86體系結構和Windows NT for x86操作系統的簡稱。
舉個例子:
我們在Linux系統比如Ubuntu上編寫的C程序完全可以拿到Windows系統上正常運行。
2. 什麼是交叉編譯,為什麼要採用交叉編譯
在一個平台架構上,編譯另一個平台架構的可執行代碼,就是交叉編譯。
例如在x86架構的PC上編譯arm嵌入式設備的可執行程序。
交叉編譯是不得不用,
首先在目標設備的系統還沒引導起來的時候,編譯目標平台的引導程序,顯然只能交叉編譯。
還有因為目標設備往往能力太低,沒法安裝編譯器,或者勉強安裝了,也慢得像蝸牛。
3. 交叉編譯的主機和開發板系統可以不一樣嗎
(1)交叉編譯器
在主機上用來編譯其它類型機器上可執行代碼的編譯器就叫交叉編譯器,我們進行嵌入式linux的開發主機大部分都是X86,而我們的嵌入式系統的處理器有可能是ARM/MIPS等非X86處理器,這時候就必須使用ARM/MIPS的交叉編譯器才能編譯出在這些處理器上能夠執行的代碼。這里我們使用的是ARM最新的EABI編譯器。
交叉編譯器在編譯的時候,對於浮點運行會預設硬浮點運算FPA(float point architecture),而沒有FPA的CPU,比如三星的2440等,會使用FPE(float point emulation即軟浮點),這樣在速度上就會受到極大限制。使用EABI(embeded application binary interface)則可以對此改善處理。
(2)不修改MAKEFILE來建立編譯環境
將arm-2008q3.tar.bz2拷貝到ubuntu系統的某個目錄,解壓後。使用VI編輯/etc/bash.bashrc,在文件最後加入環境變數設置(註:加bin的含義是交叉編譯器工具目錄):
保存後,用source運行一次該文件,就可以了。
(3)gcc: error trying to exec 'cc1': execvp: No such file or directory 的解決
今天在編譯開發板環境時,明明設置好編譯器的環境變數了,編譯時就是會出現:gcc: error trying to exec 'cc1': execvp: No such file or directory 錯誤提示。後來發現一個方法可以解決,輸入:whereis gcc,就可以了發現好幾個gcc,包括/usr/bin/gcc,所以我就把PATH路徑設過去,就OK了。
(4)Clock skew detected. Your build may be incomplete
如果你裝了Windows Linux雙系統,系統時間很可能出問題,從而造成文件修改時間比系統時間晚,兩種辦法:
1,應該是你的PC的系統時鍾錯誤,在BIOS中修改正確。
2,使用touch命令將所有文件的時間戳修改為你系統的當前時間。解決方法:find ./-name "*" -exec touch {} \;
4. 嵌入式Linux開發中的交叉編譯是什麼意思
所謂交叉編譯是指在A系統上編譯B系統的二進制代碼。
嵌入式的應用程序,甚至操作系統是運行在特定目標平台上,例如一塊arm架構的目標板。而編譯程序的時候通常是在普通x86構架下的Linux操作系統的PC上。在PC上編譯嵌入式應用程序的過程叫做交叉編譯。
5. 嵌入式交叉開發環境組成是怎樣的嵌入式系統開發為什麼需要這樣的交叉開發環境而通用計算機的開發不需要
所謂交叉編譯,就是在一種機器結構下編譯的軟體將在另一種完全不同的機器上運行。典型的交叉編譯的例子就是嵌入式系統工程師在自己的個人電腦上編譯後的程序將在ARM,MIPS等等嵌入式工作平台上運行。所以,嵌入式交叉開發環境一般將由個人電腦,PC端嵌入式開發軟體(如支持ARM的mdk,ads,rvds等等),支持硬體調試的硬體調試器及其配套的驅動軟體(如j-link),當然,最重要的還要有嵌入式硬體系統即通俗所謂的開發板。
嵌入式系統之所以要在通用計算機上開發,我想主要還是資源配置的問題,按嵌入式系統的定義,嵌入式系統的軟硬體將是可剪裁的以適用於各種不同的要求。這樣的話,由於硬體平台千差萬別,開發其編譯器將變得不可能,即便開發出來,可能也需要及其繁瑣的配置,大大降低了軟體的可用性。另外就是使用也不方便,大多數嵌入式系統不會配備像PC機一樣適於輸入的鍵盤和較大的屏幕,所以,如果在嵌入式系統上敲代碼,將是一件非常惱火的事情。
6. 交叉編譯器的分類
編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高階語言作為輸入,輸出也是高階語言的編譯器。例如: 自動並行化編譯器經常採用一種高階語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。
預處理器(preprocessor)
作用是通過代入預定義等程序段將源程序補充完整。
編譯器前端(frontend)
前端主要負責解析(parse)輸入的源代碼,由語法分析器和語意分析器協同工作。語法分析器負責把源代碼中的『單詞』(Token)找出來,語意分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句 ,函數等等。 例如「a = b + c;」前端語法分析器看到的是「a, =, b , +, c;」,語意分析器按定義的語法,先把他們組裝成表達式「b + c」,再組裝成「a = b + c」的語句。 前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變數是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstract syntax tree,或 AST),這樣後端可以在此基礎上進一步優化和處理。
編譯器後端(backend)
編譯器後端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。
一般說來所有的編譯器分析,優化,變型都可以分成兩大類:函數內(intraproceral)還是函數之間(interproceral)進行。很明顯,函數間的分析,優化更准確,但需要更長的時間來完成。
7. 什麼是嵌入式設計中的交叉編譯
Compiling a program takes place by running a compiler on the build platform. The compiled program will run on the host platform. Usually these two are the same; if they are different, the process is called cross-compilation.
對一個程序進行編譯的過程要通過在一個操作系統平台(編譯平台)上運行編譯器而完成。被編譯的程序也將運行在一個操作系統平台(運行平台)上,這二個平台通常是相同的,如果二者不同,則這個編譯過程被稱為交叉編譯。
Typically the hardware architecture differs, like for example when compiling a program destined for the MIPS architecture on an x86 computer; but cross-compilation is also applicable when only the operating system environment differs, as when compiling a FreeBSD program under Linux; or even just the system library, as when compiling programs with uClibc on a glibc host.
一般來說交叉編譯被應用在硬體結構不同的機器上,如在x86的計算機上為MIPS體系的機器編譯程序。但交叉編譯也適用於硬體結構相同而操作系統不同的情況,比如在Linux操作系統下為FreeBSD編譯程序。交叉編譯甚至也可以應用於只有系統庫不同的情況下,如在使用glibc的機器上用uClibc編譯程序。
Cross-compilation is typically more involved and prone to errors than with native compilation. Due to this, cross-compiling is normally only utilized if the target is not yet self-hosting (i.e. able to compile programs on its own), unstable, or the build system is simply much faster. For many embedded systems, cross-compilation is simply the only possible way to build programs, as the target hardware does not have the resources or capabilities.
交叉編譯通常比本地編譯更容易引發錯誤。因此,交叉編譯一般只用於目標平台不能自洽(比如說,目標平台無法完成程序編譯),不穩定或者編譯平台速度更快的情況下。對大多數嵌入式系統來說,由於目標平台的執行能力或系統資源有限,交叉編譯是唯一可行的編譯方式。
8. 嵌入式系統開發為什麼要採用交叉編譯的方式
由於嵌入式系統資源匱乏,一般不能像PC一樣安裝本地編譯器和調試器,不能在本地編寫、編譯和調試自身運行的程序,而需藉助其它系統如PC來完成這些工作,這樣的系統通常被稱為宿主機。宿主機通常是Linux系統,並安裝交叉編譯器、調試器等工具;宿主機也可以是Windows系統,安裝嵌入式Linux集成開發環境。在宿主機上編寫和編譯代碼,通過串口、網口或者硬體調試器將程序下載到目標系統裡面運行。所謂的交叉編譯,就是在宿主機平台上使用某種特定的交叉編譯器,為某種與宿主機不同平台的目標系統編譯程序,得到的程序在目標系統上運行而非在宿主機本地運行。這里的平台包含兩層含義:一是核心處理器的架構,二是所運行的系統,這樣,交叉編譯有3種情形:(1)目標系統與宿主機處理器相同,運行不同的系統;(2)目標系統與宿主機處理器不同,運行相同的系統;(3)目標系統與宿主機處理器不同,運行不同的系統。實際上,在PC機上進行非Linux的嵌入式開發,哪怕使用IDE集成環境如Keil、ADS、Realview,都是交叉編譯和調試的過程,只是IDE工具隱藏了細節,沒有明確提出這個概念而已。