1、搭建交叉编译环境
https://opensource.motorola.com/sf/sfmain/do/home是有交叉编译工具链源码的(X86_Targeted_Toolchain_Source.tgz),不过目前编译好的只有linux环境下的(e8-gcc.tar.lzma),所以我使用的开发环境是Ubuntu 10.04,下载下来解压到任意目录下,这里我解压到/LinuxDev/work/phone/moto/e8/toolchain目录下。
为方便调用,写了一个脚本cross.sh:
view plaincopy to clipboardprint?
#!/bin/bash
MOTO_PHONE_MODEL=e8
MOTO_PHONE_DIR=phone/moto
HOST_OS=`uname -o`
if [ "${HOST_OS}" = "Cygwin" ]; then
export PATH_WORK_ROOT=/cygdrive/d/work/${MOTO_PHONE_DIR}/${MOTO_PHONE_MODEL}
else
export PATH_WORK_ROOT=/LinuxDev/work/${MOTO_PHONE_DIR}/${MOTO_PHONE_MODEL}
fi
export TOOLCHAIN_VERSION=e8-gcc
export TOOLCHAIN_PREFIX=arm-linux-gnueabi
#
# tool
#
export PATH_WORK_TOOL=${PATH_WORK_ROOT}/toolchain
export PATH_TOOLCHAIN_ROOT=${PATH_WORK_TOOL}/${TOOLCHAIN_VERSION}
export PATH_TOOLCHAIN_BIN=${PATH_TOOLCHAIN_ROOT}/bin
#
# Export ALL PATH
#
export PATH=${PATH_TOOLCHAIN_BIN}:${PATH}
export CROSS_COMPILE=${TOOLCHAIN_PREFIX}-
#!/bin/bash
MOTO_PHONE_MODEL=e8
MOTO_PHONE_DIR=phone/moto
HOST_OS=`uname -o`
if [ "${HOST_OS}" = "Cygwin" ]; then
export PATH_WORK_ROOT=/cygdrive/d/work/${MOTO_PHONE_DIR}/${MOTO_PHONE_MODEL}
else
export PATH_WORK_ROOT=/LinuxDev/work/${MOTO_PHONE_DIR}/${MOTO_PHONE_MODEL}
fi
export TOOLCHAIN_VERSION=e8-gcc
export TOOLCHAIN_PREFIX=arm-linux-gnueabi
#
# tool
#
export PATH_WORK_TOOL=${PATH_WORK_ROOT}/toolchain
export PATH_TOOLCHAIN_ROOT=${PATH_WORK_TOOL}/${TOOLCHAIN_VERSION}
export PATH_TOOLCHAIN_BIN=${PATH_TOOLCHAIN_ROOT}/bin
#
# Export ALL PATH
#
export PATH=${PATH_TOOLCHAIN_BIN}:${PATH}
export CROSS_COMPILE=${TOOLCHAIN_PREFIX}-
2、SDK开发环境
指的是motorola封装的QT图形库以及一些系统API的开发包,下载下面几个包即可:
E8SDK_by_ilove3d.tar.gz --- 1.0版开发包
E8 EZX SDK v1.1 by tulanix.zip --- 1.1版开发包,修复了1.0版本的一些错误
bin和tmakelib目录 --- 1.1版本的SDK中不带这两个目录,可以从1.0版本中复制过来
E8-lib.tar.bz2 --- 库文件,也可以从手机复制出来,不过不同的软件版本库文件有所不同,可能不通用
ilove3d_ezxSample_zn5_e8.tar.gz --- 示例代码
这里我把SDK放在/LinuxDev/work/phone/moto/e8/sdk/e8_ezx_sdk-1.1.0目录下,这个目录即是${QTDIR}。下载的那个E8-lib包整的不好,很多链接都变成真实文件了,大概是没有在手机中打包出来,将示例代码解压出来的ezxSample目录放到${QTDIR}/test路径下,按照下面的方法进行编译。
其中修改了一些文件:
${QTDIR}/env.sh
view plaincopy to clipboardprint?
#!/bin/bash
. ../../cross.sh
export MOTO_PHONE_MODEL=e8
export MOTO_PHONE_SDK=e8_ezx_sdk-1.1.0
export QTDIR=${PATH_WORK_ROOT}/sdk/${MOTO_PHONE_SDK}
export TMAKEPATH=${QTDIR}/tmakelib/pwd/arm-linux-g++/
export PATH=${QTDIR}/bin:${PATH}
#!/bin/bash
. ../../cross.sh
export MOTO_PHONE_MODEL=e8
export MOTO_PHONE_SDK=e8_ezx_sdk-1.1.0
export QTDIR=${PATH_WORK_ROOT}/sdk/${MOTO_PHONE_SDK}
export TMAKEPATH=${QTDIR}/tmakelib/pwd/arm-linux-g++/
export PATH=${QTDIR}/bin:${PATH}
${TMAKEPATH}/tmake.conf
第一次不修改此文件编译通过了,但是第二天再编译不知怎的就老是出现动态链接库(liblm.so等)找不到的错误,${QTDIR}/lib目录下是存在这个文件的,并且也将这个目录加到库文件的搜索路径中了,设置了LIBRARY_PATH、LD_LIBRARY_PATH等环境变量都没有用,将库文件复制到toolchain的lib目录下则可以找到。后来google了一下,链接时强制设置一下rpath就OK了。
view plaincopy to clipboardprint?
...
TMAKE_LFLAGS = -Wl,-rpath ${QTDIR}/lib
...
...
TMAKE_LFLAGS = -Wl,-rpath ${QTDIR}/lib
...
增加以下文件:
${QTDIR}/make.sh
view plaincopy to clipboardprint?
#!/bin/bash
APP=$1
progen -o ${APP}.pro
tmake ${APP}.pro -o Makefile
make
rm -f *~ moc_*.cpp *.o ${APP}.pro Makefile
#!/bin/bash
APP=$1
progen -o ${APP}.pro
tmake ${APP}.pro -o Makefile
make
rm -f *~ moc_*.cpp *.o ${APP}.pro Makefile
${QTDIR}/test/ezxSample/build.sh
view plaincopy to clipboardprint?
#!/bin/bash
APP=ezxSample
${QTDIR}/make.sh ${APP}
#!/bin/bash
APP=ezxSample
${QTDIR}/make.sh ${APP}
编译ezxSample:
(1) 进入E8_EZX_SDK_v1.1所在目录,执行:
. env.sh
(2) 进入ezxSample目录,执行:
./build.sh
不过把编译出来的elf放到手机上不能运行了,执行出错,后来发现是FTP上传elf文件传输不全,几十KB的文件到了手机上就只有几百字节了,难怪运行出错,索性直接拷贝了一个现成的mgx,将编译出来的ezxSample替换进去重新打包成mgx,再用FTP上传到手机中安装,在MagicBox中运行成功。 |