记录一下编译嵌入式QT库的过程,备忘

编译使用的是目前最新的QT4.8.5(QT5就免了)。折腾了两三天才弄好,记录下过程,以备不时之需。


首先是配置,使用 ./configure -help 及 ./configure -embedded -help 可以显示帮助信息,介绍了所有命令行参数。

因为有商业版和免费版,所以运行配置的时候会被询问使用什么版本以及是否接受协议,每次被询问很繁琐,用 -confirm-license -opensource 这两个命令行参数可以避免询问。

把QT完整编译一遍是很费时的,要是编译了几个小时之后出现一个错误,更是让人抓狂。由于只用来开发个简单的界面,只需要几个库文件,因此很多东西可以不编译。QT分为几部分 (libs tools examples demos docs translations),用 -nomake 指定要跳过的部分,比如 -nomake examples 就不编译例子程序。多用几个 -nomake,只留下libs即可。

另外有很多库也不需要,同样可以不编译,比如 -no-webkit 等

-prefix 指定make install 时QT的文件都安装在哪里。同时,这个路径也将成为将来QT库寻找 lib/fonts目录的起始目录。

-qt-zlib 指定QT编译进自带的zlib,而不使用系统中的动态链接库。

-qt-freetype 同样,指定QT编译进自带的freetype,而不使用系统中的动态链接库。


还有一些在交叉编译时特有的配置参数:

-embedded arm 表示要交叉编译arm版本的QT。

-little-endian 目标系统是小端系统,这个参数必须要有,否则不能完成配置。

-xplatform qws/linux-armv7-g++ 用于指定一个交叉编译的mkspec,里面设置了工具链、编译选项等

-qt-gfx-linuxfb 让QT使用linux的framebuffer显示图形。

-qt-kbd-tty 使用TTY键盘驱动

-qt-kbd-linuxinput 使用LinuxInput键盘驱动

-qt-mouse-linuxinput 使用LinuxInput鼠标驱动,其它可选的还有 pc linuxtp linuxinput tslib qvfb qnx integrity


关于mkspecs:

查看 mkspecs\qws 目录下,有 linux-arm-g++、linux-arm-gnueabi-g++、linux-armv6-g++ 三个目录。我的目标板使用的是A8处理器am335x,而这里没有。把最接近的 linux-armv6-g++ 整个目录拷贝并命名为 linux-armv7-g++,然后修改其中的 qmake.conf 文件,将工具链改为自己的工具链,并修改以下两行:

QMAKE_CFLAGS           += -march=armv7-a -fno-tree-vectorize -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a8
QMAKE_CXXFLAGS         += -march=armv7-a -fno-tree-vectorize -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a8

准备工作先告一段落,选定的配置参数如下:

./configure -embedded arm -xplatform qws/linux-armv7-g++ -confirm-license -opensource -release -no-webkit -no-phonon -no-phonon-backend -no-script -no-scripttools -no-qt3support -no-multimedia -no-nis -no-openvg -no-exceptions -nomake examples -nomake demos -nomake docs -nomake translations -nomake tools -prefix /home/wolf/testqt -no-largefile -no-accessibility -no-stl -no-xmlpatterns -no-audio-backend -no-svg -no-javascript-jit -no-declarative -qt-zlib -no-openssl -no-cups -no-dbus -qt-gfx-linuxfb -no-opengl -qt-freetype -little-endian


然后就是make

然后就华丽丽的出错了:

undefined reference to 'clock_gettime'

谷歌一下,有人说需要链接 pthread 和 rt 两个库。检查一下编译时的打印,pthread已经有了,还缺rt(为什么会缺呢?),所以重新配置一次,加上 -lrt 参数。


再make,又有另一个错误:

cc1: fatal error: .pch/release-shared-emb-arm/QtGui: No such file or directory

网上说,预编译头文件功能有问题,可以用 -no-pch 禁用之。还有人说,改Makefile可以解决。

改代码,不好吧,还是用 -no-pch 好了,只是不晓得编译会不会变慢,我也没仔细比较。


最后,能正常工作的配置参数是:

./configure -embedded arm -xplatform qws/linux-armv7-g++ -confirm-license -opensource -release -no-webkit -no-phonon -no-phonon-backend -no-script -no-scripttools -no-qt3support -no-multimedia -no-nis -no-openvg -no-exceptions -nomake examples -nomake demos -nomake docs -nomake translations -nomake tools -prefix /home/wolf/testqt -no-largefile -no-accessibility -no-stl -no-xmlpatterns -no-audio-backend -no-svg -no-javascript-jit -no-declarative -qt-zlib -no-openssl -no-cups -no-dbus -qt-gfx-linuxfb -no-opengl -qt-freetype -little-endian -no-pch -lrt


然后 make,总共执行了20分钟左右(编译环境:Virtualbox 里虚拟的 ubuntu)


你可能感兴趣的:(工作流水账)