arm-linux-gcc 3.4.1算是一个已经比较旧的版本了,现在我们在Linux 2.6.29环境下,用的是4.3.2的编译器。
不过,因为还有一个S3C2410 + Linux 2.4.18的产品线,所以仍然没有舍弃 3.4.1。
之前在Linux 2.4.18下,跑的是4.3.5的Qtopia,效果还算不错,但是发现新版本的qt-embedded中,有了一些比较不错的特性,比如,在一个GuiServer程序中使用QProcess以GuiClient的方式调用另外一个QT应用程序,不再有两个程序抢夺唯一的一个fb的现象了,使得桌面程序在新版本下实现起来异常简单。
所以,决定将Linux 2.4.18平台下的qt升级到目前的最新版,4.6.2
首先,在编译QtEmbedded之前,需要在arm-linux-gcc 3.4.1下编译 tslib。
Step 1.
export CC=arm-linux-gcc
./autogen.sh
echo “ac_cv_func_malloc_0_nonnull=yes”>arm-linux.cache
./configure --host=arm-linux --cache-file=arm-linux.cache --enable-inputapi=no --prefix=$PWD/_install
注释掉config.h文件最后处的:
#define malloc rpl_malloc
make
make install
在_install目录下将生成所需的文件。
开发板:
需在开发板上设置如下环境变量:
TSLIB_CALIBFILE 校准数据文件的路径
TSLIB_CONFFILE tslib配置文件ts.conf的路径
TSLIB_PLUGINDIR tslib插件路径,指向lib/ts
TSLIB_FBDEVICE LCD设备文件
TSLIB_CONSOLEDEVICE 控制台设备文件
TSLIB_TSDEVICE 触摸屏设备文件
OK,tslib编译完毕。
Step 2.
接下来可以编译QtEmbedded了。不过,记得在编译之前,一定要unset CC,否则编译qt会出问题!
3.4.1下编译qt时需要指定tslib的路径,否则编译出现错误:
../../src/qt-everywhere-opensource-src-4.6.2/configure -release -no-largefile -no-stl -no-qt3support -no-cups -no-nis -no-opengl -no-openvg -embedded arm -qt-mouse-linuxtp -qt-mouse-tslib -I /home/lijian/QT/build/tslib-1.0-with3.4.1armgcc/_install/include -L /home/lijian/QT/build/tslib-1.0-with3.4.1armgcc/_install/lib -D__ARM_ARCH_5TEJ__
最后的-D__ARM_ARCH_5TEJ__不确定,对于2410来说,或许应该换成-D__ARM_ARCH_4T__(实际上,我本人在编译QtEmbedded的时候,并没有在最后加这条,接下来出了问题之后直接修改的部分Makefile,也可以用)
如果configure的时候没有加这句-D,编译的时候可能出现后面的第二种错误。
出现下面的错误:
/home/lijian/QT/source/qt-everywhere-opensource-src-4.6.2/src/gui/text/qfontengine_ft.cpp: In member function `bool QFontEngineFT::init(QFontEngine::FaceId, bool, QFontEngineFT::GlyphFormat)':
/home/lijian/QT/source/qt-everywhere-opensource-src-4.6.2/src/gui/text/qfontengine_ft.cpp:696: warning: converting to `int' from `qreal'
{standard input}: Assembler messages:
{standard input}:778: Error: register or shift expression expected -- `orr r3,r2,lsl#16'
{standard input}:789: Error: register or shift expression expected -- `orr r2,r3,lsl#16'
{standard input}:7748: Error: register or shift expression expected -- `orr r3,r0,lsl#16'
{standard input}:7761: Error: register or shift expression expected -- `orr r1,r0,lsl#16'
make[1]: *** [.obj/release-shared-emb-arm/qfontengine_ft.o] 错误 1
make[1]: Leaving directory `/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/src/gui'
make: *** [sub-gui-make_default-ordered] 错误 2
解决办法:
修改src/3rdparty/freetype/include/freetype/config/ftconfig.h文件的第330行:
"orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */
修改为:
"orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */
第二种错误:
In file included from ./config.h:26,
from ../JavaScriptCore/pcre/pcre_compile.cpp:44:
../JavaScriptCore/wtf/Platform.h:338:6: #error "Not supported ARM architecture"
make[1]: *** [obj/release/pcre_compile.o] Error 1
make[1]: Leaving directory `/usr/local/qte4.6-arm/src/3rdparty/webkit/WebCore'
make: *** [sub-webkit-make_default-ordered] Error 2
我的解决办法是,直接修改src/3rdparty/webkit/WebCore/Makefile,在cflags中加入-D__ARM_ARCH_4T__
修改src/script/Makefile,同上
如果configure时已经有此选项,应该不会出现这个问题
第三个错误:
这个错误发生在最后编译example和demo的过程中,如果在configure的时候取消了example,则可以跳过。
/home/.usr_local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/../../../../arm-linux/bin/ld: warning: libts-0.0.so.0, needed by /home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so, not found (try using -rpath or -rpath-link)
/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_close'
/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_config'
/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_read'
/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_read_raw'
/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_open'
/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/lib/libQtGui.so: undefined reference to `ts_fd'
collect2: ld returned 1 exit status
make[3]: *** [animatedtiles] 错误 1
make[3]: Leaving directory `/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/examples/animation/animatedtiles'
make[2]: *** [sub-animatedtiles-make_default] 错误 2
make[2]: Leaving directory `/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/examples/animation'
make[1]: *** [sub-animation-make_default] 错误 2
make[1]: Leaving directory `/home/lijian/QT/build/3.4.1gcc/qt-embedded-4.6.2/examples'
make: *** [sub-examples-make_default-ordered] 错误 2
解决:
修改mkspecs/qws/linux-arm-g++/qmake.conf
QMAKE_LINK = arm-linux-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-g++ -lts
至此,QtEmbedded-4.6.2在arm-linux-gcc 3.4.1下编译完成!
最后,make install