當前位置:首頁 » 編程軟體 » 交叉編譯工具怎麼樣

交叉編譯工具怎麼樣

發布時間: 2023-09-23 01:20:23

1. 為什麼要用交叉編譯

交叉編譯,簡單地說,就是在一個平台上生成另一個平台上的可執行代碼。這里需要注意的是所謂平台,實際上包含兩個概念:體系結構(Architecture)、操作系統(Operating System)。同一個體系結構可以運行不同的操作系統;同樣,同一個操作系統也可以在不同的體系結構上運行。舉例來說,我們常說的x86 linux平台實際上是Intel x86體系結構和Linux for x86操作系統的統稱;而x86 WinNT平台實際上是Intel x86體系結構和Windows NT for x86操作系統的簡稱。

有時是因為目的平台上不允許或不能夠安裝我們所需要的編譯器,而我們又需要這個編譯器的某些特徵;有時是因為目的平台上的資源貧乏,無法運行我們所需要編譯器;有時又是因為目的平台還沒有建立,連操作系統都沒有,根本談不上運行什麼編譯器。
綜上,在嵌入式開發的時候我們就要使用交叉編譯器。

2. arm-none-linux-gnueabi交叉工具鏈與arm-linux-gcc 有區別嗎

eabi標準的要好些,可能arm-linux-gcc就是arm-none-linux-gnueabi的一個鏈接
終於,郁悶已久的問題攻破了,用了三種配置交叉編譯的方法,最終在開發板上實現成功了,現在想一想,有的時候真的也是運氣。

之前已經試驗過使用arm-linux-gcc-3.4.1配置交叉編譯編譯環境,配置成功了,在開發板上失敗了~

後來使用腳本創建交叉編譯環境(crosstool-0.43),配置成功了(這個用了相當長的時間),在開發板上失敗了~

終於,在一個偶然的機會(其實是瀏覽無數網頁後),我終於找到了一個好的方法,並成功在開發板上運行。先說一下網上的一些方法,有些所謂的默認安裝了一些程序,但是在實際運行時發現根本沒有安裝,而且很多地方不知道該如何安裝。再有就是文章一上來就說安裝什麼什麼軟體,但是在網上搜根本找不到。只能說很多人只轉載文章,根本沒有試驗過。但是我還是幸運的找到了一個靠譜的文章http://www.adamjiang.com/pukiwiki/index.php?%E7%BC%96%E8%AF%91mini2440%E5%B7%A5%E5%85%B7%E9%93%BE

根據上面的做法,我成功了,在此小做總結。

首先下載工具鏈,幸好這篇文章給出了這個網站,要不還不知道要找多久。

http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

70多M很快就下完了,若不是root用戶下,可以將文件解壓到home的某個目錄下。

tar xjvfo arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /home/..../arm

那麼,在這個目錄下會生成一個arm-2008q3文件夾

更改路徑不用說了,或者臨時或者非臨時。我就直接改~/.bashrc了,在最後加:

export PATH=/usr/local/arm-2008q3/bin:${PATH}

ok~現在使你路徑生效吧:

source ~/.bashrc

再輸入:export CROSS_COMPILE=arm-none-linux-gnueabi-

作用是:當你編譯軟體的時候,Makefile在大多數情況向會取得CROSS_COMPILE所指定的交叉編譯工具。

也可以輸入:export CROSS_COMPILE=/usr/local/arm-2008q3/bin/arm-none-linux-gnueabi-

這種種方法是通過絕對路徑來指定交叉編譯工具,這樣做可以更精確的為交叉編譯定位,同時可以避免很多錯誤。你可以通過下面這樣的例子指定交叉編譯工具的絕對路徑。

現在一切就緒,隨便編譯個hello world.c文件,用arm-none-linux-gnueabi-gcc helloworld.c -o helloworld,生成的helloworld文件通過nfs掛載到板子上。

最最後,在minicom下輸入:./helloworld。

就會顯示你希望見到的輸出了。。。。。。

首先,從下面的地址下載工具鏈

http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

等待下載完成後,將工具鏈解壓到/usr/local/目錄,如果你沒有編譯主機上的root許可權的話,你可以將工具鏈解壓到Linux用戶的home目錄中的某個位置(比如${HOME}/bin)

tar xjvfo arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /usr/local
這個操作將會在/usr/local目錄中創建一個么名為arm-2008q3的目錄。

接下來,你需要將這個新進添加的工具鏈的位置添加到PATH變數之中。編譯你的~/.bashrc文件,在其中加入新的PATH變數

export PATH=/usr/local/arm-2008q3/bin:${PATH}
使用source命令在當前shell中啟用這個變化,這樣你就不需要重新登入系統使用新變數了。

source ~/.bashrc
或者直接在shell中使用export對當前shell做同樣的操作。

