分类: C/C++
2012-04-02 11:27:04
OK6410开发板学习笔记
交叉工具链的生成
华清远见培训的第二期有个实验就是生成交叉编译链,但是华清的实验手册上省略了一些操作,编译不易成功;若要自己编译成功请参考“交叉工具编译链的移植.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、准备环境
必备工具包:bison、flex、texinfo、automake、libtool、cvs、patch、libncurses5-dev、aria2、curl、g++、svn、gawk、cvsd、subversion
注:第一个链接上还有个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错误;另外,编译机器本身的gcc和g++的版本要一致,g++是需要的。
感谢大神们的分享!