如何搭建Qt跨平台环境和部署工作

本文介绍如何从源码编译QT5.6.2,并将其移植到开发板的过程。主要内容包括配置qmake工具、解决编译过程中出现的错误、搭建Qt交叉编译环境以及开发板Qt环境部署等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、编译QT5.6.2源码

目的:(1):获取lib和plugins的库文件,用于移植到开发板上,搭建qt程序的运行环境

           (2):获取qmake工具,用于搭建qt开发环境

 【1】源码下载目录:

QT5.6.2:  链接:https://pan.baidu.com/s/16H4qTwAUBFqBhFzKjttkMw 
                提取码:bqj5 

 或者到官网去下载自己需要的版本:  Index of /archive/qt


【2】创建工作目录,并解压

将下载下来的源码拷贝到自己创建的工作目录下,并解压


 

 【3】创建安装目录        /opt/QT5.6.2  (用于编译成功后,生成文件的存放位置)

 
【4】配置(主要需要配置下面两个)

 
(1)配置相应的qmake
 

vim qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

在文件中加入下面的配置信息
#aston added
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE   += -O2  -march=armv7-a   
QMAKE_CXXFLAGS_RELEASE += -O2  -march=armv7-a

# 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 

(2)编译前配置(可以参考./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 \  #指定tslib库的路径,所以必须先编译tslib源码 【编译时删除注释】
  -L /opt/tslib/lib

亲测过的两个脚本:

#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

#aston added
QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS_RELEASE   += -O2  -march=armv7-a
QMAKE_CXXFLAGS_RELEASE += -O2  -march=armv7-a
# 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
load(qt_config)
~               

./configure  -prefix  /home/aston/1_work/dll_bag/qt5.6.2_SDK \
-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 /home/aston/1_work/dll_bag/tslib1.4_SDK/include \
-L /home/aston/1_work/dll_bag/tslib1.4_SDK/lib

【5】在源码目录执行make  (Makefile,一开时是没有的,是通过configuare工具生成的)

注意:编译中的错误解决

(1)、出现:g++: Command not found错误

原因:未安装g++编译器,所以需要安装:sudo apt-get install g++


(2)、undefined reference to `__sync_add_and_fetch_4'
  参考http://www.mamicode.com/info-detail-1699895.html

原因:编译时没有链接liblinux-atomic.a 库文件

解决方法:make时链接liblinux-atomic.a库文件 

首先生成liblinux-atomic.a 库文件
  利用libtool生成liblinux-atomic.a,注意生成的目录名叫.libs所以是隐藏的 

linux-atomic.c 文件下载:链接:https://pan.baidu.com/s/1r3b6-JFw5TN2mdbvCusL2A 
                                       提取码:2jzo 
apt-get install libtool
 (1)、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 
  (2)、libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo

  cp .libs/liblinux-atomic.a /opt/linux-automic    // 注意/opt/linux-automic是自己事先创建的
  在QT源码目录下修改:vim   qtscript/src/script/Makefile
  在LIBS  = 的结尾添加 -L/opt/linux-atomic -llinux-atomic

【6】再次执行make,编译通过后,执行 make install 会在安装目录下显示如下几个文件即表示QT源码编译成功

2、搭建Qt交叉编译环境

【1】安装linux下的Qt程序:qt-opensource-linux-x86-5.3.2.run (链接:https://pan.baidu.com/s/1RFmlQrKWJybBLtTjYkUCkg 
提取码:6ll4 )

 ./qt-opensource-linux-x86-5.3.2.run 运行安装软件,根据提示自定义安装

 【2】给qtCreate配置交叉编译工具

(1)、加入交叉编译工具 

 (2)、在Qt Versions 中新增编译qt源码生成的qmake工具

(3)、 最后配置一下Kit就大功告成了 

3、开发板Qt环境部署

【1】、首先移植编译Qt源码生成了lib库和plugins库到开发板上

【2】、同时在开发板上的环境变量上配置qt参数【tslib环境变量+qt库环境变量+preloadable_libiconv.so库环境变量】

【tslib环境变量】

##tslib库环境变量配置#############################################################################
export TSLIB_ROOT=/usr/local/tslib1.4                    /*  指定 tslib 目录路径  */
export TSLIB_TSDEVICE=/dev/input/event2               /*  指定触摸屏设备  */
export TSLIB_CALIBFILE=/etc/pointercal                /*  指定校准文件的存放位置*/
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf         /*  指定 tslib 配置文件的路径*/
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts             /*  指定 tslib 插件文件的路径*/
export TSLIB_FBDEVICE=/dev/fb0                        /*  指定帧缓冲设备  */

【qt库环境变量 】

export QTDIR=/root/QT5.6.2   
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins   
export QT_QPA_FONTDIR=$QTDIR/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

【preloadable_libiconv.so 】

export LD_PRELOAD=/lib/preloadable_libiconv.so

异常 情况:qt程序能执行,并且能在界面上显示出来,但仍报如下错误

 解决方案:

缺少一个运行时库preloadable_libiconv.so,交叉编译得到这个后放进去/lib目录下即可。
参考:http://blog.youkuaiyun.com/wangyuanfei555/article/details/47399771

提示以上信息一般是preloadable_libiconv.so 安装异常,需要重新编译libiconv1.5库,生成preloadable_libiconv.so动态库,放到开发板/lib目录下,并将库的目录添加到环境变量中:libiconv1.5库安装路径    Index of /gnu/libiconv

export LD_PRELOAD=/lib/preloadable_libiconv.so

移植libiconv中遇到的问题及解决 【编译好的动态库,可以通过 file + 动态库名查看文件运行环境】

1、编译好的库是intel80386架构的,不是ARM的,不能用,要交叉编译才行。
解决:先看配置好的Makefile,找交叉编译工具链的全局变量。但是本项目的Makefile中没有CC等这些定义,像这种一般就是通过环境变量来设置的。

交叉编译libiconv,参考:http://blog.youkuaiyun.com/wuyu92877/article/details/52472810
编译libiconv错误提示gets相i关的,参考:http://blog.youkuaiyun.com/ownfire/article/details/47276219

 问题 3:​./system/rootlib/helloworld -qws ,程序运行起来,仍报错
           QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed
                   QIconvCodec::convertToUnicode: using Latin-1 for conversion, iconv_open failed​
       解决 :下载 http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz   
                ./configure -prefix=$PWD/_install -host=arm-linux-gnueabihf   
                make   
                make install 
                把_install/lib 下的preloadable_libiconv.so 拷到系统的/system/lib 下,  
                export LD_PRELOAD=/system/lib/preloadable_libiconv.so

编译时输入以下命令就不会出现上面的问题了:【如果编译的库依然不是ARM的,可能是你的编译链,作用域太小,或者只能在普通用户下才能用交叉编译链,这和你把交叉编译链环境变量放置的位置有关

./configure -prefix=$PWD/_install --host=arm-none-linux-gnueabi 
 
make  CROSS_COMPILE=arm-linux-none-gnueabi- ARCH=arm

 最后make install ,至此我们需要的preloadable_libiconv.so文件就在当前文件夹下的_install目录下了

这里我们就成功移植qt到开发板上了

注意:当在ARM板上运行运行时出现问题时,可以 在arm下位机配置文件/etc/profile后面添加如下调试环境变量:

export QT_DEBUG_PLUGINS=1

运行时 可以打印出具体的报错信息,方便定位具体怎么调试可以参考链接:Ubuntu18.04下,QT5移植到ARM板上运行程序发生异常:could not find or load the Qt platform plugin "linuxfb"原因_chaoshuaihaohao的博客-优快云博客

经验:自己调试遇到的问题: 

could not find or load the Qt platform plugin "linuxfb"

后通过上述定位发现:

解决方法:最后在QT5.6.2/plugins/lib下找到libQt5Dbus.so.5 发现大小太小,于是将libQt5Dbus.so.5.6.2复制一份并命名为libQt5Dbus.so.5 即可

百度云盘:链接:https://pan.baidu.com/s/11b634VvKMIsGdahyBLpZ3Q   提取码:6666 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值