前言:

如果希望自己的Qt/C++程序在目标机上运行,最简单的方法就是在目标机上安装一个Qtcreater【Qtxxx.run】,然后编译release的可执行文件,直接拉起即可。

但是有些环境情况比较极端,比如去现场部署,发现客户端的目标机没有显示器,只能通过ssh访问;或者目标机不能联网等等..为了更正确的移植我们的程序,需要掌握静态编译Qt,如果我们的程序需要访问数据库,那么还需要编译对应的驱动,以为编译Qt后只有sqlite的驱动,其他则没有,这里用mysql举例子。

一、编译Qt

1、下载Qt源码包,http://download.qt.io/archive/qt/5.7/5.7.0/single/

by the way:Qt程序带有everywhere的为源码包,.run结尾的是用户界面即QtCreator,.zip对应windows,.gz对应linux

2、在linux里解压Qt包

# tar -zvxf qt-everywhere-opensource-src-5.7.1.tar.gz

3、进入Qt文件夹

# cd qt-everywhere-opensource-src-5.7.1

4、生成makefile

# ./configure -confirm-license -opensource -prefix $PWD/Qt -release -nomake tests -nomake examples -skip qtmacextras  -skip qtandroidextras

configure有很多的参数,

-confirm-license -opensource:使用开源版本

-prefix $PWD/Qt:将Qt安装在当前目录下的Qt文件夹

-release:编译release版本

-nomake tests -nomake examples:不编译tests、examples模块

-skip qtmacextras  -skip qtandroidextras:忽略qtmacextras、qtandroidextras模块

等待几分钟,脚本会检查当前系统环境是否符合要求,如果没有问题就会生成makefile文件,并且提示可以make

5、执行makefile

# make

应该是编译所有模块,这一步会比较耗时,大概2,3个小时

6、安装Qt

# make install

将Qt安装到指定的路径,完成之后就在qt-everywhere-opensource-src-5.7.1/qtbase/下有Qt文件夹了,里面就是我们需要的Qt环境

ps:应该可以将某个已经编译了的Qt整个文件夹拷贝出来,放在目标机上,直接使用。我们一般也就用到里面的qmake。

二、编译mysql驱动

1、安装mysql

见以前的文章:https://www.cnblogs.com/judes/p/11785657.html

为什么需要安装mysql,因为在我们的Qt驱动会依赖mysql自身的库和头文件

2、安装好了之后检查Qt所依赖的环境:../includs和../lib

如图,因为后面生成Qt的mysql驱动时的makefile,需要依赖这两个

3、进入Qt的源码

# cd  /home/jude/zhuxy/app/qt-everywhere-opensource-src-5.7.1/qtbase/src/plugins/sqldrivers/mysql

4、生成makefile

# /home/jude/zhuxy/app/qt-everywhere-opensource-src-5.7.1/qtbase/Qt/bin/qmake "INCLUDEPATH+=/usr/local/mysql/include" "LIBS+=-L/usr/local/mysql/lib -lmysqlclient" -o Makefile mysql.pro

网上有些教程这里需要的lib是:LIBS+=-L/usr/local/mysql/lib -lmysqlclient_r

带有_r的,因为他们的mysql的lib下是libmysqlclient_r,而我的是如上图所有,没有_r。造成这原因是mysql版本问题。

5、生成makefile之后,执行

# make

6、make之后,就得到了我们所需要的libqsqlmysql.so

# cd /home/jude/zhuxy/app/qt-everywhere-opensource-src-5.7.1/qtbase/plugins/sqldrivers

# ll

注意生成so的路径和上面源代码的路径不一样

三、可执行文件移植

经过上面两步,我们已经有了基本的开发环境、编译环境,在这个环境我们的Qt程序是能够直接运行的。但是如果想要将我们的可执行Qt程序放在其他未配置环境的系统中运行,还需要做很多事情

1、生成可执行Qt程序

随便用QtCreator建立一个demo,将源代码放在linux上,然后

# qmake SmartParse.pro

# make

# make clean(可选,就是删除中间文件)

得到SmartParse可执行文件,SmartParse是我的项目名字,对应修改成自己的就行

2、新建文件夹,将SmartParse可执行文件放进去

3、在文件夹里新建脚本findSo.sh,用于找依赖项

#!/bin/bash

LibDir=$PWD"/lib"
Target=$ lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*")) $(mkdir $LibDir) for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done

原理就是新建lib文件夹,再通过ldd找依赖项并且拷贝到lib文件夹。这个脚本需要输入一个参数,就是目标文件的名字

4、找到SmartParse的依赖项

# ./findSo.sh SmartParse

5、此时会生成lib文件夹,将lib文件夹中的所有文件移动到当前文件夹,和SmartParse放一起

# cd lib

# move * ../

# cd ..

# rm -R lib/

6、此时SmartParse已经有了基本的运行环境,但是还需要mysql的驱动

将 /home/jude/zhuxy/app/qt-everywhere-opensource-src-5.7.1/qtbase/plugins/sqldrivers文件夹复制到当前文件夹,只要这个sqldrivers文件夹里有libqsqlmysql1.so就行,这一步由上面编译Qt的mysql驱动而来

# cp -r /home/jude/zhuxy/app/qt-everywhere-opensource-src-5.7.1/qtbase/plugins/sqldrivers ../

7、新建拉起SmartParse的脚本run.sh,脚本具有守护进程的工程

