⑴ 嵌入式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内的介质燃烧器改造,我从事烧伤,我为自己代言