在移植Qt5.6.2这个版本的时候处处碰壁,希望写的这篇文章能对后者有一定的帮助
移植Qt就是移植Qt的库,这是移植之前我们得知道的
废话不多说,首先说一下我的开发环境
板子:s5pv210(九鼎公司)
ubuntu版本:16.04
交叉编译工具链:arm-2009q3(九鼎公司配套提供)
已经做好的工作:
1、uboot编译OK
2、内核编译OK
3、rootfs搭建OK(没有报错)
4、开发板的触摸屏驱动没有问题
一、编译tslib
我这里用的是tslib-1.4
解压后执行下面的命令,最终我们的Qt
# cd tslib
# ./autogen.sh
# echo "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache
# mkdir /opt/tslib
# ./configure --prefix=/opt/tslib --host=arm-linux --cache-file=arm-linux.cache
# make
# make install
注意一下我这里的profix,这是我们make install的安装路径
将安装目录下的所有文件都拷贝到我们的rootfs下的tslib去
导出环境变量到/etc/profile文件里面去
export TSLIB_ROOT=/tslib
export TSLIB_TSDEVICE=/dev/input/event2
export QWS_MOUSE_PROTO=tslib:/dev/input/event2
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
注意:TSLIB_ROOT是我们实际存放的路径
还有/dev/input/event?我们可以测试
方法一:
cat /dev/input/event0一直试到最后,看看哪个是适合我们的
方法二:
cat /proc/bus/input/devices看我们触摸屏型号对应的是event几
然后进入tslib的bin目录
执行./ts_calibrate
如果出现tslib的触摸屏五点校准画面,至此,tslib的安装移植成功完成。
会出现的错误:
错误1:
-/bin/sh: ./ts_calibrate: not found
这是因为ts_calibrate并不是静态编译的,所以它没有对应的库
我们只需要把交叉编译工具链下的库都cp进/lib目录下就OK了
我这里的库是:
cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* . -r
错误2:
No raw modules loaded.
ts_config: No such file or directory
解决:在etc/ts.config打开 module_raw input
错误3:selected device is not a touchscreen I understand
是由于内核和编译器的一个宏定义不一致导致的,vi include/Linux/input.h EV_VERSION 为 0x0100000 ,从新编译内核特别是触摸驱动。
参考文献1:http://blog.163.com/zhuandi_h/blog/static/180270288201222310291262/
参考文献2:http://blog.youkuaiyun.com/lizuobin2/article/details/52673494
二、Qt5.6.2的源码编译
配置
1、配置相应的make
vi qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
//文件末尾加入下面三行
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a
//并修改以下
//arm-linux-xxx是我们交叉编译工具链的东西
//-lts添加tslib的依赖
# modifications to g++.conf
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts -ldl
QMAKE_LINK = arm-linux-g++ -lts -ldl
QMAKE_LINK_SHLIB = arm-linux-g++ -lts -ldl
# modifications to linux.conf
QMAKE_AR = arm-linux-ar cqs
QMAKE_OBJCOPY = arm-linux-objcopy
QMAKE_NM = arm-linux-nm -P
QMAKE_STRIP = arm-linuxi-strip
编译前配置(可以参考./configure --help的提示来配置)
./configure -prefix /opt/QT5.6.2 \
-opensource \
-confirm-license \
-release \
-shared \
-accessibility \
-c++std c++98 \
-xplatform linux-arm-gnueabi-g++ \
-qpa linuxfb \
-linuxfb \
-qreal float \
-pch \
-qt-zlib \
-qt-libjpeg \
-qt-libpng \
-no-sse2 \
-no-largefile \
-no-qml-debug \
-no-glib \
-no-gtkstyle \
-no-opengl \
-nomake tools \
-nomake examples \
-tslib \
-skip qt3d -skip qtcanvas3d -skip qtdoc -skip qtwayland \
-I /opt/tslib/include \
-L /opt/tslib/lib
注意:
我们的交叉编译工具链只支持c++98并不支持c++11
而我们在我们Qt源码目录下./configure --help
我们发现5.6支持c++98而5.9不支持
编译中的错误解决
(1)找不到dlopen或者dlsym
在编译器后面加ldl arm-linux-g++ -ldl
(2)undefined reference to `__sync_add_and_fetch_4'
参考http://www.mamicode.com/info-detail-1699895.html
apt-get install libtool
libtool --tag=CC --mode=compile arm-linux-gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c
libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo
利用libtool生成liblinux-atomic.a,注意生成的目录名叫.libs所以是隐藏的
cp .libs/liblinux-atomic.a /opt/linux-automic // 注意/opt/linux-automic是自己事先创建的
在QT源码下修改:./qtscript/src/script/Makefile
在LIBS = 的结尾添加 -L/opt/linux-atomic -llinux-atomic
/opt/linux-atomic
编译好之后我们去/opt下的QT5.6.2下去把lib和plugins都拷到我们根文件系统里面去
cp lib /root/x210_port/qt_rootfs/rootfs/Qt5.6.2/ -r
cp plugins/ /root/x210_port/qt_rootfs/rootfs/Qt5.6.2/ -r
在根文件系统下导出环境变量
export QT_ROOT=/Qt5.6.2
export LD_LIBRARY_PATH=$QT_ROOT/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
export QT_QPA_FB_TSLIB=1
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event2
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1024x600:mmSize=1024x600:offset=0x0:tty=/dev/tty1
错误1:
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
大概是缺少 libiconv
下载 链接:http://pan.baidu.com/s/1c22xb4O 密码:pbld
mkdir -p /usr/local/libiconv
./configure --host=arm-none-linux-gnueabi --prefix=/usr/local/libiconv CC=arm-none-linux-gnueabi-gcc LDFLAGS="-L/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/lib" --enable-static
make
sudo make install
把安装目录/lib 下的 preloadable_libiconv.so 文件系统的 /lib 下, 在 /etc/profile 中添加
export LD_PRELOAD=/lib/preloadable_libiconv.so
参考:http://blog.youkuaiyun.com/lizuobin2/article/details/52673494
最后移植基本上就OK了
移植Qt就是移植Qt的库,这是移植之前我们得知道的
废话不多说,首先说一下我的开发环境
板子:s5pv210(九鼎公司)
ubuntu版本:16.04
交叉编译工具链:arm-2009q3(九鼎公司配套提供)
已经做好的工作:
1、uboot编译OK
2、内核编译OK
3、rootfs搭建OK(没有报错)
4、开发板的触摸屏驱动没有问题
一、编译tslib
我这里用的是tslib-1.4
解压后执行下面的命令,最终我们的Qt
# cd tslib
# ./autogen.sh
# echo "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache
# mkdir /opt/tslib
# ./configure --prefix=/opt/tslib --host=arm-linux --cache-file=arm-linux.cache
# make
# make install
注意一下我这里的profix,这是我们make install的安装路径
将安装目录下的所有文件都拷贝到我们的rootfs下的tslib去
导出环境变量到/etc/profile文件里面去
export TSLIB_ROOT=/tslib
export TSLIB_TSDEVICE=/dev/input/event2
export QWS_MOUSE_PROTO=tslib:/dev/input/event2
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
注意:TSLIB_ROOT是我们实际存放的路径
还有/dev/input/event?我们可以测试
方法一:
cat /dev/input/event0一直试到最后,看看哪个是适合我们的
方法二:
cat /proc/bus/input/devices看我们触摸屏型号对应的是event几
然后进入tslib的bin目录
执行./ts_calibrate
如果出现tslib的触摸屏五点校准画面,至此,tslib的安装移植成功完成。
会出现的错误:
错误1:
-/bin/sh: ./ts_calibrate: not found
这是因为ts_calibrate并不是静态编译的,所以它没有对应的库
我们只需要把交叉编译工具链下的库都cp进/lib目录下就OK了
我这里的库是:
cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* . -r
错误2:
No raw modules loaded.
ts_config: No such file or directory
解决:在etc/ts.config打开 module_raw input
错误3:selected device is not a touchscreen I understand
是由于内核和编译器的一个宏定义不一致导致的,vi include/Linux/input.h EV_VERSION 为 0x0100000 ,从新编译内核特别是触摸驱动。
参考文献1:http://blog.163.com/zhuandi_h/blog/static/180270288201222310291262/
参考文献2:http://blog.youkuaiyun.com/lizuobin2/article/details/52673494
二、Qt5.6.2的源码编译
配置
1、配置相应的make
vi qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
//文件末尾加入下面三行
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a
//并修改以下
//arm-linux-xxx是我们交叉编译工具链的东西
//-lts添加tslib的依赖
# modifications to g++.conf
QMAKE_CC = arm-linux-gcc -lts
QMAKE_CXX = arm-linux-g++ -lts -ldl
QMAKE_LINK = arm-linux-g++ -lts -ldl
QMAKE_LINK_SHLIB = arm-linux-g++ -lts -ldl
# modifications to linux.conf
QMAKE_AR = arm-linux-ar cqs
QMAKE_OBJCOPY = arm-linux-objcopy
QMAKE_NM = arm-linux-nm -P
QMAKE_STRIP = arm-linuxi-strip
编译前配置(可以参考./configure --help的提示来配置)
./configure -prefix /opt/QT5.6.2 \
-opensource \
-confirm-license \
-release \
-shared \
-accessibility \
-c++std c++98 \
-xplatform linux-arm-gnueabi-g++ \
-qpa linuxfb \
-linuxfb \
-qreal float \
-pch \
-qt-zlib \
-qt-libjpeg \
-qt-libpng \
-no-sse2 \
-no-largefile \
-no-qml-debug \
-no-glib \
-no-gtkstyle \
-no-opengl \
-nomake tools \
-nomake examples \
-tslib \
-skip qt3d -skip qtcanvas3d -skip qtdoc -skip qtwayland \
-I /opt/tslib/include \
-L /opt/tslib/lib
注意:
我们的交叉编译工具链只支持c++98并不支持c++11
而我们在我们Qt源码目录下./configure --help
我们发现5.6支持c++98而5.9不支持
编译中的错误解决
(1)找不到dlopen或者dlsym
在编译器后面加ldl arm-linux-g++ -ldl
(2)undefined reference to `__sync_add_and_fetch_4'
参考http://www.mamicode.com/info-detail-1699895.html
apt-get install libtool
libtool --tag=CC --mode=compile arm-linux-gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c
libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo
利用libtool生成liblinux-atomic.a,注意生成的目录名叫.libs所以是隐藏的
cp .libs/liblinux-atomic.a /opt/linux-automic // 注意/opt/linux-automic是自己事先创建的
在QT源码下修改:./qtscript/src/script/Makefile
在LIBS = 的结尾添加 -L/opt/linux-atomic -llinux-atomic
/opt/linux-atomic
编译好之后我们去/opt下的QT5.6.2下去把lib和plugins都拷到我们根文件系统里面去
cp lib /root/x210_port/qt_rootfs/rootfs/Qt5.6.2/ -r
cp plugins/ /root/x210_port/qt_rootfs/rootfs/Qt5.6.2/ -r
在根文件系统下导出环境变量
export QT_ROOT=/Qt5.6.2
export LD_LIBRARY_PATH=$QT_ROOT/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
export QT_QPA_FB_TSLIB=1
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event2
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1024x600:mmSize=1024x600:offset=0x0:tty=/dev/tty1
错误1:
QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed
QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed
大概是缺少 libiconv
下载 链接:http://pan.baidu.com/s/1c22xb4O 密码:pbld
mkdir -p /usr/local/libiconv
./configure --host=arm-none-linux-gnueabi --prefix=/usr/local/libiconv CC=arm-none-linux-gnueabi-gcc LDFLAGS="-L/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/sys-root/lib" --enable-static
make
sudo make install
把安装目录/lib 下的 preloadable_libiconv.so 文件系统的 /lib 下, 在 /etc/profile 中添加
export LD_PRELOAD=/lib/preloadable_libiconv.so
参考:http://blog.youkuaiyun.com/lizuobin2/article/details/52673494
最后移植基本上就OK了