QT/E 4.5.0 For Embedded Linux 的 bug

在尝试裁减Qt/E 4.5.0 for Embedded Linux时,作者遇到了三个编译错误。第一个错误涉及-QT_NO_TABLETEVENT宏,已通过修改代码解决。第二个错误在webkit模块的qt_instance.h文件,因QScriptEngine未被声明。作者检查配置命令和头文件,但未能找到原因。提供了已修复的源代码,但仅适用于Qt 4.5.0 for Embedded Linux,且尚未进行链接和运行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天在研究 Qt/E 4.5 的系统裁减的问题,不知道是Qt官方做的测试不够,还是自己还没有完全搞明白,目前发现了几个小问题,自己Fix了两个,还有一个,始终搞不明白。

首先,在做配置的时候做出选择,我需要使用哪些QT的模块,我做出的配置如下:
./configure -fast -no-qt3support -no-feature-PROPERTIES -no-feature-TEXTODFWRITER -no-feature-CSSPARSER   -no-feature-DRAGANDDROP   -no-feature-SESSIONMANAGER   -no-feature-SHORTCUT   -no-feature-CURSOR  -no-feature-STL   -no-feature-STACKEDWIDGET   -no-feature-MDIAREA -no-feature-CLIPBOARD   -no-feature-EFFECTS   -no-feature-PROCESS   -no-feature-QUUID_STRING   -no-feature-FILESYSTEMMODEL   -no-feature-TREEWIDGET   -no-feature-TABBAR -no-feature-TABLETEVENT

然后执行make命令 ,编译的结果是出现了三个bug。

第一个bug是关于 -no-feature-TABLETEVENT 的,代码的错误出现在 application.cpp 文件中,大约在 3604 行,原code如下:

  1. #if !defined(QT_NO_WHEELEVENT) || !defined(QT_NO_TABLETEVENT)
  2.         else if (
  3. #  ifndef QT_NO_WHEELEVENT
  4.                  e->type() == QEvent::Wheel ||
  5. #  endif
  6. #  ifndef QT_NO_TABLETEVENT
  7.                  e->type() == QEvent::TabletMove
  8.                  || e->type() == QEvent::TabletPress
  9.                  || e->type() == QEvent::TabletRelease
  10. #  endif
  11.         ) {
复制代码

错误信息是这样的:
86-g++ -I. -I../../include/QtCore -I../../include/QtNetwork -I../../include -I../../include/QtGui -I.rcc/release-shared-emb-x86 -I/usr/include/freetype2 -I../3rdparty/harfbuzz/src -Idialogs -I.moc/release-shared-emb-x86 -I.uic/release-shared-emb-x86 -o .obj/release-shared-emb-x86/qapplication.o kernel/qapplication.cpp
kernel/qapplication.cpp: In member function ‘virtual bool QApplication::notify(QObject*, QEvent*)’:
kernel/qapplication.cpp:3604: error: expected primary-expression before ‘)’ token
make[1]: *** [.obj/release-shared-emb-x86/qapplication.o] Error 1
make[1]: Leaving directory `/home/kevin/tmp/qte-release-2/src/gui'
make: *** [sub-gui-make_default-ordered] Error 2
kevin@linux-s0es:~/tmp/qte-release-2>

大家看这段代码,如果我没有定义 QT_NO_WHEELEVENT 宏,但是却定义了 QT_NO_TABLETEVENT 的话,那么预编译之后这段代码就变成了:

  1.     else if (
  2.              e->type() == QEvent::Wheel ||
  3.     ) {
复制代码

事实上,我说做的配置就是这样的,这显然编译不过去吗,只要对这段代码稍作修改,就OK了,我修改后的代码如下:

  1. #if !defined(QT_NO_WHEELEVENT) || !defined(QT_NO_TABLETEVENT)
  2.         else if (
  3.                  false
  4. #  ifndef QT_NO_WHEELEVENT
  5.                  || e->type() == QEvent::Wheel
  6. #  endif
  7. #  ifndef QT_NO_TABLETEVENT
  8.                  || e->type() == QEvent::TabletMove
  9.                  || e->type() == QEvent::TabletPress
  10.                  || e->type() == QEvent::TabletRelease
  11. #  endif
  12.         ) {
复制代码


第二个bug是关于-no-feature-TABBAR的,有问题的代码出在qdockarealayout.cpp文件中,2014行处,

第一个问题是在 void QDockAreaLayoutInfo::updateSeparatorWidgets() const 函数中,代码如下:
  1.     if (tabbed) {
  2.         that->separatorWidgets.clear();
  3.         return;
  4.     }
复制代码
大家会说,这有什么问题呀?错误信息是这样的:
widgets/qdockarealayout.cpp:2014: error: ‘tabbed’ was not declared in this scope

我查看了一下QDockAreaLayoutInfo这个class的定义,其中,tabbed这个变量的定义是这样的:
  1. #ifndef QT_NO_TABBAR
  2.   //................
  3.   bool tabbed;
  4.   //................
  5. #endif
复制代码
我把这段代码稍微修改了一下,也加上了宏包含,就OK了。
  1. #ifndef QT_NO_TABBAR
  2.     if (tabbed) {
  3.         that->separatorWidgets.clear();
  4.         return;
  5.     }
  6. #endif
复制代码
这第二个问题也出在这个源代码文件中,qdockarealayout.cpp, 在2042和3170行上,共出现了两次,错误信息是这样的:
widgets/qdockarealayout.cpp:2042: error: ‘class QMainWindowLayout’ has no member named ‘getSeparatorWidget’
widgets/qdockarealayout.cpp: In member function ‘void QDockAreaLayout::updateSeparatorWidgets() const’:
widgets/qdockarealayout.cpp:3170: error: ‘class QMainWindowLayout’ has no member named ‘getSeparatorWidget’
make[1]: *** [.obj/release-shared-emb-x86/qdockarealayout.o] Error 1

原代码如下:
  1.         } else {
  2.             sepWidget = mainWindowLayout()->getSeparatorWidget();
  3.             that->separatorWidgets.append(sepWidget);
  4.         }
复制代码
对了,这个错误啊,也是因为没有加上宏包含所导致的,我的修改如下:
  1.         } else {
  2. // fixed by Q-Kevin, http://www.InsideQt.com, begin
  3. #ifndef QT_NO_TABBAR
  4.             sepWidget = mainWindowLayout()->getSeparatorWidget();
  5. #endif // QT_NO_TABBAR
  6. // fixed by Q-Kevin, http://www.InsideQt.com, end
  7.             that->separatorWidgets.append(sepWidget);
  8.         }
复制代码
对于这个文件中两个bug的修改,我这里仅仅是修改后能够编译过去了,但功能是否是对的,我还不知道,有待验证

 

对于第三个bug,我就没有搞定了,希望高手能指点我一下。错误信息如下:

/animation -Ibridge -Iediting -Irendering -Irendering/style -Ihistory -Iinspector -Ixml -Ihtml -Iwml -Ibindings/js -Isvg -Iplatform/image-decoders -Iplugins -Ibridge -Ibridge/c -Ibridge/qt -Igenerated -I../../sqlite -I.moc/release-shared-emb-x86 -I.uic/release-shared-emb-x86 -o .obj/release-shared-emb-x86/runtime.o bridge/runtime.cpp
In file included from bridge/runtime.cpp:34:
bridge/qt/qt_instance.h:64: error: ‘QScriptEngine’ has not been declared
bridge/qt/qt_instance.h:64: error: expected ‘,’ or ‘...’ before ‘ownership’
bridge/qt/qt_instance.h:68: error: ‘QScriptEngine’ has not been declared
bridge/qt/qt_instance.h:68: error: expected ‘,’ or ‘...’ before ‘ownership’
bridge/qt/qt_instance.h:75: error: ‘QScriptEngine’ has not been declared
bridge/qt/qt_instance.h:75: error: expected ‘,’ or ‘...’ before ‘ownership’
bridge/qt/qt_instance.h:83: error: ‘QScriptEngine’ has not been declared
bridge/qt/qt_instance.h:83: error: ISO C++ forbids declaration of ‘ValueOwnership’ with no type
bridge/qt/qt_instance.h:83: error: expected ‘;’ before ‘m_ownership’
bridge/qt/qt_instance.h: In static member function ‘static WTF::PassRefPtr<JSC::Bindings::QtInstance> JSC::Bindings::QtInstance::create(QObject*, WTF::PassRefPtr<JSC::Bindings::RootObject>, int)’:
bridge/qt/qt_instance.h:70: error: ‘ownership’ was not declared in this scope
make[1]: *** [.obj/release-shared-emb-x86/runtime.o] Error 1
make[1]: Leaving directory `/home/kevin/tmp/qte-rel5/src/3rdparty/webkit/WebCore'
make: *** [sub-webkit-make_default-ordered] Error 2
kevin@linux-s0es:~/tmp/qte-rel5>

