移植这个qtopia-core比较麻烦,由于我的编译器是ARM-GCC-2.95的,有很多地方要修改才能交叉编译成功。不过我也试过用3.4.2的ARM交叉编译器编译过,也是有很多编译错误的。
1.下面是需要修改的文件或者配置的详细情况:
1).修改 src/corelib/kernel/qvariant_p.h 文件的 v_cast 函数
template <typename T>
inline const T *v_cast(const QVariant::Private *nd, T * = 0)
{
return ((sizeof(T) > sizeof(QVariant::Private::Data))
? static_cast<const T *>(d->data.shared->ptr)
: static_cast<const T *>(static_cast<const void *>(&d->data.c)));
}
修改为:
template <typename T>
inline const T *v_cast(const QVariant::Private *nd, T * = 0)
{
QVariant::Private *d = const_cast<QVariant::Private *>(nd);
return ((sizeof(T) > sizeof(QVariant::Private::Data))
? static_cast<T *>(d->data.shared->ptr)
: static_cast<T *>(static_cast<void *>(&d->data.c)));
}
2).修改 src/gui/embedded/qwssignalhandler_p.h
//#ifdef Q_OS_BSD4
typedef sig_t sighandler_t;
//#endif
3).修改/src/gui/painting/qdrawhelper_p.h 把 template<> 去掉
4).编译configure只能用16,32的颜色深度
5).修改src/gui/tex/qfontengine_qpf.cpp 第57行,提到 #ifdef QT_LSB 外面
6).修改src/gui/styles/qstylesheetstyle.cpp 1902 行开始
struct RuleRoleMap {
int state;
QPalette::ColorGroup group;
} map[3]= {
{ PseudoClass_Enabled, QPalette::Active },
{ PseudoClass_Disabled, QPalette::Disabled },
{ PseudoClass_Enabled, QPalette::Inactive }
};
修改为:
struct RuleRoleMap {
int state;
QPalette::ColorGroup group;
};
struct RuleRoleMap map[3];
map[0].state = PseudoClass_Enabled; map[0].group = QPalette::Active;
map[1].state = PseudoClass_Disabled; map[1].group = QPalette::Disabled;
map[2].state = PseudoClass_Enabled; map[2].group = QPalette::Inactive;
7).src/gui/util/qdesktopservices_qws.cpp编译有错,配置去掉desktopservices 属性 -no-feature-desktopservices
8).修改 src/svg/qsvghandler.cpp 文件,否则308行的strtof编译有错应该是c99标准相关问题。把 static qreal toDouble(const QChar *&str) 的前面加
extern float strtof(const char * str, char**nstr); 定义。
9).修改 src/script/qscriptlexer.cpp 文件,把 int QScript::Lexer::lex() 的前面加
extern long double strtold(const char *nptr, char **endptr); 定义。
10).修改src/script/qscriptextqobject.cpp,代码覆盖了三目运算符 ? :, 把 169-182行:
if (index != -1) {
QMetaProperty prop = meta->property(index);
if (prop.isScriptable()) {
member->native(nameId, index,
QScriptValue::Undeletable
| QScriptValue::SkipInEnumeration
| (GeneratePropertyFunctions
? (QScriptValue::PropertyGetter
| QScriptValue::PropertySetter)
: QScriptValue::PropertyFlag(0))
| PROPERTY_ID);
return true;
}
}
改为:
if (index != -1) {
QMetaProperty prop = meta->property(index);
if (prop.isScriptable()) {
int tmp;
if(GeneratePropertyFunctions)
tmp = QScriptValue::PropertyGetter | QScriptValue::PropertySetter;
else tmp = QScriptValue::PropertyFlag(0);
member->native(nameId, index,
QScriptValue::Undeletable
| QScriptValue::SkipInEnumeration
| tmp
| PROPERTY_ID);
return true;
}
}
2.交叉编译不多说,运行以下脚本:
#----------------------------------------------------------------------------------#
#!/bin/shexport QTCDIR=`pwd`
export QTDIR=$QTCDIR
#交叉编译器路径
export PATH=/opt/host/armv4l/bin:$PATH
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
#depths参数设置有8位的话2.95的编译器编译会出错,desktopservices模块也会出错,要去掉
./configure -no-cups -xplatform qws/linux-arm-g++ -opengl -no-qvfb -depths 16,32 -embedded arm -no-feature-desktopservicesmake
#----------------------------------------------------------------------------------#
编译好后 $QTCDIR/lib 就会有可以是用的动态库...
没有搞触摸屏,有兴趣的可以搞一下。