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“

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值