VS+QT项目移植到Linux编译打包全流程

概要

    本文主要介绍VS下的QT项目移植到Linux下编译打包发布的流程,使用场景为VS2013 + QT5.7.1移植到Centos7.5(麒麟V10和Ubantu同样可用)。

移植前置条件

  1. 确保你想要编译的文件是完全解密的
  2. Linux中只依赖头文件,因此在VS中生成的资源文件,资源视图文件以及VS生成的Debug和Release文件夹都要删除掉,也就是说想要移植的原始文件夹应该整理成只有.h,.cpp和资源文件的形式
  3. 因为LInux对于编码是敏感的,因此需要在编译前将所有的文件全部转成UTF-8形式,这里推荐使用Nodepad++进行批量转换
  4. 如果你的项目使用了windows下对应的库文件,移植前应该找到适配Linux的版本进行替换
  5. 建议把所有的的.h文件和.cpp文件放到一个文件夹下,如果一定要理出层次,确保你分出的文件夹符合上面的要求

编译流程

编译前置条件

以下操作均要在root权限下执行,切换root的方法:su
之后在光标处输入root的密码(安装Linux时有设置)出现以下即为切换成功
在这里插入图片描述

安装gcc-g++编译器

使用yum install gcc-g++(centos) apt-get install g++(ubantu)
若显示没有可用的安装包,执行yum update&&yum install -y epel-release(centos)或 apt-get install update(ubantu)之后再进行安装
在这里插入图片描述
输入g++ --version显示出版本即为安装成功

安装源码对应的Qt版本

此处以Qt5.7.1为例
wget http://download.qt.io/official_releases/qt/5.7/5.7.1/qt-opensource-linux-x64-5.7.1.run
chmod 777 qt-opensource-linux-x64-5.7.1.run
./qt-opensource-linux-x64-5.7.1.run
安装Qt是选择的安装位置不要太深,否则会出现后面使用Qt头文件时会出现找不到对应头文件,其次安装的路径应该copy一份方便后续修改环境变量时使用
安装Qt后出现Qt Creator即为安装成功(如果你安装centos时选择的是不带界面的最小安装,终端输入qmake弹出版本即为成功)
如果安装Qt成功之后还是不能使用qmake,就需要在Qt对应安装位置/Qt+版本号/版本号/gcc_64/bin下copy一份qmake到usr/bin/下即可使用

编译

推荐使用命令行编译,如果安装的带界面的centos,使用Qt Creator会更方便更改

  1. 按前文要求整理好文件
  2. 在最外层的文件夹出打开终端或者打开终端使用cd + 路径切换
  3. 执行qmake-project 生成.pro文件
  4. 修改.pro文件,红色框修改为和Vs生成的.pro文件一致,蓝色框是文本编码格式
    在这里插入图片描述
    再执行qmake生成makefile文件
    之后make就可以开始编译了
    如果使用Qt Creator则可以直接编译

