本人在编译QT库时遇到了很多问题,偶然发现遇到的问题在此博客中都有提及。
参考博客:https://blog.youkuaiyun.com/hhhhh89/article/details/53888523
准备:下载qt-everywhere-opensource-src-4.8.6.tar.gz并复制到ubuntu目录中
1、进入存放qt源码的目录解压源码包
tar xzvf qt-everywhere-opensource-src-4.8.6.tar.gz
2、进入解压的源码目录
修改mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf,如下:
#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#
include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC = /opt/toolschain/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-gcc -lts
QMAKE_CXX = /opt/toolschain/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK = /opt/toolschain/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB = /opt/toolschain/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-g++ -lts
# modifications to linux.conf
QMAKE_AR = /opt/toolschain/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /opt/toolschain/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-objcopy
QMAKE_STRIP = /opt/toolschain/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-strip
load(qt_config)
//wlj
./configure -prefix /usr/local/qte-arm/ -force-pkg-config -opensource -confirm-license -release -shared -embedded arm -xplatform /qws/linux-arm-gnueabi-g++ -depths 16,18,24 -fast -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -little-endian -host-little-endian -no-qt3support -no-libtiff -no-libmng -no-opengl -no-mmx -no-sse -no-sse2 -no-3dnow -no-openssl -no-webkit -no-qvfb -I/usr/temp-wlj/tmp/include -L/usr/temp-wlj/tmp/lib
//网上
./configure -v -prefix /usr/local/Trolltech/QtEmbedded-4.8.6-arm -opensource -confirm-license -embedded arm -release -shared -fast -no-largefile -qt-sql-sqlite -qt3support -no-xmlpatterns -no-glib -no-phonon -no-mmx -no-3dnow -no-sse -no-sse2 -no-svg -webkit -qt-zlib -qt-libtiff -qt-libpng -qt-libjpeg -make libs -make tools -make examples -make demos -make translations -no-nis -no-cups -iconv -no-dbus -xplatform qws/linux-arm-g++ -little-endian -qt-freetype -depths 16,24,32 -qt-gfx-linuxfb -qt-gfx-transformed -qt-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-linuxinput -no-kbd-qvfb -armfpa -no-mouse-qvfb -qt-mouse-linuxtp -qt-mouse-tslib -DQT_QLOCALE_USES_FCVT -I/opt/tslib-1.4/include -L/opt/tslib-1.4/lib
运行./configure会出现下列错误(本人也遇到该问题,并用该方法解决)
instruction: `swpb %al,%bpl,[%edi]'
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no such instruction: `swpb %cl,%dl,[%edi]'
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no such instruction: `swpb %cl,%dl,[%edi]'
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no such instruction: `swpb %al,%bpl,[%edi]'
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no such instruction: `swpb %cl,%dl,[%edi]'
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no such instruction: `swpb %cl,%dl,[%edi]'
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no such instruction: `swpb %al,%bpl,[%edi]'
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:131: Error: no such instruction: `swpb %sil,%cl,[%edi]'
make[1]: *** [.obj/release-shared-emb-arm/qabstractanimation.o] Error 1
make[1]: Leaving directory `/home/li/QT-ARM/qt-everywhere-opensource-src-4.8.6/src/corelib'
make: *** [sub-corelib-make_default-ordered] Error 2
li@ubuntu:~/QT-ARM/qt-everywhere-opensource-src-4.8.6$ make
可能是arm 交叉环境有问题,如果配置好了一般reconfigure下就ok.如果总是有问题,可以修改qatomic_armv5.h,将汇编用c code写可以避过这个错误。改inline char q_atomic_swp为以下内容
sudo gedit /home/li/QT-ARM/qt-everywhere-opensource-src-4.8.6/src/corelib/arch/qatomic_armv5.h
inline char q_atomic_swp(volatile char *ptr, char newval)
{
register char ret;
/*asm volatile("swpb %0,%2,[%3]"
: "=&r"(ret), "=m" (*ptr)
: "r"(newval), "r"(ptr)
: "cc", "memory");*/
ret=*ptr;
*ptr=newval;
return ret;
}
3、编译源码
make
出现下列错误
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:145:1: error: stray ‘\200’ in program
../../include/QtCore/../../src/corelib/arch/qatomic_armv5.h:145:1: error: stray ‘\213’ in program
make[1]: *** [.pch/release-shared-emb-arm/QtCore.gch/c++] Error 1
make[1]: Leaving directory `/home/li/QT-ARM/qt-everywhere-opensource-src-4.8.6/src/corelib'
make: *** [sub-corelib-make_default-ordered] Error 2
原因就是在第2步修改qatomic_armv5.h时,是直接从网页上复制的代码,某些英文的符号变成中文的格式而自己却不知道。这里找到定位的代码行把符号删掉重新输入英文的符号在重新make
修改完成重新make又出现下面错误
skipping incompatible /opt/tslib-1.4/lib/libts.so when searching for -lts
/opt/../ld:cannot find -lts出现以上问题的原因很明显,你的libts.so与./configure里指定的平台不兼容。即tslib库文件生成的不对,你的交叉编译环境有问题。参考安装tslib1.4。回到tslib重新安装,使用一下命令配置tslib:
./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ -host=arm-none-linux-gnueabi -prefix=/opt/tslib-1.4 ac_cv_func_malloc_0_nonnull=yes
然后同时指定交叉编译器
打开qt源码解压目录下的mkspecs/qws/linux-arm-g++/qmake.conf:
sudo gedit mkspecs/qws/linux-arm-g++/qmake.conf
用gedit打开qmake.conf 后,加上-lts,然后保存退出,更改后如下:
# modifications to g++.conf
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts
QMAKE_LINK = arm-linux-g++ -lts
QMAKE_LINK_SHLIB = arm-linux-g++ -lts
# modifications to linux.conf
QMAKE_AR = arm-linux-ar cqs
QMAKE_OBJCOPY = arm-linux-objcopy
QMAKE_STRIP = arm-linux-strip
再次重新make出现下面错误
>::deref()]+0x30): undefined reference to `__sync_sub_and_fetch_4'
collect2: ld returned 1 exit status
make[1]: *** [../../lib/libQtScript.so.4.8.6] Error 1
make[1]: Leaving directory `/home/li/qt-everywhere-opensource-src-4.8.6/src/script'
make: *** [sub-script-make_default-ordered] Error 2
下面参考这两篇文章可以解决
移植Qt-4.8.5出现undefined reference to '__sync_sub_and_fetch_4'解决方法
基于嵌入式Linux下GCC编译器__sync_sub_and_fetch_4错误的解决心得
参考第一篇操作,第二篇下载gcc-4.6.0.tar.gz
如果能解决掉undefined reference to `__sync_sub_and_fetch_4'再好不过了,但是我的错误没有解决掉。知道是gcc编译器版本太低的原因,所以只能换高版本的编译器。换成了友善之臂的arm-linux-gcc-4.4.3,安装方法网上有很多。使用4.4.3版本最终解决掉了所以错误,make顺利完成。
最后安装,sudo make install
配置环境变量
export QWS_DISPLAY=Transformed:Rot0:mmWidthxxx:mmHeight120
#export QWS_DISPLAY="linuxfb:mmHeight=140:mmWidth=48"
#export QWS_SIZE="800x480"
#export QWS_DISPLAY=Transformed:Rot180
export TSLIB_ROOT=/usr/sendinfo/tslib
export TSLIB_TSDEVICE=/dev/input/event10
export QWS_MOUSE_PROTO=tslib:/dev/input/event10
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
export QTDIR=/opt/qte-arm
export QPEDIR=/opt/qte-arm
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:$LD_LIBRARY_PATH
#export QT_QPA_GENERIC_PLUGINS=evdevmouse:/dev/event1
另:
在QT4下有以下环境变量配置触摸屏和鼠标事件:QWS_MOUSE_PROTO
当支持触摸屏时需要配置:export QWS_MOUSE_PROTO="tslib:/dev/input/event0"
当需要支持鼠标时需要配置:export QWS_MOUSE_PROTO="MouseMan:/dev/input/mouse0"
当需要同时支持触摸屏和鼠标时则需要配置成:export QWS_MOUSE_PROTO="tslib:/dev/input/event0 MouseMan:/dev/input/mouse0"
但是对于USB鼠标是可以热插拔的,所以,在配置支持USB鼠标时不能使用mouse0,因为在USB拔出后,mouse0设备节点就没有了。
这时需要配置如下:
export QWS_MOUSE_PROTO="tslib:/dev/input/event0 MouseMan:/dev/input/mice"
或者
export QWS_MOUSE_PROTO="tslib:/dev/input/event0 MouseMan:/dev/mice"
这时因为只要配置了鼠标支持就会有/dev/mice和/dev/input/mice节点,不受热插拔事件影响,而每个鼠标事件都会往该节点发送。