zoukankan      html  css  js  c++  java
  • linux编译Qt+mysql驱动+可执行文件移植目标机

    前言:

    如果希望自己的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=$1
    
    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 0 ];  then
                    echo "---===>restart SmartParse:$current_path/$file_name"
                    $current_path/$file_name "$@"
            fi
            sleep 30
     done

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

    8、拉起进程

    # ./run.sh & 

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

  • 相关阅读:
    python并发编程之gevent协程(四)
    python并发编程之asyncio协程(三)
    python并发编程之multiprocessing进程(二)
    python并发编程之threading线程(一)
    python设计模式之内置装饰器使用(四)
    python设计模式之装饰器详解(三)
    python设计模式之迭代器与生成器详解(五)
    EF code First数据迁移学习笔记
    15.02.13-代码小技巧
    Route学习笔记之Area的Route注册
  • 原文地址:https://www.cnblogs.com/judes/p/12060752.html
Copyright © 2011-2022 走看看