Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2534643
  • 博文数量: 401
  • 博客积分: 12926
  • 博客等级: 上将
  • 技术积分: 4578
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-22 14:51
文章分类

全部博文(401)

文章存档

2015年(16)

2014年(4)

2013年(12)

2012年(82)

2011年(98)

2010年(112)

2009年(77)

分类: C/C++

2012-04-02 11:27:04

OK6410开发板学习笔记

  1. 交叉工具链的生成

华清远见培训的第二期有个实验就是生成交叉编译链,但是华清的实验手册上省略了一些操作,编译不易成功;若要自己编译成功请参考“交叉工具编译链的移植.doc

注:此实验手册中华清用的板子是2410(2440系列雷同).

Ok6410的交叉编译链我是参考网上的。。。编译出来的

参考网页:

http://blog.csdn.net/HumorRat/article/details/5615298

http://blog.csdn.net/xiaomeiqing/article/details/7002528

感谢大神的分享


软件平台: ubuntu 10.10

主机编译器: gcc 4.5.1

硬件平台: ok6410


1、准备环境


必备工具包:bisonflextexinfoautomakelibtoolcvspatchlibncurses5-devaria2curlg++svngawkcvsdsubversion

注:第一个链接上还有个gcj,这个是用于java的 ,不需要可以不用安装

(有些文章有写要安装gcj,在我的Ubuntu11.10安装不了,提示说它被其它的软件包引用了,可能是我之前装的其他工具已经包含gcj了把)

// 我用10.10版装的也装不了 555 (我是用不着)


我们可以通过以下一条命令来获得它们,但需要ubuntu11.10接入网络

sudo apt-get install bison

sudo apt-get install flex

sudo apt-get install texinfo

sudo apt-get install automake

sudo apt-get install libtool

sudo apt-get install cvs

sudo apt-get install patch

sudo apt-get install libncurses5-dev

sudo apt-get install aria2

sudo apt-get install curl

sudo apt-get install g++

sudo apt-get install subversion

sudo apt-get install gawk

sudo apt-get install cvsd

注:省事方法:sudo apt-get install bison flex texinfo automake libtool cvs patch libncurses5-dev aria2 curl g++ subversion gawk cvsd

2、下载crosstool-ng软件包

crosstool-ng的下载地址是

值得注意的是,下载里面最新的crosstool-ng以后,记得在到

01-fixes/

看看有没有相应的补丁,有得话一起下载下来,并打上补丁,

我下的是14.1版 当时也是没有补丁, 有补丁的话要打补丁,不会打补丁请参考“交叉编译工具链的移植.doc”


3、相应目录的建立

sudo mkdir -p /usr/local/arm

sudo chmod 777 /usr/local/arm // arm目录权限设置为777

cd /usr/local/arm

mkdir 4.5.1

sudo mkdir -p /home/ok6410/crosstool

cd /home/ok6410/crosstool

sudo mkdir crosstool-build crosstool-install src-4.5.1

编译目录、 安装目录、 目标源码目录

4、安装crosstool-ng

将下载好的crosstool-ng-1.14.1.tar.bz2复制到/home/ok6410/crosstool/

解压crosstool-ng-1.14.1.tar.bz2

tar xvf crosstool-ng-1.14.1.tar.bz2

进入目录,进行配置:

cd /home/ok6410/crosstool/crosstool-ng-1.14.1

配置安装目录为/home/ok6410/crosstool/crosstool-install

sudo ./configure --prefix=/home/ok6410/crosstool/crosstool-install

sudo make --编译

sudo make install --安装


5、配置编译的交叉编译工具链

sudo cd /home/ok6410/crosstool/crosstool-build --进入编译目录

