tar xjf arm-linux-gcc-4.3.2.tar.bz2 //解压工具链
对于arm-linux-gcc-4.3.2解压出来得到usr目录,工具链在usr/local/arm/4.3.2/bin,
对于gcc-3.4.5解压出来得到gcc-3.4.5-glibc-2.3.6工具链目录在gcc-3.4.5-glibc-2.3.6/bin/
到解压出来的工具链目录下:
cd usr/local/arm/4.3.2/bin
查看“当前工作目录”的完整路径
pwd/home/book/workspace/jz2440_project/system/usr/local/arm/4.3.2/bin
为了移植QT文件系统,把gcc编译器版本降为3.4.5:
export命令用于设置或显示环境变量,在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作
sudo vi /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin"① 编译、安装jpeg库jpegsrc.v6b.tar.gz:
解压
tar xzvf jpegsrc.v6b.tar.gz
切换到 jpeg-6b目录下
cd jpeg-6b/
配置
这里 --enable-shared --enable-static
如果你要编译一个库的源代码,可以把它编译成静态库,也可以把它编译成动态库。如果你想编译成动态库,就用 --enable-shared参数;如果你想编译成静态库,就用--enable-static参数
不指定prefix,执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc。其它的资源文件放在/usr /local/share
--host=HOST指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测.--host=arm-linux 运行环境 (交叉编译成arm)
--build=BUILD
指定软件包安装的系统平台.如果没有指定,默认值将是'--host'选项的值.
build就是你正在使用的机器,host就是你编译好的程序可以运行的平台,target就是你编译的程序可以处理的平台.这个 build和host比较好理解,但是target就不好办了,到底什么意思呢?一般来说,我们平时所说的交差编译用不到他target的,比如. /configure --build=i386-linux,--host=arm-linux就可以了,在386的平台上编译可以运行在arm板的程序.但是,一般我们都是编译程序,而不是编译工具,如果我们编译工具,比如gcc,这个target就有用了.如果我们需要在一个我们的机器上为arm开发板编译一个可以处理 mips程序的gcc,那么target就是mips了
i386即Intel 80386。其实i386通常被用来作为对Intel(英特尔)32位微处理器的统称
那么linux 中的 i386 i686 i486 i586 究竟是什么含义呢?
其实很简单,i代表intel(英特尔)系列的cpu
386 几乎适用于所有的 x86 平台,不论是旧的 pentum 或者是新的 pentum-IV 与 K7 系列的 CPU等等,都可以正常的工作!那个 i 指的是 Intel 兼容的 CPU 的意思,至于 386 不用说,就是 CPU 的等级啦!
i586 就是 586 等级的计算机,那是哪些呢?包括 pentum 第一代 MMX CPU, AMD 的 K5, K6 系列 CPU ( socket 7 插脚 ) 等等的 CPU 都算是这个等级;
i686 在 pentun II 以后的 Intel 系列 CPU ,及 K7 以后等级的 CPU 都属于这个 686 等级!
noarch 就是没有任何硬件等级上的限制。
configure一般是tar.gz包里面的一个可执行文件,./configure是执行它,其作用就是根据系统情况自动生成编译时所需的Makefile文件。
./configure --enable-shared --enable-static --prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux --build=i386 --host=arm
修改Makefile,因为编译后的程序要在arm上运行vi Makefile,如下:
CC= gcc 改为:CC= arm-linux-gcc
AR= ar rc 改为:AR= arm-linux-ar rc
AR2= ranlib 改为:AR2= arm-linux-ranlib
编译
make
安装
make install-lib将在/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux中的include目录中生成一些头文件,在lib目录中生成一些jpeg库文件。
② 编译、安装uuid库:
解压
tar xzf e2fsprogs-1.40.2.tar.gz
切换到e2fsprogs-1.40.2目录下
cd e2fsprogs-1.40.2/
新建build目录,并切换到build目录下
mkdir build; cd build
配置
-cc指定编译器
-prefix指定安装目录
--enable-elf-shlibs: elf格式的库
--host=arm-linux: 交叉编译成arm平台
--prefix=/usr/local/arm/2.95.3/arm-linux: 安装路径
../configure --with-cc=arm-linux-gcc --with-linker=arm-linux-ld --enable-elf-shlibs --host=arm -prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux
编译
make
安装
make install-libs最后一条命令在/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/下的include、lib目录中安装一些头文件和库,比如uuid/uuid.h、libuuid.a、libuuid.so等
③ 编译、安装zlib库:
解压
tar xzvf zlib-1.2.3.tar.gz
切换到 zlib-1.2.3目录
cd zlib-1.2.3/
配置
./configure --shared --prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux修改生成的Makefile,以下是修改后的结果,都加上了“arm-linux-”前缀:
CC=arm-linux-gcc
……
LDSHARED=arm-linux-gcc -shared -Wl,-soname,libz.so.1
……
CPP=arm-linux-gcc -E
……
AR=arm-linux-ar rc
……
RANLIB=arm-linux-ranlib
编译
make
安装
make install④ 编译、安装png库:
解压
tar xjf libpng-1.2.23.tar.bz2
切换到libpng-1.2.23
cd libpng-1.2.23/
拷贝
cp scripts/makefile.linux ./Makefile修改Makefile,以下是修改后的结果,都加上了“arm-linux-”前缀:
AR_RC=arm-linux-ar rc
CC=arm-linux-gcc
……
RANLIB=arm-linux-ranlib
……
prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux
编译
make
安装
make install⑤ 编译、安装触摸屏ts库:
由于使用tslib-1.3按照文档修改依然出现“libtool:link: only absolute run-paths are allowed“的错误,决定使用tslib-1.4:
a、使用tslib-1.3:
tar xjf tslib-1.3.tar.bz2
cd tslib-1.3/
进入源码目录,按照以下顺序,依次注意这些文件:autogen.sh,configure。一个软件
包,一般都会有configure文件,它用来测试编译环境,以及生成makefile文件,再次是
autogen.sh。autogen.sh的作用也是检测你的编译工具和依赖关系包是否完整;
Makefile是编译的目标文件,也就是 make的时候要找的文件!
./autogen.sh
管道符
> 添加覆盖
>> 追加
echo "CPU = $3" >> config.mk
会把 CPU+$3 添加在config.mk 的最后
echo "CPU = $3" > config.mk
的话 config.mk 里就只剩
CPU = $3
在make时候可能出现如下错误:
ts_test.o(.text 0x218): In function `main':
: undefined reference to `rpl_malloc'
在当前目录查找了rpl_malloc,发现configure里有#define malloc rpl_malloc一行。分析configure 脚本相关的代码,原来是ac_cv_func_malloc_0_nonnull引起的,OK我们不让它检查了,产生一个cache文件arm-linux.cache,欺骗configure:
解决办法:
# echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
配置
-host=arm-linux
运行环境 (交叉编译成arm)
--cache-file
'configure'会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有'configure'脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助.
--enable-inputapi=no
--enable-inputapi=no是由于驱动不支持ioctl操作,如果不改最后会有如下现象:
我在板子上运行./ts_test的时候,总是提示我:ts_open: No such file or directory?
--prefix
指定安装目录
./configure --host=arm-linux --cache-file=arm-linux.cache --enable-inputapi=no --prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux在make之前,为了支持触摸屏修改src/ts_read_raw.c文件,如下修改代码:
char *defaulttseventtype="UCB1x00";
改为:
char *defaulttseventtype="H3600";
为了防止出现“libtool:link: only absolute run-paths are allowed“的错误,在plugins/Makefile里面找rpath,找到将其注释并加上绝对路径:
#LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`
最后执行以下命令编译安装:
make
make install
b、使用tslib-1.4:
tar xzf tslib-1.4.tar.gz
cd tslib
./autogen.sh
echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/tmp
// 如果使用的arm-linux-gcc-4.3.2交叉编译工具要修改/usr/local/arm/4.3.2里
// 的宏EV_VERSION要修改input.h,再make,
make
make install //安装到tmp目录
⑥ 使用补丁修改、编译QT:
tar xzf qtopia-free-src-2.2.0.tar.gz
cd qtopia-free-2.2.0
patch -p1 < ../qtopia-free-2.2.0_jz2440.patch
./configure -qte '-embedded -xplatform linux-arm-g++ -qconfig qpe -depths 16,24 -no-qvfb -system-jpeg -system-libpng -system-zlib -tslib -gif -thread -lts' -qpe '-xplatform linux-arm-g++ -edition pda -displaysize 240x320' -qt2 '-no-xft' -dqt '-no-xft'
make
make install
这将把所有必需的目录、文件复制到qtopia/image/opt/Qtopia目录下。
注意:./configure时,要输入“yes”并回车才能继续下去
⑦ 基于最小根文件系统制作QT文件系统:
使用fs_mini_mdev.tar.bz2:
sudo tar xjf fs_mini_mdev.tar.bz2
sudo cp -rf fs_mini_mdev fs_qtopia
sudo chown book:book fs_qtopia –R
a、复制Qtopia所依赖库文件
cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/
cp libpng.so* /home/book/workspace/jz2440_project/fs_qtopia/lib/ -d
cp libjpeg.so* /home/book/workspace/jz2440_project/fs_qtopia/lib/ -d
cp libuuid.so* /home/book/workspace/jz2440_project/fs_qtopia/lib/ -d
cp libz.so* /home/book/workspace/jz2440_project/fs_qtopia/lib/ -d
b、拷贝触摸屏所需文件
到libts目录下:
cd /home/book/workspace/jz2440_project/system/deps/tslib/tmp
cp * /home/book/workspace/jz2440_project/fs_qtopia -rfd
修改开发板 /etc/ts.conf第1行(去掉#号和第一个空格):
# module_raw input
改为:
module_raw input
c、复制字库
cd /home/book/workspace/jz2440_project/system/deps/qtopia-free-2.2.0/
cp -rf qt2/lib/fonts qtopia/image/opt/Qtopia/lib/
d、将qtopia/image/opt/整个目录复制到开发板根目录上
cd /home/book/workspace/jz2440_project/system/deps/qtopia-free-2.2.0/
cp -rf qtopia/image/opt /home/book/workspace/jz2440_project/fs_qtopia
e、创建时区文件
直接使用主机中的时区文件:
cd /home/book/workspace/jz2440_project/fs_qtopia
mkdir -p usr/share/zoneinfo/
cp -rf /usr/share/zoneinfo/America usr/share/zoneinfo/
cp /usr/share/zoneinfo/zone.tab usr/share/zoneinfo/
通常Linux bash shell可执行脚本文件第一行必须是:#!/bin/sh开头,表明这个脚本通过/bin/sh程序来解释执行脚本中的命令,其它的可执行脚本也必须在第一行指明脚本的解释执行程序,如python脚本是:#! /usr/bin/pythonx.x
f、建立一个脚本文件,用来较验触摸屏
在单板根目录/bin下建立ts_cal.sh文件,内容如下:
=====================================================================
#!/bin/sh
export HOME=/root
export QTDIR=/opt/Qtopia Qt所在目录
export QPEDIR=/opt/Qtopia qte所在目录
export QWS_DISPLAY=LinuxFb:/dev/fb0
export QWS_KEYBOARD="TTY:/dev/tty1"
#export QWS_MOUSE_PROTO="USB:/dev/mouse0"
export QWS_MOUSE_PROTO="TPanel:/dev/ts0"
export PATH=$QPEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATH 指定TSLIB的库文件路径
export TSLIB_TSDEVICE=/dev/event0 指定触摸屏设备
export TSLIB_CALIBFILE=/etc/pointercal 指定触摸屏校准文件pointercal存放位置
export TSLIB_CONFFILE=/etc/ts.conf 指定触摸屏配置文件的位置
export TSLIB_PLUGINDIR=/lib/ts 指定触摸屏插件文所在路径
export TSLIB_CONSOLEDEVICE=none 设定控制台设备为none,否则默认为/dev/tty
export TSLIB_FBDEVICE=/dev/fb0 指定帧缓冲设备
/usr/bin/ts_calibrate
=====================================================================
我们使用ts_calibrate来较验触摸屏,QT自带的触摸屏程序不好用。想再次较验时,把/etc/po删掉后重启单板就可以了。
这个脚本被下面说到的qpe.sh调用。
还要修改它的属性:
chmod +x bin/ts_cal.sh
g、建立一个脚本文件,用来运行qtopia
在单板根目录/bin下建立qpe.sh文件,它用来设置环境变量、启动qtopia。内容如下:
=====================================================================
#!/bin/sh
export HOME=/root
export QTDIR=/opt/Qtopia
export QPEDIR=/opt/Qtopia
export QWS_DISPLAY=LinuxFb:/dev/fb0 界面最终显示在fb0中
export QWS_KEYBOARD="TTY:/dev/tty1" 指定鼠标键盘在tty1
#export QWS_MOUSE_PROTO="USB:/dev/mouse0"
export QWS_MOUSE_PROTO="TPanel:/dev/ts0" 帮助QMouseDriverFactory也就是Qt鼠标设备的枚举者来创建你想要的鼠标设备而不是系统默认的,指明要使用TPanel这个驱动,对应的设备名字是/dev/ts0
export PATH=$QPEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATHexport TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
if [ ! -e /etc/pointercal ]
then
/bin/ts_cal.sh
fi
$QPEDIR/bin/qpe &
=====================================================================
h、修改根文件系统的启动脚本
修改/home/book/workspace/jz2440_project/fs_qtopia/etc/fstab文件,加入一行:
tmpfs /tmp tmpfs defaults 0 0
/home/book/workspace/jz2440_project/fs_qtopia/etc/init.d/rcS,在最后加入以下一行:
/bin/qpe.sh &
还要修改它的属性:
chmod +x bin/qpe.sh
⑧ 制作YAFFS2、JFFS2文件系统映象文件:
mkyaffs2image fs_qtopia fs_qtopia1.yaffs2
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_qtopia -o fs_qtopia.jffs2
⑨ 烧写系统测试:
tftp 30000000 u-boot.bin; nand erase.part u-boot; nand write 30000000 u-boot
reset
tftp 30000000 uImage;nand erase.part kernel;nand write 30000000 kernel
tftp 30000000 fs_qtopia.yaffs2 ;nand erase.part rootfs;nand write.yaffs 30000000 460000 $filesize
或:
tftp 30000000 fs_qtopia.jffs2;nand erase.part rootfs;nand write.jffs2 30000000 260000 $filesize
设置参数:
set bootcmd 'nand read 30000000 kernel;bootm 30000000'
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
或:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
set machid 16a
save
reset
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2016-08/134254.htm