export PATH=/usr/local/arm-2008q3/bin:${PATH}
如果你並不是bash用戶,你可以修改你使用的shell所對應的環境設置文件,比如,對於zsh來說,您應該修改~/.zsh文件。或者,你需要在每次登入shell後首先運行上面的export操作。

因為在開發主機上進行交叉編譯意味著使用開發主機的能力生成另外一個體系結構上運行的二進制代碼,所以,一般來說,你需要編譯的軟體通常都會接受一個叫做CROSS_COMPILE的變數來指定產生哪個體系結構的代碼。所以,配置工具鏈的最後一個步驟就是設置這個變數。如果你現在使用ls命令查看以下

ls /usr/local/arm-2008q3/bin/
目錄的話,你會看到很多以arm-none-linux-gnueabi-開始的可執行文件,而這個共同的前綴就是你需要的CROSS_COMPILE變數。現在,使用export命令設置環境變數

export CROSS_COMPILE=arm-none-linux-gnueabi-
現在,當你編譯軟體的時候,Makefile在大多數情況向會取得CROSS_COMPILE所指定的交叉編譯工具。當然,前提是,這些交叉編譯工具在你的PATH變數上。還有一種方法是通過絕對路徑來指定交叉編譯工具,這樣做可以更精確的為交叉編譯定位,同時可以避免很多錯誤。你可以通過下面這樣的例子指定交叉編譯工具的絕對路徑。

export CROSS_COMPILE=/usr/local/arm-2008q3/bin/arm-none-linux-gnueabi-
在大多數情況下,你並不需要將上面的export命令加入~/.bashrc這樣的文件,因為,你並不總是需要它們來做交叉編譯。比如,你僅僅希望編譯運行在開發主機上的程序時。

這樣,工具鏈就准備好了。

3. 關於交叉編譯工具鏈的問題

核心轉儲是崩潰報告的一個過程,他只是把當前崩潰的信息轉存出來方便差錯。而且這個核心轉儲幾個字也不過是個提示輸出信息。這個提示不會給與任何與錯誤相關的內容,必須看其他的錯誤信息或者他轉儲出來的東西來分析。
不過核心轉儲,應該是程序運行出錯而崩潰。這種問題出現在你正在運行的程序,而不是編譯過程出現的編譯錯誤(也就是說,出現核心轉儲應該就是 GCC 或者他調用的程序自己崩潰了)。出現這個問題的原因很多。

如果是因為沒有找到某些 header 文件,不應該是核心轉儲錯誤,而是編譯器或者某個過程提示錯誤信息後退出,他會輸出錯誤信息告訴你問題所在。

至於你編譯的這些東西版本都比較老,我建議還是嘗試降級整個系統來編譯、運行你現在的這些東西。或者升級你這個交叉編譯工具鏈到當前主流的版本來用。

至於交叉工具連當中的 GCC 和你當前本機的 GCC,完全是兩個互相獨立的 GCC 。
只是他們編譯輸出的二進製程序針對的指令集不同而已。相對的 binutils 和 glibc 和 kernel-header 都是一樣的意思,針對目標而輸出的相關程序。當然 glibc 和 kernel-header 主要是以「數據」方式存在,gcc 和 binutils 主要是以可以運行的程序方式存在(當然不是絕對的,比如 gcc 還會提供幾個 lib 相關的內容,不過大部分情況下你可以這么理解更直觀了解他們的作用)。
一般說來 GCC 是編譯器,binutils 是連接器,glibc 是標准 C 庫(主要是連接時,連接器必須有目標的函數庫文件,也就是 .so 文件,對應 Windows 是 .dll 文件。連接器把函數調用正確的掛接到對應的函數入口上)。linux header 就是 C 語言常見的 C header 文件和相關的開發數據。一般主要用來編譯 glibc ,glibc 作為中間層來提供內核相關調用。當然程序有些時候也會直接調用內核函數,這樣這些程序在編譯時也需要 kernel 的 header 。

這兩套東西一個輸出你當前 PC 的程序,一個輸出 ARM 的程序。兩個 GCC 套裝之間不能互相替換。只能自己輸出屬於自己的程序。
但是這兩套程序雖然輸出的程序不同,但可以運行的部分,卻都是在你的計算機上運行。而且你本機的 GCC 因為可以輸出本機的程序。所以你需要用他來輸出在你本機運行,但是卻輸出 ARM 程序的 GCC 套裝。

這就好比兩個錘子,一個錘子用來打鐵,一個錘子用來打錫。用途不同,但這兩個錘子都是鐵做的。
你作這個交叉編譯工具鏈,就是用你手裡已經有的打鐵的錘子,打出一個用鐵製作的用來打錫的錘子。這個打錫的錘子是不能打鐵的,同樣這個打鐵的錘子是不能用來打錫的。

4. LINUX交叉編譯工具鏈和GCC是什麼關系啊

編譯工具鏈一般最簡化的為
binutils
+
gcc
+
glibc
+
kernel-header
組合的環境。
GCC
就是編譯器,他的輸出每次安裝只能有針對一個架構的指令輸出。如果要多個架構輸出,那就要裝多個
GCC
,所以編譯工具鏈裡面會有一個
GCC

