Qt是一个跨平台的C++应用程序开发框架,广泛用于开发GUI程序。使用Qt开发的软件,相同的代码可以在任何支持的平台上编译与运行,而不需要修改源代码。会自动依平台的不同,表现平台特有的图形界面风格。
Qt在嵌入式开发中有着广泛的应用,使用Qt只需编写一次应用程序和UI,无须重新编写源代码,便可跨不同的桌面和嵌入式操作系统进行部署,既节省了时间又降低开发成本。
---------------------------------------------------------------------
一 移植步骤
1,确定linux操作系统版本及编译器版本,版本GCC4.3.5
2,安装tslib库用于支持触摸屏,版本tslib-1.0
3,移植qt库用于支持qt主程序,版本Qt4.8.5
4,移植qt主程序到linux中,版本C_1k_1.14
---------------------------------------------------------------------
-
--------------------------------------------------------------------
二 linux操作系统版本及编译器版本
cat /proc/version
//DTV1000W_9G10平台
Linux version 2.6.30.10 (root@wangwei-virtual-machine) (gcc version 4.2.3 (Sourcery G++ Lite 2008q1-126)) #28 Thu Nov 22 19:55:12 CST 2012
液晶屏:5.6寸(640×480)
//公司ARM9平台
Linux version 2.6.39 (root@ubuntu) (gcc version 4.3.5 (Buildroot 2011.05) ) #74 Tue Jan 8 19:35:16 CST 2013
//虚拟机上的x86平台
Linux version 2.6.32-33-generic (buildd@rothera) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #70-
Ubuntu SMP Thu Jul 7 21:09:46 UTC 2011
//新版CCU的
//Linux version 2.6.39 (root@ubuntu) (gcc version 4.2.4) #70 Tue Nov 12 17:01:38 CST 2013
此处显示gcc version 4.2.4 但实际中需要用 gcc version 4.3.5交叉编译才能运行,与系统移植时的命名有关。
液晶屏:10.4寸(800×600)
---------------------------------------------------------------------
----------------------------------------------------------------------
三 安装tslib
装tslib,主要是为了校准触摸屏以及去抖等功能,
在虚拟机上执行下列命令,
cp tslib-1.0.tar.bz2  /home
tar -xvjf tslib-1.0.tar.bz2
cd tslib-1.0
./autogen.sh
问题1 ,在执行 ./autogen.sh  时、出现如下错误
libtoolize: $pkgltdldir not a directory: `/home/ti-sdk-am335x-evm/linux-devkit/share/libtool'
autoreconf: libtoolize failed with exit status: 1
解决3,在系统目录中创建 ti-sdk-am335x-evm 文件夹,将linux-devkit 放到这个文件夹中
mkdir ti-sdk-am335x-evm
cp -rf ./linux-devkit ti-sdk-am335x-evm/
./configure CC=arm-linux-gcc-4.3.5 --build=i686-pc-linux --target=arm-linux --prefix=/opt/tslib-1.3 --host=arm-linux ac_cv_func_malloc_0_nonnull=yes --enable-inputapi=yes
CC=arm-linux-gcc-4.3.5 ./configure --prefix=/opt/tslib-1.3 --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
修改./config.h 将文件中的 #define malloc rpl_malloc 这句话屏蔽
gedit ./config.h
make
make install
问题1,在make时
出现错误
/home/AT9x25/buildroot-2011.05/output/host/usr/lib/gcc/arm-unknown-linux-uclibcgnueabi/4.3.5/../../../../arm-unknown-linux-uclibcgnueabi/bin/ld: unknown architecture of input file `.libs/ts_fd.o' is incompatible with arm output
collect2: ld returned 1 exit status
make[2]: *** [libts.la] 错误 1
make[2]:正在离开目录 `/mnt/hgfs/CCU/QT移植相关/tslib-1.0/src'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/mnt/hgfs/CCU/QT移植相关/tslib-1.0'
make: *** [all] 错误 2
解决1,原因是以开始我将 tslib-1.0.tar.bz2 放在挂载盘”/mnt/hgfs/CCU/QT移植相关“ 下面,将该文件挪到/home文件夹下后问题消除,得出一个交叉编译的一个通用惯例,就是make,instal等操作不能在挂载盘下执行,最好在系统目录下执行。在问题1的情况下,config.h里面的内容也是不正确的。
解决问题1后,会出现问题2
问题2,在make时出现错误
libtool: link: arm-linux-gcc-4.3.5 -DGCC_HASCLASSVISIBILITY -O2 -Wall -W -o .libs/ts_test ts_test.o fbutils.o font_8x8.o font_8x16.o  ../src/.libs/libts.so -ldl -Wl,-rpath -Wl,/opt/tslib-1.0/lib
fbutils.o: In function `open_framebuffer':
fbutils.c:(.text+0xa68): undefined reference to `rpl_malloc'
collect2: ld returned 1 exit status
make[2]: *** [ts_test] 错误 1
make[2]:正在离开目录 `/home/tslib-1.0/tests'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/home/tslib-1.0'
make: *** [all] 错误 2
解决2,查网络资料得知,此时的config.h里有下面的几句话:
/* Define to rpl_malloc if the replacement function should be used. */
#define malloc rpl_malloc
把上面的几句话删掉后重新编译,就正常了,交叉编译時autotools认为我的工具链的libc中不包含malloc和realloc,然后擅自做主张地替换成了rpl_malloc
gedit ./config.h
问题3,在make时出现错误
/bin/bash ../libtool --tag=CC  --mode=compile arm-linux-gcc-4.3.5 -DHAVE_CONFIG_H -I. -I..      -DPLUGIN_DIR=\"\" -DTS_CONF=\"\"  -MT ts_attach.lo -MD -MP -MF .deps/ts_attach.Tpo -c -o ts_attach.lo ts_attach.c
libtool: Version mismatch error.  This is libtool 2.2.6b, but the
libtool: definition of this LT_INIT comes from libtool 2.2.10.
libtool: You should recreate aclocal.m4 with macros from libtool 2.2.6b
libtool: and run autoconf again.
make[2]: *** [ts_attach.lo] 错误 63
make[2]:正在离开目录 `/home/tslib-1.3/src'
make[1]: *** [all-recursive] 错误 1
make[1]:正在离开目录 `/home/tslib-1.3'
make: *** [all] 错误 2
解决3
运行 autoreconf -ivf 即可。但是在运行时,当前的这条命令也出现了问题
plugins/Makefile.am:12: `:='-style assignments are not portable
autoreconf -fiv
autoreconf --force --install
prefix后面是生成文件存放的目录,可以自定义,装好后修改/opt/tslib-1.0/f 去掉module_raw input 前面的#号,然后把/opt/tslib-1.0里的文件都拷入开发
板,比如我放在了/usr/ts里。再配置开发板的环境变量,让/usr/ts/bin/ts_calibrate能正常运行,环境变量如下。
export PATH="$PATH:/usr/ts/bin"
export set LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/ts/lib"
export set TSLIB_TSDEVICE=/dev/input/event0
export set TSLIB_CONFFILE=/usr/ts/f
export set TSLIB_CALIBFILE=/etc/pointercal
export set TSLIB_PLUGINDIR=/usr/ts/lib/ts
以上为必须配置
export set TSLIB_FBDEVICE=/dev/fb0
export set TSLIB_TSEVENTTYPE=H3600
export set TSLIB_CONSOLEDEVICE=none
问题1,如果执行过程中出现
./ts_calibrate: can't load library 'libts-0.0.so.0'
需要将 /usr/ts/lib 里的内容全部拷贝到系统/lib中 或export set LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/ts/lib"
问题2,如果执行过程中出现
ts_open: No such file or directory
需要修改 export set TSLIB_TSDEVICE=/dev/input/event0 ,确认触摸屏对应的设备为event0
问题3,如果执行过程中出现No raw modules loaded
修改/opt/tslib-1.0/f 去掉module_raw input 前面的#号,
----------------------------------------------------------------------
----------------------------------------------------------------------
四 安装Qt4.8.5, 下载到的版本是 qt-everywhere-opensource-src-4.8.
同样,先拷贝到/home 下,解压,配置,编译,安装,观察他的configue,用到了触摸屏的库文件等,
cp qt-everywhere-opensource-src-4.8.  /home
tar -xvzf qt-everywhere-opensource-src-4.8.
cd /home/qt-everywhere-opensource-src-4.8.5
然后修改配置
gedit ./mkspecs/qws/linux-arm-g++/f
把 linux-arm-g++/f 里的linux-arm-g++ 改成交叉编译器 arm-linux-g++ ,linux-arm-gcc改成arm-linux-gcc-4.3.5 ,
另外添加下面两个ts的配置,
QMAKE_INCDIR=/opt/tslib-1.0/include
QMAKE_LIBDIR=/opt/tslib-1.0/lib
然后保存退出
然后是configure make install三步进行曲,config用config.sh,我已经把这个已经变成了脚本形式,放在配置库中,方便使用
./config.sh
必须在config里增加 -make libs ,否则会出现一些类似于缺少 -lbootstrap库的错误,上面的config.sh脚本已经包含
附录
linux下gcc编译的四个步骤./configure  \
-prefix  /usr/local/qt-4.6.2-arm  \  (安装路径)
-opensource  \  (自由版本)
-confirm-license  \  (遵守协议yes)
-release  \  (编译和连接QT时关闭调试)
-shared  \  (使用QT动态库)
-embedded  arm  \  (嵌入式arm架构)
-xplatform  qws/linux-arm-g++  \  (交叉编译时的目标平台)
-no-qt3support  \  (关闭QT3支持功能)
-fast  \  (只对库及子目录make来快速配置QT)
-no-largefile  \  (使大文件支持无效)
-qt-mouse-tslib  \  (使用tslib来驱动鼠标箭头运行,即支持触摸屏)
-I  /usr/local/tslib/include  \  (添加一个显式的include路径)
-L  /uar/local/tslib/lib  \  (添加一个显式的lib路径)
-make libs \ (构建lib库)
-make  tools  \  (构
建tools)
-nomake  demos  \  (不构建demos)
-nomake  examples  \(不构建examples)
-nomake  docs  \  (不构建docs)
-qt-libjpeg  \  (使用jpeg库)
-qt-libpng  \  (使用png库)
-qt-libtiff  \  (使用tiff库)
-multimedia  \  (构建QT多媒体模块)
-no-qvfb  \  (不构建QVFB模块)
-no-svg  \  (不构建SVG模块)
-no-cups  \  (不编译CUPS支持)
-
embedded 体系结构参数
QT为了更高的效率和线程安全。QT定义的原子操作,它跟各个平台高度相关。嵌入式平台必须配置这个参数,Configure用-embeded 写入Makefile.比如arm 就是 –embedded arm .
这个参数决定QtCore引用哪一个头文件,象ARM就引用 src/corelib/arch/qatomic_arm.h
-little-endian  字节序选项–big-endian
大部分采用 -little-endian (小端字节序)
-shared 编译动态版本
-prefix 编译好Qt库安装目录,默认目录是/usr/local/Trolltech/QtEmbedded-4.6.3 ,这里设为
-prefix /opt/QtEmbedded-4.5.3 (注意没有=)
-D <string> ........增加宏定义
-I <string> ........ 增加外部头文件引用目录
-L <string> ........ 增加外部库路径
这个指QT库中哪一些不被编译,这一类参数以 --nomake 来指定
如 –nomake examples –nomake demos ,这个以节约编译时间。
相反的指定哪一部分编译用 –make 如  -make libs
如果QT的扩展库则直接采用名字来指明。
-no-XXX表示不编译某一些库,  -no-phonon 不编译 phonon库,则对应的 –phonon就编译它。类似参数有。
[-no-dbus] [-dbus]  [-no-svg] [-svg] [-no-webkit] [-webkit]
QT作为一个跨平台的函数,必然大量引用第三方库,在嵌入式平台上,必须要有选择指定使用第三方案。
一般有三种情况。
1).QT已经把大量第三方库源码放在src/3rdparty目录下。用 -qt-XXXX参数指定,如 -qt-libpng 表示用QT自己目录下的libpng源码编译,这种方法比较省心,并且出错可能少。
2).使用操作系统中已经编译好第三方库,用-system-XXX参数指定,如-system-libjpeg 表示用系统中编译好的libjpeg库,这里需要与 –I,-L两个参数来指定相应头文件和库路径。
3).不编译,使用-no-XXX来指定 ,如-no-cups,不编译cups打印支持。
问题1
在configue时,会有如下提示,
Type 'c' if you want to use the Commercial Edition.
Type 'o' if you want to use the Open Source Edition.
解决1 输入o回车,然后会有用户使用协议,输入yes表示同意,开始配置。
问题2 过一段时间后会出现下列信息,
You have not explicitly asked to use pkg-config and are cross-compiling.
pkg-config will not be used to automatically query cflag/lib parameters for
dependencies
The tslib functionality test failed!
You might need to modify the include and library search paths by editing
QMAKE_INCDIR and QMAKE_LIBDIR in
/home/qt-everywhere-opensource-src-4.8.5/mkspecs/qws/linux-arm-g++.
解决2 根据上述提示,需要添加两个配置
gedit /home/qt-everywhere-opensource-src-4.8.5/mkspecs/qws/linux-arm-g++/f
QMAKE_INCDIR=/opt/tslib-1.0/include
QMAKE_LIBDIR=/opt/tslib-1.0/lib
另外还需要将 tslib-1.0/bin 添加到系统目录中
export PATH="$PATH:/opt/tslib-1.0/bin"
export PATH="$PATH:/home/qt-everywhere-opensource-src-4.8.5/mkspecs/qws/linux-arm-g++"
问题3
Basic XLib functionality test failed!
You might need to modify the include and library search paths by editing
QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /home/qt-everywhere-opensource-src-4.8.5/mkspecs/linux-g++.
解决3
还是老办法,以不变应万变。进st / x11/xlib 执行make命令,看出错信息
g++ -Wl,-O1 -o xlib xlib.o    -L/usr/X11R6/lib -lXext -lX11 -lm
/usr/bin/ld: cannot find -lXext
看到了吧,g++在/usr/X11R6/lib下,不到libXext.so呢。
其原因就在于需要安装libX11的开发包,在ubuntu/debian里包名都是libX11-dev
根据以往的经验,在./configure前主动装好下面3个包,基本上就万事大吉了,执行下列命令,需要通过网络下载一些必要的组件,虚拟机的联网可以通过设置 网络模式为NAT:Used to share the host's IP address来实现
sudo apt-get install libX11-dev libXext-dev libXtst-dev
直到出现下列提示表示config已经成功
Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /opt/qt-4.8.5-arm
To reconfigure, run 'make confclean' and 'configure'.
然后执行make ,估计需要1小时左右
make
问题1 make 后出现下列提示
In file included from animation/qabstractanimation.cpp:1057:
../../include/QtCore/../../src/corelib/arch/qatomic_i386.h: In destructor 'QWeakPointer<T>::~QWeakPointer() [with T = QAbstractAnimation]':
../../include/QtCore/../../src/corelib/arch/qatomic_i386.h:132: error: impossible constraint in 'asm'
make[1]: *** [.obj/release-shared/qabstractanimation.o] 错误 1
make[1]:正在离开目录 `/home/qt-everywhere-opensource-src-4.8.5/src/corelib'
make: *** [sub-corelib-make_default-ordered] 错误 2
解决1 需要把 linux-arm-g++/f 里的linux-arm-g++ 改成交叉编译器 arm-none-linux-gnueabi-g++ ,gcc改成gcc-4.2.3 保存退出
问题2 make 后出现下列提示
socket/qnativesocketengine_unix.cpp: In member function 'bool QNativeSocketEnginePrivate::nativeSetMulticastInterface(const QNetworkInterface&)':
socket/qnativesocketengine_unix.cpp:725: error: 'IPV6_MULTICAST_IF' was not declared in this scope
make[1]: *** [.obj/release-shared-emb-arm/qnativesocketengine_unix.o] 错误 1
make[1]:正在离开目录 `/home/qt-everywhere-opensource-src-4.8.5/src/network'
make: *** [sub-network-make_default-ordered] 错误 2
解决2 这些宏定义都在myipv6level.h 文件中,将此文件拷贝到qnativesocketengine_unix.cpp 所在的目录中
cp /mnt/hgfs/CCU/QT移植相

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。