常见问题及处理

  1. 找不到头文件
    在这里插入图片描述
    遇到这种问题要从以下几个方面考量
    首先判断这个文件是否是自己定义的,如果是首先检查引用的头文件是否存在
    然后检查文件名的大小写(linux对于大小写是敏感的),最后如果存在且大小写正确,使用相对路径基本就可以解决问题
    如果文件不是自己定义的,如果是windows所特有的头文件,就要找到Linux对应的头文件进行替换,如果没有替换就要考虑阉割或删除

  2. throw exception(" ")报错
    在这里插入图片描述
    使用logic_error替换exception,并在文件中引用#include 再加上using namespaece std;即可
    如果是std::exception报错 则要删除std::之后再重复上述步骤

  3. 字符转换
    在这里插入图片描述
    将QStringLiteral更换为QString::fromlocal18Bit即可

  4. QByteArray转换到string出错
    在这里插入图片描述
    后面加上toStdString();

  5. 类型转换出错
    在这里插入图片描述
    在这里插入图片描述
    原始的代码均为箭头指向的样子,但是这样Linux无法通过表达式获取到对应的类型,这个时候隐式转换失效就需要我们用显式转换写出来

  6. size_t不是一个类型
    在这里插入图片描述
    头文件加上#include

  7. 不能对临时变量取地址
    在这里插入图片描述
    红色箭头为原始代码,linux认为对QHostAddress(Server_Ip)取地址是不安全的,因此要单独提出来

  8. 常见的math函数不生效
    此类包括常见的std数学函数显示没包含在类中,将函数前的std::去掉并在头文件加#include<math.h>

  9. abs(double)产生歧义
    在这里插入图片描述
    更换为fabs即可

  10. sprintf_s不在这个类中
    在这里插入图片描述
    换成sprintf即可

  11. Qt内核报错
    在这里插入图片描述
    此类分几种情况看,可以仔细浏览上面本次的编译输出,如果有明显给你说哪一个函数的哪一行error,这个就需要区文件里看看那一行,很大可能是改行使用的函数不与linux兼容;如果没有说是你的文件报错,很大可能是你直接使用了Vs生成的.pro文件来编译,需要删除原来的.pro重复命令行编译流程使用qmake生成.pro再来编译;如果还是有问题,使用make clean清除生成的中间文件再重新make

  12. main函数重定义
    此项一般还带有id的status报错,这个首先检查是否源码中存在main重定义,如果没有很大可能是你的.pro文件的头文件和类资源文件同时包含了你的main.cpp,只需要删去其中之一即可

注意事项

  1. 如果对要编译的文件夹里增加文件,删除文件或者文件重命名都要去.pro文件里进行相应修改或者删除原有.pro文件使用qmake project生成新的.pro文件
  2. 在编译前确保你实际使用的Linux版本和目标版本相同或是比目标版本低,防止最终打包运行出现难以解决的问题!!!

打包

一般有脚本打包和使用linuxdeployqt打包,由于脚本打包比较复杂繁琐,因此这里我们推荐使用linuxdeployqt打包

linuxdeployqt安装

首先下载linuxdeployqt源码:

确保你已经安装了git命令(sudo yum install git)

git clone https://github.com/probonopd/linuxdeployqt-git --depth=1

进入你安装Linuxdeployqt路径下
执行qmke
然后make
会在linuxdeployqt路径下的bin里生成一个名为linuxdeployqt的可执行文件
将可执行文件复制一份到usr/local/bin下方便直接使用
在终端输入linuxdeployqt显示以下界面则表示已经完成了安装,否则就删除linuxdeployqt源码重复以上步骤
在这里插入图片描述

打包流程

  1. 首先在Qt Creator上 在项目栏勾选show bulid然后左下角切换为releas进行编译
  2. 在上一步编译完成的路径下找到release版本的可执行文件,复制到一个文件夹中这个文件夹就是最终要打包完成发布的文件夹
  3. 修改环境变量 使用 ~/.bashrc 在最后一行加上本机Qt路径下bin的完整路径
  4. 执行打包命令
    例如生成的releas版本的可执行文件名字为testApp
    那么执行打包的命令为linuxdeployqt testApp -verbose2
    或者 linuxdeployqt testApp -appimage
    推荐使*linuxdeployqt testApp -appimage这样就很少会出现到目标服务器上无法运行的情况
    但是上述的两个方式均有可能出现缺少Qtlib的情况
    所以在打包完成后的文件夹里 把本机Qt路径下的Qt +版本号/版本号/gcc_64/下的所有文件全部复制一份到本文件夹下,这样就不会出现缺少库文件的情况

常见问题

在打包以及外发测试过程中我遇到了以下问题,有兴趣可移步至我的另外两篇博学习交流
error while loadinshared libraries:libot5Widgets.so.5: cannot open sharedfile: No such file
This application failed to start because it could not find or load the qt platform plugin “xcb“

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值