交叉編譯就是跨架構編譯,編譯出來的程序不能在本機執行(當然有例外情況)。所以這個時候就需要交叉編譯工具鏈。
工具鏈光有
GCC
是不行的,還需要一個
binutils
的二進制連接器,以及一個最基本的目標架構的
C
庫,C
庫還需要一個目標架構的內核源代碼才能完全工作(當然不是必須的,但編譯有的時候需要)
又因為
GCC
、binutils
不能實現單軟體同時多架構輸出,所以需要單獨另裝,又加上
C
庫和內核頭文件需要目標架構的東西而不能用本機本地架構的數據。
所以一個交叉編譯工具鏈就是針對目標架構准備的單獨安裝單獨使用的
binutils
+
gcc
+
glibc
+
kernel-header
的集合了。
PS:這個
kernel-header
並不一定就是
Linux
,他還可以是別的系統核心開發庫,比如
FreeBSD

5. 關於Linux上的arm-linux交叉編譯工具鏈的問題:但是arm也有很多種啊! 這個工具是對所有的ARM都支持嗎

由於交叉編譯器中每個組件都有各自的版本,所以可以使用不同版本的組件來製作交叉編譯器。但是,組件之間會因版本不匹配的問題而產生錯誤。為了避免這種麻煩,建議直接使用製作好的arm-linux交叉編譯器。你優化arm9,應該是想升級內核吧,升級內核有相應的命令的。

6. 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。

交叉編譯工具鏈的製作方法

  1. 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。

  2. 通過Crosstool腳本工具來實現一次編譯生成交叉編譯工具鏈。

  3. 直接通過網上(ftp.arm.kernel.org.uk)下載已經製作好的交叉編譯工具鏈。

方法1相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用方法2或方法3構建交叉工具鏈。方法3的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名的錯誤,建議你慎用此方法。


方法1:分步構建交叉編譯工具鏈


  1. 下載所需的源代碼包

  2. 建立工作目錄

  3. 建立環境變數

  4. 編譯、安裝Binutils

  5. 獲取內核頭文件

  6. 編譯gcc的輔助編譯器

  7. 編譯生成glibc庫

  8. 編譯生成完整的gcc

由於在問答中的篇幅,我不能細述具體的步驟,興趣的同學請自行閱讀開源共創協議的《Linux from scratch》,網址是:linuxfromscratch dot org


方法2:用Crosstool工具構建交叉工具鏈(推薦)

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來生成試驗箱上的程序了!












7. 交叉編譯環境包括哪些工具,它的作用是什麼

首先你要知道一個軟體可能需要在多個CPU架構的平台上運行,如ARM架構,X86架構等等。
假設你要開發一個軟體目標平台是ARM,那麼你可以選擇在PC上,即X86平台上進行開發,然後使用交叉編譯工具把軟體編譯成ARM架構版本,然後才能在ARM上運行,如果只是用一般的編譯工具鏈,那麼只能編譯在當前平台上運行。
至於編譯工具鏈有哪些,具體要看你的開發平台和目標平台,會對應不同的編譯工具。

8. c語言用什麼編譯器比較好

編譯器不是最重要的,重要的是你想在哪個平台上開發代碼,以及你想要實現的功能是什麼。一般嵌入式編程大多使用gcc編譯器,尤其是gcc交叉編譯工具,比如arm-linux-gcc、csky-linux-gcc等,編譯器版本根據實際開發需求來選擇。一般基於windows平台的應用程序、伺服器開發,用得多的是visual
c/c++,當然還有其他開發語言和編譯器,如phython、html等。

9. 什麼是交叉編譯

簡單的說,如果你開發嵌入式,也就是製作小的帶MCU(CPU)的智能電子產品。你必須保證你在電腦上開發編譯出的代碼,在你的產品上也要能夠運行,這時就需要在你的電腦里安裝交叉編譯工具,實現上述功能。

熱點內容
演算法開關門 發布:2024-11-18 22:37:09 瀏覽:477
u啟動iso解壓 發布:2024-11-18 22:22:03 瀏覽:885
oracle存儲過程rollback 發布:2024-11-18 22:14:05 瀏覽:672
c語言學生管理系統課程設計 發布:2024-11-18 22:13:15 瀏覽:604
怎麼在雲伺服器上掛機手機游戲 發布:2024-11-18 22:03:03 瀏覽:317
ppp撥號伺服器搭建 發布:2024-11-18 22:02:59 瀏覽:586
幻靈游俠腳本 發布:2024-11-18 21:57:39 瀏覽:457
node加密 發布:2024-11-18 21:56:13 瀏覽:978
養女ftp 發布:2024-11-18 21:56:02 瀏覽:818
請描述如何配置安全的防火牆 發布:2024-11-18 21:53:45 瀏覽:144