查看了一下,qt_instance.h 是属于 webkit 模块的,它需要使用到JavaScript模块,所以报告说,QScriptEngine类没有定义,
我又仔细对照了几遍我的配置命令,我并没有disable script模块呀?
./configure -fast -no-qt3support -no-feature-PROPERTIES -no-feature-TEXTODFWRITER -no-feature-CSSPARSER   -no-feature-DRAGANDDROP   -no-feature-SESSIONMANAGER   -no-feature-SHORTCUT   -no-feature-CURSOR  -no-feature-STL   -no-feature-STACKEDWIDGET   -no-feature-MDIAREA -no-feature-CLIPBOARD   -no-feature-EFFECTS   -no-feature-PROCESS   -no-feature-QUUID_STRING   -no-feature-FILESYSTEMMODEL   -no-feature-TREEWIDGET   -no-feature-TABBAR -no-feature-TABLETEVENT

然后我又看了一下定义QScriptEngine类的头文件,那里面的模块包含的宏包含,看上去也没有问题呀?那么,bug在哪里呢?是不是其它的某个配置错误的屏蔽了这个类呢?

 

 

最后,我把fix了的两个源代码文件贴上来,需要的朋友可以直接download下来,覆盖源代码包中相应的文件就可以了。
注意:they are ONLY for "Qt 4.5.0 for Embedded Linux"。
还有,我仅仅是编译通过了,链接过程还没有到呢,就进行不下去了,更是没有机会去验证程序运行的正确性,所以,我不能保证他们是完全正确的,如果你要使用的话,请多做验证。如果发现问题了,也请您能告诉我,非常感谢。

qte.450.bug.fix.zip (56.69 KB)

 

 

在本文的最后,我要感谢GVIM,我改的code本来也引入了一个bug,是在他的帮助下fix的。

注:如需转载本文,请不要漏掉本文原始地址:
http://www.insideqt.com/bbs/viewthread.php?tid=26

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值