#!/bin/sh
current_path="/home/jude/zhuxy/out_put_new"
file_name="SmartParse"
cd $current_path
LD_LIBRARY_PATH=$current_path
export LD_LIBRARY_PATH echo "current_path:$current_path"
echo "file_name:$file_name"
echo "import ld path:$LD_LIBRARY_PATH" while true
do
procnum=` ps -ef|grep $file_name |grep -v grep|wc -l`
if [ $procnum -eq ]; then
echo "---===>restart SmartParse:$current_path/$file_name"
$current_path/$file_name "$@"
fi
sleep
done

根据自己项目修改,current_path是可执行文件的目录,file_name是可执行文件名

8、拉起进程

# ./run.sh &

如果有&代表后台运行,那么就是真正的守护进程了,如果不加&,那当前终端关闭程序就跟着关闭了

linux编译Qt+mysql驱动+可执行文件移植目标机的更多相关文章

  1. Qt Mysql驱动编译过程

    1.首先当然是要有VS2008+Qt4.7的开发环境. 2.安装MySQL,最好是4以后的版本,安装MySQL时要勾住“C Include Files 和 Lib Files”选项,这样才能装上MyS ...

  2. qt mysql驱动问题解绝

    传统解决方法:一.解决问题 本文解决在Ubuntu16.04系统下,Qt5无法连接MySQL数据库的问题(Qt5缺少MySQL驱动,Qt5缺少libqsqlmysql.so动态库,如何安装libqsq ...

  3. Linux编译安装Mysql步骤

    一. Centos 用 wget 下载需要的软件,保存到目录/home/zwl/MySql/下 wget http://dev.mysql.com/get/Downloads/MySQL-5.5/my ...

  4. Windows下QT MySQL驱动编译

    在Windows环境中使用Qt进行关于MySQL数据库的操作时,会出现如下问题: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: availa ...

  5. linux编译qt

    1.使用QtCreator新建工程,windows和linux都可以,这样才有.pro文件 2.在linux中进入工程目录,生成makefile: /home/5.9.2/gcc_64/bin/qma ...

  6. linux编译安装MySQL

    最近就想搞搞hadoop,然后装个MySQL,测试一下那个sqoop. MySQL这种东西,既然是开放源码的,那就源码安装吧. 下面是我的测试环境说明: VMware10+Ubuntu14.04 Ky ...

  7. Linux编译阻塞型驱动遇到'TASK_NORMAL' undeclared (first use in this function)问题解决办法

    http://blog.csdn.net/qq_16405157/article/details/49281793

  8. centos 下Qt安装 mysql驱动(亲测可行)

    (前半部分没有试过,因为我的有mysql驱动,实在抱歉) 1.预防万一,先安装一下mysql-devel(一定要装!). 不安装的话后面编译会出现找不到-lmysqlclient的问题. 2. 开始编 ...

  9. Linux编译移植Qt5的环境_Xillinx的ZYNQ平台

    Linux编译Qt环境 2017年的十一假期,足不出户,一个人在教研室里面搞Qt的移植.我手里面有Samsung的CortexA8,Samsung的 CortexA53还有Ti的Sitara系列的AM ...

随机推荐

  1. 不用虚拟机直接在线用的 Linux,统统都在这里!

    玩过 Linux 的同学,几乎都用过虚拟机!然而,你们肯定不晓得?不用装虚拟机,也有体验 Linux 的办法.下面一起来看看吧,到底如何不用虚拟机,照样能玩 Linux. 其实方法很简单,你只需要拥有 ...

  2. Android开发学习了这些,上帝都淘汰不了你

    曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作.这种观点可能是很多Android开发者最开始入行的原因之一. 在工作初期,工作主要是按照业务需求实现Ap ...

  3. 项目Beta冲刺(团队3/7)

    项目Beta冲刺(团队) --3/7 作业要求: 项目Beta冲刺(团队) 1.团队信息 团队名 :男上加男 成员信息 : 队员学号 队员姓名 个人博客地址 备注 221600427 Alicesft ...

  4. JUnit 4.x 知识点

    注解 @Test: 测试方法,在这里还可以测试期望异常和超时时间. @Before: 每个测试方法执行之前执行的方法. @BeforeClass: 一个测试类中所有测试方法执行之前执行的方法,只执行一 ...

  5. 数组的filter方法处理数组内对象元素时,会改变原值

    arr = [{n:11},{n:22},{n:33}] arr.filter(v=>v.n=8) console.log(arr)  //  [{n:8},{n:8},{n:8}]

  6. SpringBoot Ajax跨域问题(session共享问题)

    ajax 发送post请求至springBoot出现跨域问题 需要在springBoot加上注解  @CrossOrigin 就能解决 报错信息 前端js代码 如果用上面的方式,session不能共享 ...

  7. 基于 Keil MDK 移植 RT-Thread Nano

    后文rtt代表RT-Thread 在官网公众号中,看到rtt发布了rtt nano,这个就很轻量级的rtos内核,把多余的驱动都裁剪了,因此移植工作量小,可以哪来学习一番,体验rtt之美 rtt现在也 ...

  8. 手写spark wordCount

    val conf: SparkConf = new SparkConf().setMaster(Local[*]).setAppName("wordCount") val sc=n ...

  9. GuGuFishtion HDU - 6390 (欧拉函数,容斥)

    GuGuFishtion \[ Time Limit: 1500 ms\quad Memory Limit: 65536 kB \] 题意 给出定义\(Gu(a, b) = \frac{\phi(ab ...

  10. yugabyte 安装pg extention

    前段时间在学习yugabyte 发现yugabyte 是直接复用了pg server的源码,所以当时就觉得大部分pg extension 也是可用. 今天看到了官方文档中有关于如何安装的,发现还得多看 ...