① 什麼是嵌入式設計中的交叉編譯
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.
交叉編譯通常比本地編譯更容易引發錯誤。因此,交叉編譯一般只用於目標平台不能自洽(比如說,目標平台無法完成程序編譯),不穩定或者編譯平台速度更快的情況下。對大多數嵌入式系統來說,由於目標平台的執行能力或系統資源有限,交叉編譯是唯一可行的編譯方式。
② 嵌入式軟體開發中,交叉編譯怎麼理解
運行在開發板上的程序是在上位機(電腦)上編寫和編譯的;即在電腦上生成二進制或十六進制可執行文件,在開發板上運行驗證,所以叫交叉編譯。
③ 嵌入式高手進,如何交叉編譯匯編程序
gcc 包括所有的東西了
包括預處理,編譯,匯編,鏈接
參數不同而已
④ linux嵌入式中的靜態交叉編譯是什麼意思
應該說是分為靜態和動態的
靜態就是把需要的庫文件也直接編譯進去
動態則是在需要的時候才去調用,本身不編譯進去
⑤ 嵌入式怎麼實現交叉編譯
可以在linux的系統上,安裝交叉編譯工具,編譯後,在目標機上運行~
⑥ 嵌入式系統開發為什麼要採用交叉編譯的方式
由於嵌入式系統資源匱乏,一般不能像PC一樣安裝本地編譯器和調試器,不能在本地編寫、編譯和調試自身運行的程序,而需藉助其它系統如PC來完成這些工作,這樣的系統通常被稱為宿主機。宿主機通常是Linux系統,並安裝交叉編譯器、調試器等工具;宿主機也可以是Windows系統,安裝嵌入式Linux集成開發環境。在宿主機上編寫和編譯代碼,通過串口、網口或者硬體調試器將程序下載到目標系統裡面運行。所謂的交叉編譯,就是在宿主機平台上使用某種特定的交叉編譯器,為某種與宿主機不同平台的目標系統編譯程序,得到的程序在目標系統上運行而非在宿主機本地運行。這里的平台包含兩層含義:一是核心處理器的架構,二是所運行的系統,這樣,交叉編譯有3種情形:(1)目標系統與宿主機處理器相同,運行不同的系統;(2)目標系統與宿主機處理器不同,運行相同的系統;(3)目標系統與宿主機處理器不同,運行不同的系統。實際上,在PC機上進行非Linux的嵌入式開發,哪怕使用IDE集成環境如Keil、ADS、Realview,都是交叉編譯和調試的過程,只是IDE工具隱藏了細節,沒有明確提出這個概念而已。
⑦ 關於嵌入式linux的交叉編譯環境問題
既然用arm-linux-gcc -v顯示版本出來了,那你的交叉編譯器是裝好了的,現在你編不過去的原因可能有兩個:
1.環境變數問題,如果你改了普通用戶用下的環境變數,那你的交叉編譯器只能在普通用戶下認到,同理,超級用戶的也是如此,如果你想在普通用戶和超級用戶都能認到交叉編譯器,那你得改etc下的環境變數
2.編譯uboot的許可權問題,編譯uboot里的有些文件是需要超級用戶許可權的,如果你不是在超級用戶下編,是編不過去的
PS:即使有了超級用戶許可權,如果第一個問題沒解決好,那也是編不過去的
如果上面兩個問題都解決了還是編不過去,那就是你的uboot有問題了,你可以去uboot的官方下個標準的過來編下看看,不用你買的板子配的uboot
⑧ Linux嵌入式交叉編譯工具鏈問題 淺談
交叉編譯工具鏈是一個由編譯器、連接器和解釋器組成的綜合開發環境,交叉編譯工具鏈主要由binutils、gcc和glibc 3個部分組成。有時出於減小libc庫大小的考慮,也可以用別的c庫來代替glibc,例如uClibc、dietlibc和newlib。交叉編譯工具鏈主要包括針對目標系統的編譯器gcc、目標系統的二進制工具binutils、目標系統的標准c庫glibc和目標系統的Linux內核頭文件。第一個步驟就是確定目標平台。每個目標平台都有一個明確的格式,這些信息用於在構建過程中識別要使用的不同工具的正確版本。因此,當在一個特定目標機下運行GCC時,GCC便在目錄路徑中查找包含該目標規范的應用程序路徑。GNU的目標規范格式為CPU-PLATFORM-OS。例如,建立基於ARM平台的交叉工具鏈,目標平台名為arm-linux-gnu。
分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。
通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈。
直接通過網上(ftp.arm.kernel.org.uk)下載已經製作好的交叉編譯工具鏈。
方法1相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法2或方法3構建交叉工具鏈。方法3的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名的錯誤,建議你慎用此方法。
方法1:分步構建交叉編譯工具鏈
下載所需的源代碼包
建立工作目錄
建立環境變數
編譯、安裝Binutils
獲取內核頭文件
編譯gcc的輔助編譯器
編譯生成glibc庫
編譯生成完整的gcc
由於在問答中的篇幅,我不能細述具體的步驟,興趣的同學請自行閱讀開源共創協議的《Linux from scratch》,網址是:linuxfromscratch dot org
。
Crosstool是一組腳本工具集,可構建和測試不同版本的gcc和glibc,用於那些支持glibc的體系結構。它也是一個開源項目,下載地址是kegel dot com/crosstool。用Crosstool構建交叉工具鏈要比上述的分步編譯容易得多,並且也方便許多,對於僅僅為了工作需要構建交叉編譯工具鏈的你,建議使用此方法。
運行which makeinfo,如果不能找見該命令,在解壓texinfo-4.11.tar.bz2,進入texinfo-4.11目錄,執行./configure&&make&&make install完成makeinfo工具的安裝
下載所需資源文件linux-2.4.20.tar.gz、binutils-2.19.tar.bz2、gcc-3.3.6.tar.gz、glibc- 2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz和gdb-6.5.tar.bz2。然後將這些工具包文件放在新建的$HOME/downloads目錄下,最後在$HOME/目錄下解壓crosstool-0.43.tar.gz,命
令如下:
#cd$HOME/
#tar–xvzfcrosstool-0.43.tar.gz
建立腳本文件
接著需要建立自己的編譯腳本,起名為arm.sh,為了簡化編寫arm.sh,尋找一個最接近的腳本文件demo-arm.sh作為模板,然後將該腳本的內容復制到arm.sh,修改arm.sh腳本,具體操作如下:
# cd crosstool-0.43
# cp demo-arm.sh arm.sh
# vi arm.sh
修改後的arm.sh腳本內容如下:
#!/bin/sh
set-ex
TARBALLS_DIR=$HOME/downloads#定義工具鏈源碼所存放位置。
RESULT_TOP=$HOME/arm-bin#定義工具鏈的安裝目錄
exportTARBALLS_DIRRESULT_TOP
GCC_LANGUAGES="c,c++"#定義支持C,C++語言
exportGCC_LANGUAGES
#創建/opt/crosstool目錄
mkdir-p$RESULT_TOP
#編譯工具鏈,該過程需要數小時完成。
eval'catarm.datgcc-3.3.6-glibc-2.3.2.dat'shall.sh--notest
echoDone.
在arm.sh腳本文件中需要注意arm-xscale.dat和gcc-3.3.6-glibc-2.3.2.dat兩個文件,這兩個文件是作為Crosstool的編譯的配置文件。其中arm.dat文件內容如下,主要用於定義配置文件、定義生成編譯工具鏈的名稱以及定義編譯選項等。
KERNELCONFIG='pwd'/arm.config#內核的配置
TARGET=arm-linux#編譯生成的工具鏈名稱
TARGET_CFLAGS="-O"#編譯選項
gcc-3.3.6-glibc-2.3.2.dat文件內容如下,該文件主要定義編譯過程中所需要的庫以及它定義的版本,如果在編譯過程中發現有些庫不存在時,Crosstool會自動在相關網站上下載,該工具在這點上相對比較智能,也非常有用。
BINUTILS_DIR=binutils-2.19
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.10-8(根據實際情況填寫)
GDB_DIR=gdb-6.5
執行腳本
將Crosstool的腳本文件和配置文件准備好之後,開始執行arm.sh腳本來編譯交叉編譯工具。具體執行命令如下:
#cdcrosstool-0.43
#./arm.sh
經過數小時的漫長編譯之後,會在/opt/crosstool目錄下生成新的交叉編譯工具,其中包括以下內容:
arm-linux-addr2linearm-linux-g++arm-linux-ldarm-linux-size
arm-linux-ararm-linux-gccarm-linux-nmarm-linux-strings
arm-linux-asarm-linux-gcc-3.3.6arm-linux-objarm-linux-strip
arm-linux-c++arm-linux-gccbugarm-linux-objmpfix-embedded-paths
arm-linux-c++filtarm-linux-gcovarm-linux-ranlib
arm-linux-cpparm-linux-gprofarm-linux-readelf
然後將生成的編譯工具鏈路徑添加到環境變數PATH上去,添加的方法是在系統/etc/ bashrc文件的最後添加下面一行,在bashrc文件中添加環境變數
export PATH=/home/jiabing/gcc-3.3.6-glibc-2.3.2/arm-linux-bin/bin:$PATH
至此,arm-linux下的交叉編譯工具鏈已經完成,現在就可以使用arm-linux-gcc來生成試驗箱上的程序了!
⑨ 嵌入式Linux開發中的交叉編譯是什麼意思
所謂交叉編譯是指在A系統上編譯B系統的二進制代碼。
嵌入式的應用程序,甚至操作系統是運行在特定目標平台上,例如一塊arm架構的目標板。而編譯程序的時候通常是在普通x86構架下的Linux操作系統的PC上。在PC上編譯嵌入式應用程序的過程叫做交叉編譯。
⑩ 如何為嵌入式開發建立交叉編譯環境
下載源文件、補丁和建立編譯的目錄
1. 選定軟體版本號
選擇軟體版本號時,先看看glibc源代碼中的INSTALL文件。那裡列舉了該版本的glibc編譯時所需的binutils 和gcc的版本號。例如在 glibc-2.2.3/INSTALL 文件中推薦 gcc 用 2.95以上,binutils 用 2.10.1 以上版本。
我選的各個軟體的版本是:
linux-2.4.21+rmk2
binutils-2.10.1
gcc-2.95.3
glibc-2.2.3
glibc-linuxthreads-2.2.3
如果你選的glibc的版本號低於2.2,你還要下載一個叫glibc-crypt的文件,例如glibc-crypt-2.1.tar.gz。 Linux 內核你可以從www.kernel.org 或它的鏡像下載。
Binutils、gcc和glibc你可以從FSF的FTP站點ftp://ftp.gun.org/gnu/ 或它的鏡像去下載。在編譯glibc時,要用到 Linux 內核中的 include 目錄的內核頭文件。如果你發現有變數沒有定義而導致編譯失敗,你就改變你的內核版本號。例如我開始用linux-2.4.25+vrs2,編譯glibc-2.2.3 時報 BUS_ISA 沒定義,後來發現在 2.4.23 開始它的名字被改為 CTL_BUS_ISA。如果你沒有完全的把握保證你改的內核改完全了,就不要動內核,而是把你的 Linux 內核的版本號降低或升高,來適應 glibc。
Gcc 的版本號,推薦用 gcc-2.95 以上的。太老的版本編譯可能會出問題。Gcc-2.95.3 是一個比較穩定的版本,也是內核開發人員推薦用的一個 gcc 版本。
如果你發現無法編譯過去,有可能是你選用的軟體中有的加入了一些新的特性而其他所選軟體不支持的原因,就相應降低該軟體的版本號。例如我開始用 gcc-3.3.2,發現編譯不過,報 as、ld 等版本太老,我就把 gcc 降為 2.95.3。太新的版本大多沒經過大量的測試,建議不要選用。
回頁首
2. 建立工作目錄
首先,我們建立幾個用來工作的目錄:
在你的用戶目錄,我用的是用戶liang,因此用戶目錄為 /home/liang,先建立一個項目目錄embedded。
$pwd
/home/liang
$mkdir embedded
再在這個項目目錄 embedded 下建立三個目錄 build-tools、kernel 和 tools。
build-tools-用來存放你下載的 binutils、gcc 和 glibc 的源代碼和用來編譯這些源代碼的目錄。
kernel-用來存放你的內核源代碼和內核補丁。
tools-用來存放編譯好的交叉編譯工具和庫文件。
$cd embedded
$mkdir build-tools kernel tools
執行完後目錄結構如下:
$ls embedded
build-tools kernel tools
3. 輸出和環境變數
我們輸出如下的環境變數方便我們編譯。
$export PRJROOT=/home/liang/embedded
$export TARGET=arm-linux
$export PREFIX=$PRJROOT/tools
$export TARGET_PREFIX=$PREFIX/$TARGET
$export PATH=$PREFIX/bin:$PATH
如果你不慣用環境變數的,你可以直接用絕對或相對路徑。我如果不用環境變數,一般都用絕對路徑,相對路徑有時會失敗。環境變數也可以定義在.bashrc文件中,這樣當你logout或換了控制台時,就不用老是export這些變數了。
體系結構和你的TAEGET變數的對應如下表
你可以在通過glibc下的config.sub腳本來知道,你的TARGET變數是否被支持,例如:
$./config.sub arm-linux
arm-unknown-linux-gnu
在我的環境中,config.sub 在 glibc-2.2.3/scripts 目錄下。
網上還有一些 HOWTO 可以參考,ARM 體系結構的《The GNU Toolchain for ARM Target HOWTO》,PowerPC 體系結構的《Linux for PowerPC Embedded Systems HOWTO》等。對TARGET的選取可能有幫助。
4. 建立編譯目錄
為了把源碼和編譯時生成的文件分開,一般的編譯工作不在的源碼目錄中,要另建一個目錄來專門用於編譯。用以下的命令來建立編譯你下載的binutils、gcc和glibc的源代碼的目錄。
$cd $PRJROOT/build-tools
$mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch
build-binutils-編譯binutils的目錄
build-boot-gcc-編譯gcc 啟動部分的目錄
build-glibc-編譯glibc的目錄
build-gcc-編譯gcc 全部的目錄
gcc-patch-放gcc的補丁的目錄
gcc-2.95.3 的補丁有 gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch 和gcc-2.95.3-returntype-fix.patch,可以從 http://www.linuxfromscratch.org/ 下載到這些補丁。
再將你下載的 binutils-2.10.1、gcc-2.95.3、glibc-2.2.3 和 glibc-linuxthreads-2.2.3 的源代碼放入 build-tools 目錄中
看一下你的 build-tools 目錄,有以下內容:
$ls
binutils-2.10.1.tar.bz2 build-gcc gcc-patch
build-binutls build-glibc glibc-2.2.3.tar.gz
build-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz