交叉編譯和gcc區別
簡介
交叉編譯工具鏈是一個由編譯器、連接器和解釋器組成的綜合開發環境,交叉編譯工具鏈主要由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
。
方法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來生成試驗箱上的程序了!
Ⅱ 關於交叉編譯工具鏈的問題
核心轉儲是崩潰報告的一個過程,他只是把當前崩潰的信息轉存出來方便差錯。而且這個核心轉儲幾個字也不過是個提示輸出信息。這個提示不會給與任何與錯誤相關的內容,必須看其他的錯誤信息或者他轉儲出來的東西來分析。
不過核心轉儲,應該是程序運行出錯而崩潰。這種問題出現在你正在運行的程序,而不是編譯過程出現的編譯錯誤(也就是說,出現核心轉儲應該就是 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 套裝。
這就好比兩個錘子,一個錘子用來打鐵,一個錘子用來打錫。用途不同,但這兩個錘子都是鐵做的。
你作這個交叉編譯工具鏈,就是用你手裡已經有的打鐵的錘子,打出一個用鐵製作的用來打錫的錘子。這個打錫的錘子是不能打鐵的,同樣這個打鐵的錘子是不能用來打錫的。
Ⅲ corss gcc 和 linux gcc的區別
額,這兩個怎麼比。。。
CrossGCC是指用於交叉編譯,編譯在Windows、ARM-linux等等其他平台的運行的程序。
LinuxGCC是指用於本地開發,編譯在本機運行的程序。
大概吧。。。假設你是Linux平台?
Ⅳ arm-linux-gcc 和 arm-elf-gcc 的區別
在基於ARM的嵌入式系統開發中,常常用到交叉編譯的GCC工具鏈有兩種:
arm-linux-*和 arm-elf-*,兩者區別主要在於使用不同的C庫文件。arm-linux-*使用
GNU的Glibc,而arm-elf-*一般使用 uClibc/uC-libc或者使用REDHAT專門為嵌入式系統
的開發的C庫newlib.Glibc。uClibc/uC-libc以及 newlib都是C語言庫文件,只是所應
用的領域不同而已,Glibc是針對PC開發的,uClibc/uC-libc是與Glibc API兼容的小型
化C語言庫,實現了Glibc部分功能。
關於uClibc/uC-libc的說明,詳見如下:
There are two libc libraries commonly used with uClinux. uC-libc and
uClibc. They are quite different despite their similar names. Here is a
quick overview of how they are different.
uC-libc is the original library for uClinux. It was based on sources
from the Linux-8086 C library which was part of the ELKs project with m68000
support added by Jeff Dionne and Kenneth Albanowski. It is a fairly complete
libc implementation, however, some of the API's are a little non-standard
and quite a few common libc routines are not present. Currently it has
stable support for m68000, ColdFire and ARM (Non-MMU) architectures. It was
primary design goal is to be small and light weight. It does try to conform
to any standards, although its API tries to be compatible with most libcs,
it is not always exactly the same.
The uClinux distribution provides an environment that can compile using
either uC-libc or uClibc depending on your needs. For m68000 and Coldfire
platforms it is generally better to chose uC-libc as it supports shared
libraries and is the most commonly used libc for these CPUs. uClibc also
works quite well with almost all platforms supported by the distribution.
Which libc you choose to use will be decided by your requirements
uClinux有兩個經常使用的libc庫:uC-libc和uClibc。雖然兩者名字很相似,其實有差
別,下面就簡單的介紹一下二者的不同之處。uC -libc是最早為uClinux開發的庫,是
Jeff Dionne和Kenneth Albanowski為在EKLs項目中支持m68000在Linux-8086 C庫源碼
上移植的。uC-libc是一個完全的libc實現,但其中有一些api是非標準的,有些libc的
標准也沒有實現。uC-libc穩定地支持 m68000,ColdFire和沒有MMU的ARM。其主要設計
目標是「小」、"輕",並盡量與標准一致,雖然它的API和很多libc兼容,但是似乎並
不像它期望的那樣和所有標准一致。
uClibc就是為了解決這個問題從uC-libc中發展出來的。它的所有API都是標準的(正確
的返回類型,參數等等),它彌補了uC-libc中沒有實現的libc標准,現在已經被移植到
多種架構中。一般來講,它盡量兼容glibc以便使應用程序用uClibc改寫變的容易。
uClibc能夠在標準的 VM linux和uClinux上面使用。為了應用程序的簡潔,它甚至可以
在許多支持MMU的平台上被編譯成共享庫。Erik Anderson在uClibc背後做了很多的工
作。uClibc支持許多系列的處理器:m68000,Coldfire,ARM,MIPS,v850, x86,
i960,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不斷增加的平台支持顯示uClibc
能夠很容易的適應新的架構。uClinux發行版提供了環境能夠讓你選擇使用uC-libc或是
uClibc編譯。對於m68000和Coldfire平台來說,選擇uC-libc還是稍微好一點,因為它
支持共享庫,而共享庫是這些cpu經常使用的 libc.uClibc也幾乎和所有的平台都能很
好的工作。選擇哪種libc取決於你的需求。
newlib 是一個用於嵌入式系統的開放源代碼的C語言程序庫,由libc和libm兩個庫組
成,特點是輕量級,速度快,可移植到很多CPU結構上。newlib實現了許多復雜的功
能,包括字元串支持,浮點運算,內存分配(如malloc)和I/O流函數(printf,fprinf()
等等)。其中libc提供了c 語言庫的實現,而libm提供了浮點運算支持。
在為ARM交叉編譯gcc編譯器時,對gcc指定不同的配置選項時,使用的C語言庫就不同,
gcc編譯器默認使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),當使用
--with-newlib時,gcc編譯器不使用Glibc。當沒有交叉編譯Glibc時,可以使用
--with-newlib禁止連接Glibc而編譯bootstrap gcc編譯器。從gcc源目錄下的
config/arm中的t-linux和t-arm-elf中可以看出,不同的--target也影響gcc連接C語言
庫,t-linux(--target=arm-linux)默認使用Glibc,-arm-elf(--target=arm-elf)使用
- Dinhibit_libc禁止連接Glibc,這時我們就可以使用newlib等其他C語言庫編譯GCC工
具鏈。
雖然GCC工具鏈配置了不同的的C語言庫,但由於這些C語言庫都可以用來支持GCC,它們
對核心數據的處理上不存在較大出入。因而arm-linux-* 和 arm-elf-*區別主要表現在
C語言庫的實現上,例如不同系統調用,不同的函數集實現,不同的ABI\啟動代碼以及
不同系統特性等微小的差別。
arm-linux-*和 arm-elf-*的使用沒有一個絕對的標准,排除不同庫實現的差異,gcc可
以編譯任何系統。arm-linux-*和 arm-elf-*都可以用來編譯裸機程序和操作系統,只
是在遵循下面的描述時系統程序顯得更加協調:
arm-linux-*針對運行linux的ARM機器,其依賴於指定的C語言庫Glibc,因為同樣使用
Glibc的linux而使得arm-linux-*在運行linux的ARM機器上編譯顯得更加和諧。
arm-elf-*則是一個獨立的編譯體系,不依賴於指定的C語言庫Glibc,可以使用newlib
等其他C語言庫,不要求操作系統支持,當其使用為嵌入式系統而設計的一些輕巧的C語
言庫時編譯裸機程序(沒有linux等大型操作系統的程序),如監控程序,bootloader等
能使得系統程序更加小巧快捷。
Linaro prebuilt toolchain does support both hard and soft floating
point. You can get it from https://launchpad.net/linaro-toolchain-binaries/+milestone/2012.08 try: ./arm-linux-gnueabihf-gcc -print-multi-lib
The default configure is --with-arch=armv7-a --with-tune=cortex-a9
--with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb
To use soft floating, you need options: -marm -march=armv4t -mfloat-abi=soft.
In your case, please try to change -march=armv5 to "-march=armv4t"
If you want to change to configure to cortex-a8 and armv5. You need
* Change cortex-a9 to cortex-a8 in
samples/linaro-arm-linux-gnueabihf/crosstool.config
* Change armv4t to armv5 in
contrib/linaro/patches/gcc/linaro-4.7-2012.08/multilib.patch,
Then follow the instructions to rebuild the toolchain
(contrib/linaro/doc/README.txt)
BTW: crosstool-ng-linaro does not support multilib for eglibc. It uses
the prebuilt sysroot from Ubuntu Precise. If it does not work for you,
please use the latest crosstool-ng from http://crosstool-ng.org/.
Ⅳ gcc和arm-linux-gcc是什麼關系區別是什麼
gcc是linux系統下面用來將代碼編譯成一個可執行程序的手段。編譯出來的是適用於linux系統的可執行二進制文件。可執行程序其實就是一堆的0101二進制機器碼。這些機器碼代表什麼含義只有機器本身能理解。所以你用gcc編譯出來的可執行程序只有在linux系統下面可以運行。舉個例子你的可執行程序裡面有一句01011.這句在linux下面可能是吃飯的意思,但是在windows下面可能01011是撒尿的意思。那你說linux的可執行程序放在window下面能正常運行嗎?肯定不能嘛。你要的目的是吃飯,它幫你執行撒尿很顯然就不對了。同樣的可能01011在ARM下面的意思是睡覺。不同系統的機器碼含義是不一樣的。所以你在linux系統下面寫的代碼要怎樣才能在ARM系統上面跑呢。這就需要用到交叉編譯。arm-linux-gcc是什麼意思?就是告訴你的編譯器,我編寫的環境是linux,但是我希望生成的可執行程序是在arm上面跑的。這就是交叉編譯。編寫環境和執行環境分離的一種手段。
Ⅵ 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這樣的文件,因為,你並不總是需要它們來做交叉編譯。比如,你僅僅希望編譯運行在開發主機上的程序時。
這樣,工具鏈就准備好了。
Ⅶ 交叉編譯器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的區別
兩個交叉編譯器分別適用於 armel 和 armhf 兩個不同的架構,armel 和 armhf 這兩種架構在對待浮點運算採取了不同的策略(有 fpu 的 arm 才能支持這兩種浮點運算策略)。
其實這兩個交叉編譯器只不過是 gcc 的選項 -mfloat-abi 的默認值不同。gcc 的選項 -mfloat-abi 有三種值 soft、softfp、hard(其中後兩者都要求 arm 里有 fpu 浮點運算單元,soft 與後兩者是兼容的,但 softfp 和 hard 兩種模式互不兼容):
soft: 不用fpu進行浮點計算,即使有fpu浮點運算單元也不用,而是使用軟體模式。
softfp: armel架構(對應的編譯器為 arm-linux-gnueabi-gcc )採用的默認值,用fpu計算,但是傳參數用普通寄存器傳,這樣中斷的時候,只需要保存普通寄存器,中斷負荷小,但是參數需要轉換成浮點的再計算。
hard: armhf架構(對應的編譯器 arm-linux-gnueabihf-gcc )採用的默認值,用fpu計算,傳參數也用fpu中的浮點寄存器傳,省去了轉換,性能最好,但是中斷負荷高。
Ⅷ gcc是什麼
GCC是一個用於linux系統下編程的編譯器
是一個用於編程開發的自由編譯器。最初,GCC只是一個C語言編譯器,它是GNU C Compiler 的英文縮寫。隨著眾多自由開發者的加入和GCC自身的發展,如今的GCC已經是一個包含眾多語言的編譯器了。其中包括 C,C++,Ada,Object C和Java等。所以,GCC也由原來的GNU C Compiler變為GNU Compiler Collection。也就是 GNU編譯器家族的意思。當然,如今的GCC藉助於它的特性,具有了交叉編譯器的功能,即在一個平台下編譯另一個平台的代碼。
Ⅸ 如何交叉編譯開源庫
所謂的搭建交叉編譯環境,即安裝、配置交叉編譯工具鏈。在該環境下編譯出嵌入式Linux系統所需的操作系統、應用程序等,然後再上傳到目標機上。
交叉編譯工具鏈是為了編譯、鏈接、處理和調試跨平台體系結構的程序代碼。對於交叉開發的工具鏈來說,在文件名稱上加了一個前綴,用來區別本地的工具鏈。例如,arm-linux-表示是對arm的交叉編譯工具鏈;arm-linux-gcc表示是使用gcc的編譯器。除了體系結構相關的編譯選項以外,其使用方法與Linux主機上的gcc相同,所以Linux編程技術對於嵌入式同樣適用。不過,並不是任何一個版本拿來都能用,各種軟體包往往存在版本匹配問題。例如,編譯內核時需要使用arm-linux-gcc-4.3.3版本的交叉編譯工具鏈,而使用arm-linux-gcc-3.4.1的交叉編譯工具鏈,則會導致編譯失敗。
那麼gcc和arm-linux-gcc的區別是什麼呢?區別就是gcc是linux下的C語言編譯器,編譯出來的程序在本地執行,而arm-linux-gcc用來在linux下跨平台的C語言編譯器,編譯出來的程序在目標機(如ARM平台)上執行,嵌入式開發應使用嵌入式交叉編譯工具鏈。
工具/原料
電腦系統:win7系統。虛擬機系統:workstation6.5 。虛擬機安裝的linux版本:fedora9.0。內核:linux2.6.25 。
方法/步驟
1
我使用的交叉編譯工具鏈是arm-linux-gcc-4.4.3,把它放在linux系統的路徑是圖一
2
在linux系統的路徑/home/song/share下放了交叉編譯工具鏈arm-linux-gcc-4.4.3的壓縮包,另一個版本的不用。有的人可能會問到怎麼把這個壓縮包弄到虛擬機的linux的系統的,我是通過samba服務從主機復制到虛擬機的,這里的share文件夾就是我samba伺服器的工作目錄,多了不說,這不是重點。
然後通過命令mkdir embedded 建立一個arm-linux-gcc的安裝目錄,如圖二所示。當然安裝路徑和目錄名稱「embedded」可以依自己的喜好而定。
步驟閱讀
然後通過命令將share文件夾下的arm-linux-gcc-4.4.3.tar.gz復制到這里的embedded文件夾下, 當然這里你也可以不進行這一步我這是為了方便以後管理,將arm-linux-gcc安裝到embedded文件夾下,方便以後尋找。
然後使用tar命令:tar zxvf arm-gcc-4.4.3.tar.gz將embedded文件夾下的arm-linux-gcc-4.4.3.tar.gz解壓縮安裝到當前目錄下
執行完解壓縮命令,就已經將交叉編譯工具鏈arm-linux-gcc-4.4.3安裝到linux系統上了,這里默認安裝到了圖六所示的路徑上。
接下來配置系統環境變數,把交叉編譯工具鏈的路徑添加到環境變數PATH中去,這樣就可以在任何目錄下使用這些工具。 vi /etc/profile 編輯profile文件,添加環境變數。
在profile中的位置處,添加圖八所示的紅線標注的一行,路徑就是圖六中的紅線標注的路徑後面加上/4.4.3/bin。
圖八中的路徑一定是你自己的安裝路徑,可以使用pwd命令查找一下那個bin目錄的路徑。添加完路徑後,保存退出。接下來使用命令:source /etc/profile,是修改後的profile文件生效,如圖九所示。
然後,使用命令:arm-linux-gcc -v查看當前交叉編譯鏈工具的版本信息,如圖九中的紅線標注第③行所示。很明顯 可以看到,如果不執行第②步,則查看版本信息不成功。
然後驗證交叉編譯工具鏈是否安裝成功並且可以使用,如圖九所示,隨便找一個目錄編輯一個hello源代碼。
編輯好hello.c文件後,保存退出。然後使用交叉編譯器對hello.c進行編譯,並生成可執行文件hello
這里生成的hello文件並不能像gcc編譯出來的文件那樣直接使用「./hello」命令執行並顯示內容 因為它是一個二進制文件,只能下載到開發板上執行!
至此,搭建交叉編譯環境步驟結束。