⑴ 嵌入式linux內核編譯出錯 [2.6.20.6-mpc8247]# make ARCH=powerpc CROSS_COMPILE=ppc
首先確認你安裝了正確的交叉工具鏈,然後再把交叉工具鏈的地址添加到$PATH里。
交叉工具鏈可以跟晶元供應商聯系獲得,也可以自己下載軟體包自己進行編譯。
⑵ 如何用gentoo交叉編譯一個基本系統
嵌入式系統的編譯環境
為某個平台開發軟體,首先需要一個編譯環境。一般來說,編譯環境包括三部分:工具 鏈/運行環境/編譯方法。對於嵌入式系統來說,常見的編譯環境有三種:
本地環境。如很流行的Ubuntu for ARM,利用官方製作好的目標機鏡像(通常包含了 編譯環境),直接在目標機上編譯/安裝軟體,與PC機開發完全一樣。這種方法簡單省 事。缺點也顯而易見,編譯速度慢,耗時長,特別是較大的軟體包(如xbmc)的時候, 程序員不是停下來喝杯咖啡就可以收攤,恐怕得打場通宵dota後才能看到結果 了…(或許distcc能有所改善)
虛擬環境。在PC上建立目標機的虛擬環境,如QEMU-ARM,然後chroot到虛擬環境 中編譯/安裝軟體。這種方法利用了PC的處理能力,速度比本地環境要快得多,但 QEMU並不能完美的模擬目標機環境,如不支持某些系統調用等,這可能導致它不能 正確的編譯某些軟體。
交叉編譯。為目標機交叉編譯軟體,這是最常規的辦法,也是上面兩種方法實現的基 礎。說交叉編譯是「臟活」,是因為需要手工解決軟體包的所有依賴問題,手工編譯 每一個軟體包,並且解決軟體包對目標機兼容問題… 看網上鋪天蓋地關於求教/指導 某個軟體包如何正確交叉編譯就知道,有多少程序員在被它虐?
gentoo下的交叉編譯
gentoo是一個metadistribution,從源代碼構建整個系統,同時支持很多不同的體 系如alpha/arm/hppa/ppc/sh/sparc/s390等,也為交叉編譯提供了便利的工具,這是 其它二進制發行版沒有辦法比擬的(scratchbox也顯得弱爆了)。
gentoo下的交叉編譯通過crossdev和portage來實現。portage帶來的好處是自 動解決依賴和自動升級更新系統,跟本機環境一樣。
製作工具鏈
crossdev用來製作交叉工具鏈,並且還提供了交叉編譯環境下的emerge的輔助腳本。如 下編譯arm平台的工具鏈:
$ sudo crossdev -t arm-supertux-linux-gnueabi
這樣,crossdev最終製作了符合「gentoo規范」的arm交叉編譯器。
運行環境
crossdev生成/usr/arm-supertux-linux-gnueabi/目錄作為目標系統 $buildroot。編譯後生成的目標會被emerge到$buildroot,編譯時依賴的環境(如 鏈接庫/頭文件/pkgconfig等)也都在$buildroot。
交叉編譯
有了工具鏈/運行環境,使用的crossdev封裝過的emerge,就可以自由的emerge了。 如交叉編譯bash:
$ sudo emerge-arm-supertux-linux-gnueabi -avu bash
porage會自動把bash的依賴如ncurses/readline一起emerge到$buildroot。 交叉編譯就是變得如此簡單…
碰到的問題
站在巨人的肩膀上可以看的更遠,前提是我們先要爬上巨人的肩膀。portage是一個快 速更新迭代的系統,並不完美,維護者沒有辦法測試每個軟體包的所有兼容性。所以, 當你想安裝一個圖形環境如$emerge -avu enlightenment時,很可能會出現錯誤。但 portage提供了細粒度的控制幫助解決這樣的問題。下面是我碰到過一些情形和解決方 法:
由於軟體包的環境變數引起的問題,如鏈接庫指向了/usr/bin,而非 $buildroot。可以配置$buldroot/etc/portage/env/目錄下相應的文 件,portage會自動source該文件,從而改變編譯時的環境。
portage沒有包含該軟體或portage自身的bug引起,如默認使能了某個在目標機 平台不能使用的特性。建立一個針對目標機的overlay,自己編寫相應軟體包的 ebuild文件指導portage進行交叉編譯。
當某個軟體包分階段編譯時,如perl編譯時先生成miniperl,通過miniperl最 後生成perl目標映像。由於miniperl被交叉編譯器生成目標機的映像,正常情況 下不能主機環境中繼續運行生成最終的目標映像。這就要藉助qemu-arm+binfmt模 擬目標機環境,讓miniperl在主機環境中也能無縫的運行。
從形式上看,處理上面幾種情況,也是「臟活」。不僅需要了解該軟體包的編譯環境, 還需要了解portage的原理,還要知道ebuild的書寫語法。但是,與傳統的交叉編譯 方式比起來,這是一勞永逸的工作,別人使用我的運行環境和overlay,即不需再做什 么就能生成最終的目標機系統。
⑶ 為什麼移植snmp生成的snmpd文件不能運行
准備工作
1、net-snmp5.7.1源碼
2、Linux編譯環境,IP地址192.168.2.115
3、Powerpc平台,本次移植到飛思卡爾,IP地址192.168.2.20
環境搭建步驟
1、主機-Powerpc:
主機和Powerpc互相ping,檢測網口連通性;
如果網口無法工作,使用串口的zmodem進行文件下載,但是此方法較慢;
2、下載文件方法:
windows平台
開啟tftpd.exe,配置伺服器工作路徑為文件所在目錄;
通過串口或者網口與Powerpc通信,在Powerpcshell下運行:
tftp -r [download_file] 192.168.2.115 –g
SecureCRT使用zmodem傳送文件,此方法比tftp方法速度慢。
Linux系統需要tftp伺服器或者nfs伺服器支持
移植net-snmp
1、配置
CC=/usr/freescale-2010.09/bin/powerpc-linux-gnu-gcc./configure--build=i386-linux --host=ppc-linux --disable-ipv6--with-endianness=big--disable-manuals--disable-ucd-snmp-compatibility--enable-as-needed--disable-embedded-perl --without-perl-moles--disable-snmptrap-subagent--disable-scripts--with-mib-moles="ucd_snmp" --enable-shared
修改項包括:平台相關交叉編譯鏈,host取值,位元組序(Powerpc屬大端位元組序),其他配置不變
2、編譯
本工程因為需要載入動態庫,因此須使用動態編譯
動態編譯:
#make
編譯時不需要重新指定安裝目錄,一律選擇默認
//若有動態庫,會提示錯誤:缺少庫,拷貝過去即可。編譯完成後大小41K左右
靜態編譯:
#makeLDFLAGS=」-static」
//使用-static選項指明是靜態編譯,安裝完成後大小1.6M左右
3、安裝
#make install
編譯完snmp後,在安裝階段會鏈接目標文件生成庫文件,並將庫文件默認安裝在本地/usr/local/lib和 /usr/lib下
4、壓縮文件
安裝完成後snmpd路徑:/usr/local/sbin/snmpd
@Powerpc-linux-stripsnmpd
靜態:會將1.6M的文件壓縮為649K
動態:只有46K
拷貝文件
1、SNMPD的拷貝
將壓縮後的snmpd拷貝至/usr/sbin目錄下,修改許可權為755;
2、配置文件的拷貝
將編譯環境的/etc/snmp目錄下snmpd.conf snmp.conf 這兩個文件拷貝至:Powerpc板的/usr/local/share/snmp目錄下;
3、MIB庫文件的拷貝
將MIB庫文件拷貝至Powerpc板/usr/local/share/snmp/mibs中:
拷貝SNMP系統MIB庫和我們自己開發的MIB庫到目標板 的/usr/local/share/snmp/mibs;
cp ./mib <目標板>/usr/local/share/snmp/mibs;
cp SGCC-MIB.my <目標板>/usr/local/share/snmp/mibs;
這樣,我們自己開發的MIB庫SGCC-MIB和snmp自帶的MIB庫就整合在一起了。
4、命令的拷貝
通過tftp或者nfs掛載方式,拷貝本地snmp相關命令到Powerpc板:
#這里是snmp相關操作方法
cd/usr/local/bin/
cp agentxtrapnet-snmp-c* snmp* encode_keychange /usr/bin/
# snmp的守護線程和trap監聽命令許可權更改為755。
cp/usr/local/sbin/snmp*/usr/sbin/
[注]路徑不定,只要在需要時將命令所在路徑導入PATH即可
使用命令測試:
@snmpget–v2c –cprivate 127.0.0.1 sysUpTime.0 #返回正確
5、運行庫的拷貝
通過tftp或者nfs掛載方式,拷貝本地snmp相關庫文件到目標板,用以支持項目運行:
Cp usr/lib/libnetsnmp* /usr/lib
Cp usr/local/lib/libnetsnmp* /usr/lib
將需要snmp支持的第三方庫——我們的arm網管程序編譯而成的庫文件,拷貝/usr/local/lib;
這樣,我們的網管程序就可得到SNMP的支持
[注]路徑不定,只要在需要時將庫文件所在路徑導入LD_LIBRARY_PATH即可
⑷ powerpc 交叉編譯錯誤
libgcc.a 沒有找到:
檢查你的libgcc.a環境變數的設置
$CC --print-libgcc-file-name
若路徑為libgcc.a 證明是當前目錄下的庫文件或者是PATH環境變數下的libgcc.a。
找到你的工具鏈庫的地址
find -name "libgcc.a"
/opt/fsl-qoriq/1.9/sysroots/ppce5500-fsl-linux/usr/lib/powerpc-fsl-linux/4.9.2/libgcc.a3
將此地址加到PATH里去:
export PATH=/opt/fsl-qoriq/1.9/sysroots/ppce5500-fsl-linux/usr/lib/powerpc-fsl-linux/4.9.2/libgcc.a:$PATH
⑸ 怎麼 配置 ppc uboot 編譯環境
我是這樣做的,我在win7下安裝了virtualbox虛擬機,然後再虛擬機上安裝了一個ubuntu的linux系統,然後安裝交叉編譯器GCC,然後就可以在uboot源碼目錄下直接編譯了。。。先配置uboot 然後make,就自己編譯了。。。windows平台下不知道能不能編譯
⑹ make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm omap3_evm_config是什麼意思
make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm omap3_evm_config
在Linux下,用Make 命令來編譯程序,
CROSS_COMPILE給出了編譯程序所用的交叉工具鏈的名稱,比如:
CROSS_COMPILE=arm-none-linux-gnueabi-表示交叉編譯器的gcc為
arm-none-linux-gnueabi-gcc
ARCH給出了目標處理器的架構
這里用的是arm 處理器,
通過這個命令,把這些參數傳遞給Makefile中的預留參數,程序就可以順利編譯下去了。
可以看看Linux編程方面的書。
⑺ 可以將ppc arm交叉編譯環境安裝在一個主機嗎
1.下載arm-linux-gcc-3.4.1.tar.bz2到任意的目錄下,我把它下載到了我的個人文件夾里 /home/wrq
2. 解壓 arm-linux-gcc-3.4.1.tar.bz2
#tar -jxvf arm-linux-gcc-3.4.1.tar.bz2
解壓過程需要一段時間,解壓後的文件形成了 usr/local/ 文件夾,進入該文件夾,將arm文件夾拷貝到/usr/local/下
# cd usr/local/
#cp -rv arm /usr/local/
現在交叉編譯程序集都在/usr/local/arm/3.4.1/bin下面了
3. 修改環境變數,把交叉編譯器的路徑加入到PATH。(有三種方法,強烈推薦使用方法一)
方法一:修改/etc/bash.bashrc文件
#vim /etc/bash.bashrc
在最後加上:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
export PATH
方法二:修改/etc/profile文件:
# vim /etc/profile
增加路徑設置,在末尾添加如下,保存/etc/profil文件:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
4. 立即使新的環境變數生效,不用重啟電腦:
對應方法一:#source /root/.bashrc
對應方法二:# source /etc/profile
5. 檢查是否將路徑加入到PATH:
# echo $PATH
顯示的內容中有/usr/local/arm/bin,說明已經將交叉編譯器的路徑加入PATH。至此,交
叉編譯環境安裝完成。
6. 測試是否安裝成功
# arm-linux-gcc -v
上面的命令會顯示arm-linux-gcc信息和版本,顯示的信息:
Reading specs from /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/specs Configured with: /work/crosstool-0.27/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-
3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu
--prefix=/usr/local/arm/3.4.1 --with-headers=/usr/local/arm/3.4.1/arm
-linux/include --with-local-prefix=/usr/local/arm/3.4.1/arm-linux --disable
-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-
languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 3.4.1
7.編譯
Hello World程序,測試交叉工具鏈
寫下下面的Hello World程序,保存為
hello.c
#include
int main()
{
printf("Hello World!\n");
return 0;
}
執行下面的命令:
# arm-linux-gcc -o hello hello.c
源程序有錯誤的話會有提示,沒有任何提示的話,就是通過了,就可以下載到ARM目標板上運行了!接著可以輸入file hello的命令,查看生成的hello文件的類型,要注意的是生成的可執行文件只能在ARM體系下運行,不能在其於X86的PC機上運行。
⑻ linux下裝了幾個交叉編譯器 有arm的 也有ppc的,如何知道當前運行的是哪一個謝謝!
不同交叉編譯工具的前綴是不一樣的,如arm-elf-*,arm-uclinux-* 等等,所以很容易區分了。
⑼ 如何使用CMake進行交叉編譯
cmake交叉編譯配置
很多時候,我們在開發的時候是面對嵌入式平台,因此由於資源的限制需要用到相關的交叉編譯。即在你host宿主機上要生成target目標機的程序。裡面牽扯到相關頭文件的切換和編譯器的選擇以及環境變數的改變等,我今天僅僅簡單介紹下相關CMake在面對交叉編譯的時候,需要做的一些准備工作。
CMake給交叉編譯預留了一個很好的變數CMAKE_TOOLCHAIN_FILE,它定義了一個文件的路徑,這個文件即toolChain,裡面set了一系列你需要改變的變數和屬性,包括C_COMPILER,CXX_COMPILER,如果用Qt的話需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的話需要更改的BOOST_ROOT(具體查看相關Findxxx.cmake裡面指定的路徑)。CMake為了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。
toolChain腳本中設置的幾個重要變數
1.CMAKE_SYSTEM_NAME:
即你目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平台你就寫"Windows",如果你的嵌入式平台沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變數被設置了,CMake才認為此時正在交叉編譯,它會額外設置一個變數CMAKE_CROSSCOMPILING為TRUE.
2. CMAKE_C_COMPILER:
顧名思義,即C語言編譯器,這里可以將變數設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其他工具比如linker,binutils等,如果你寫的文件名帶有arm-elf等等前綴,CMake會識別到並且去尋找相關的交叉編譯器。
3. CMAKE_CXX_COMPILER:
同上,此時代表的是C++編譯器。
4. CMAKE_FIND_ROOT_PATH:
指定了一個或者多個優先於其他搜索路徑的搜索路徑。比如你設置了/opt/arm/,所有的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,然後才會去你自己的/usr/lib和/lib進行查找,如果你有一些庫是不被包含在/opt/arm裡面的,你也可以顯示指定多個值給CMAKE_FIND_ROOT_PATH,比如
set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)
該變數能夠有效地重新定位在給定位置下進行搜索的根路徑。該變數默認為空。當使用交叉編譯時,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡查找。
5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:
對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變數來說,一般都是調用宿主機的程序,所以一般都設置成NEVER
6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:
對FIND_LIBRARY()起作用,表示在鏈接的時候的庫的相關選項,因此這里需要設置成ONLY來保證我們的庫是在交叉環境中找的.
7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:
對FIND_PATH()和FIND_FILE()起作用,一般來說也是ONLY,如果你想改變,一般也是在相關的FIND命令中增加option來改變局部設置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH
8. BOOST_ROOT:
對於需要boost庫的用戶來說,相關的boost庫路徑配置也需要設置,因此這里的路徑即ARM下的boost路徑,裡面有include和lib。
9. QT_QMAKE_EXECUTABLE:
對於Qt用戶來說,需要更改相關的qmake命令切換成嵌入式版本,因此這里需要指定成相應的qmake路徑(指定到qmake本身)
toolChain demo
# this is required
SET(CMAKE_SYSTEM_NAME Linux)
# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)
# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)
這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做轉移,但目標平台是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。
⑽ 開發工具,模擬器,燒錄器,編譯器,交叉編譯器到底是什麼關系
房東太多的此長啊,不拉。
開發工具,模擬器,燃燒器,編譯器:開發工具模擬器,燃燒器和編譯器。模擬器只能燒一些簡單的IC,少數還行。燃燒器的程序員更強大的通配符量單一類型的刻錄機其實很簡單,就是你編譯程序寫入片內Flash內的介質燃燒器改造,我從事燒傷,我為自己代言