sudo cp /home/ok6410/crosstool/crosstool-ng-1.14.1/samples/arm-unknown-linux-gnueabi/* ./

sudo cp crosstool.config .config --crosstool-config --当作默认的配置文件

sudo /home/ok6410/crosstool/crosstool-install/bin/ct-ng menuconfig --图形界面进行配置

弹出以下菜单,此菜单主要用于交叉编译工具链的环境配置。

Paths and misc options --->

(/home/ok6410/crosstool/src-4.5.1) Local tarballs directory --目标源码目录

(/usr/local/arm/4.5.1) Prefix directory --最后生成的交叉编译工具链存放的目录

(2) Number of parallel jobs --主机是双核处理器的可以选2 另一说双核写4,我写的4

Target options --->

(armv6) Architecture level

(arm1176jzf-s) Emit assembly for CPU

(arm1176jzf-s) Tune for CPU

(vfp) Use specific FPU

Toolchain options --->

(none) Tuple's vendor string

这里可以设置个性化,不填就是unknow,可以设置自己的个性名 如填“doc”

这样产生的编译器前缀就是:arm-doc-linux-gnueabi-

Operating System --->

Linux kernel version (2.6.36.4) ---> //再高一点的版本如2.6.38制作好的编译器在编译qtopia2.2.0的时候会报include\linux下没有videodev.h这个头文件,低一些的版本如3.6.28在交叉编译的时候会报scripts/unifdef.c中的getline和系统/usr/include/stdio.h中的getline冲突


下面这些与目标源码有关:

Binary utilities --->

binutils version (2.19.1a) --->

C compiler --->

gcc version (4.4.6) ---> //等下再修改成4.5.1

[ ] Fortran

[ ] Java

C-library --->

glibc version (2.9) --->

Debug facilities --->

[ ] gdb ---> //gdb原作者没选,起初我选上的,但是编译不成功,原因也没有找到,希望有人能搞定。

Companion libraries --->

GMP version (4.3.2) --->

MPFR version (2.4.2) --->

PPL version (0.10.2) --->

CLooG/ppl version (0.15.10) --->

libelf version (0.8.13) --->

保存退出。

vi .config

CT_CC_VERSION="4.4.6"

改成

CT_CC_VERSION="4.5.1"


CT_CC_V_4_4_6=y

改成

CT_CC_V_4_5_1=y


CT_MPFR=y

后面增加一行

CT_MPC=y


CT_MPFR_VERSION="2.4.2"

后面增加两行

CT_MPC_V_0_8_2=y

CT_MPC_VERSION="0.8.2"

保存退出。

注:若编译失败再次用菜单图形化设置后,注意查看.config之前修改的内容是否还原了,最好在查看一次。(我的就是还原了);

6、编译交叉工具链

编译的时候会自动下载下面的软件包,也可以自己先下载好放在src-4.5.1目录下,这样编译的是时候就比较快了。

binutils-2.19.1a.tar.bz2

duma_2_5_15.tar.gz

glibc-2.9.tar.bz2

libelf-0.8.13.tar.gz

mpfr-2.4.2.tar.xz

strace-4.5.19.tar.bz2

cloog-ppl-0.15.10.tar.gz

expat-2.0.1.tar.gz //我在编译的时候,这个没能自动下载成功,解决方法:自己网上搜索下载后放到/home/ok6410/crosstool/src-4.5.1下即可。

glibc-ports-2.9.tar.bz2

ltrace_0.5.3.orig.tar.gz

ncurses-5.9.tar.gz

dmalloc-5.5.2.tgz

gcc-4.5.1.tar.bz2

gmp-4.3.2.tar.bz2

mpc-0.8.2.tar.gz

ppl-0.10.2.tar.bz2

linux-2.6.36.4.tar.xz


在终端执行

sudo /home/ok6410/crosstool/crosstool-install/bin/ct-ng build --开始编译

编译了两个小时左右,不过很庆幸的是没出现错误(其实我试了很多次了)。接下看下成果。

sudo cd usr/local/arm/4.5.1/bin/

sudo ./arm-none-linux-gnueabi-gcc -v

打印如下信息:

Using built-in specs.

COLLECT_GCC=./arm-none-linux-gnueabi-gcc

COLLECT_LTO_WRAPPER=/usr/local/arm/4.5.1/libexec/gcc/arm-none-linux-gnueabi/4.5.1/lto-wrapper

Target: arm-none-linux-gnueabi

Configured with: /home/ok6410/crosstool/crosstool-build/.build/src/gcc-4.5.1/configure --build=i686-build_pc-linux-gnu --


host=i686-build_pc-linux-gnu --target=arm-none-linux-gnueabi --prefix=/usr/local/arm/4.5.1 --with-


sysroot=/usr/local/arm/4.5.1/arm-none-linux-gnueabi/sysroot --enable-languages=c,c++ --disable-multilib --with-arch=armv6 --with-


cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=soft --with-pkgversion='crosstool-NG 1.13.2' --disable-sjlj


-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-


gmp=/home/ok6410/crosstool/crosstool-build/.build/arm-none-linux-gnueabi/build/static --with-


mpfr=/home/ok6410/crosstool/crosstool-build/.build/arm-none-linux-gnueabi/build/static --with-


ppl=/home/ok6410/crosstool/crosstool-build/.build/arm-none-linux-gnueabi/build/static --with-


cloog=/home/ok6410/crosstool/crosstool-build/.build/arm-none-linux-gnueabi/build/static --with-host-libstdcxx='-static-libgcc -


Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --with-local-prefix=/usr/local/arm/4.5.1/arm-


none-linux-gnueabi/sysroot --disable-nls --enable-c99 --enable-long-long

Thread model: posix

gcc version 4.5.1 (crosstool-NG 1.13.2)

接下来将命令都链接成arm-linux-,这样以后操作比较方便。

sudo ln -s arm-none-linux-gnueabi-addr2line arm-linux-addr2line

sudo ln -s arm-none-linux-gnueabi-ar arm-linux-ar

sudo ln -s arm-none-linux-gnueabi-as arm-linux-as

sudo ln -s arm-none-linux-gnueabi-c++ arm-linux-c++

sudo ln -s arm-none-linux-gnueabi-c++filt arm-linux-c++filt

sudo ln -s arm-none-linux-gnueabi-cpp arm-linux-cpp

sudo ln -s arm-none-linux-gnueabi-g++ arm-linux-g++

sudo ln -s arm-none-linux-gnueabi-gcc arm-linux-gcc

sudo ln -s arm-none-linux-gnueabi-gcc-4.5.1 arm-linux-gcc-4.5.1

sudo ln -s arm-none-linux-gnueabi-gccbug arm-linux-gccbug

sudo ln -s arm-none-linux-gnueabi-gcov arm-linux-gcov

sudo ln -s arm-none-linux-gnueabi-gprof arm-linux-gprof

sudo ln -s arm-none-linux-gnueabi-ld arm-linux-ld

sudo ln -s arm-none-linux-gnueabi-ldd arm-linux-ldd

sudo ln -s arm-none-linux-gnueabi-nm arm-linux-nm

sudo ln -s arm-none-linux-gnueabi-objcopy arm-linux-objcopy

sudo ln -s arm-none-linux-gnueabi-objdump arm-linux-objdump

sudo ln -s arm-none-linux-gnueabi-populate arm-linux-populate

sudo ln -s arm-none-linux-gnueabi-ranlib arm-linux-ranlib

sudo ln -s arm-none-linux-gnueabi-readelf arm-linux-readelf

sudo ln -s arm-none-linux-gnueabi-size arm-linux-size

sudo ln -s arm-none-linux-gnueabi-strings arm-linux-strings

sudo ln -s arm-none-linux-gnueabi-strip arm-linux-strip

到此arm-linux-gcc4.5.1-armv6-vfp交叉编译器制作完成,以后就可以用arm-linux-gcc来编译其他程序了。


补充点废话,最后生成的交叉工具链的名字是arm-unknown-linux-XXXXX这样的一大长串,如果不喜欢那个unknown,修改它的方法是用vi修改.config文件,里面有VENDOR参数,如果为空,生成也是unknown;喜欢的话可以写上自己的名字。


我觉得一定要细读x-tools/arm-unknown-linux-gnueabi/build.log所指出的错误原因和解决办法。另外,crosstool-ng不要安装在/usr//usr/local下面,否则可能出现chmod错误;另外,编译机器本身的gccg++的版本要一致,g++是需要的。

感谢大神们的分享!





阅读(3522) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~