QT Windows和Linux下,Qt Creator创建动态库和调用动态库(.dll 和 .so)

简述

Windows下动态链接库是.dll文件,静态链接库文件是.lib文件。Linux下动态库是.so文件。

Qt嵌套在visual studio时,编译器是MSVC,而Qt Creator的编译器是MinGW,针对MSVC和MinGW这两种编译器,作个简单的介绍:

  • MSVC是指微软的VC编译器。
  • MinGW是指是Minimalist GNU on Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时库。

他们都是很好用的编译工具,但是他们兼容的并不好。当你的项目使用MinGW编译的使用,想要用一个MSVC编译生成的库时就会有问题。使用MinGW编译项目的时候,所使用的Lib也要是MinGW编译的。如果你只是开发Window平台的软件时,最好用Qt MSVC组合,这样可以使用大量的第三方lib,还有很多的构建指令,毕竟window上MSVC才是王道。 编码的问题,QT5的Qstring默认是UTF8格式,QT5极力推介把源码用UTF8格式存储。 但是MSVC只支持带BOM的UTF8格式,qmake不支持带BOM的UTF8格式,逼我只能用GBK么。这样的话,用qt5,每次都要Qstring::fromLocal8bit(“我是中国人”);况且就算BOM问题解决了,源代码是UTF8了。MSVC的执行编码也是GBK。【此段参考链接如下:https://yq.aliyun.com/wenji/242316

正文

我使用的环境是:ubuntu 16.04(64位) + qt5.7.1 。在安装环境时碰到了一点小问题,这里说一下。目前高版本QT的Linux安装包都是64位,所以需要在64位Linux系统下才可以安装,否者是不可以运行的。我找了一些低版本的QT安装包,例如“qt-creator-opensource-linux-x86_64-4.0.1.run”,带有“x86_64”字母,将此安装包在32位Linux下运行,也是失败的,随后我查看了此安装包信息,发现也是只支持64位系统的,苦逼的我只能装个64位Linux系统了。【好像以前QT版本都是有32位的安装包的,例如“qt-creator-opensource-linux-x86-4.0.1.run”,但是我确实没找到,如有大神知道在哪能下载,麻烦给我留言,感激不尽!】

创建动态库步骤

(1)创建共享库项目

  • 创建项目,选择Library -> C++库,下一步

  • 选择“共享库”,输入项目名,下一步

  • 在选择模块是,选择“QtCore”和“QtGui”模块,下一步

  • 一直下一步,直至完成项目的创建
  • 项目创建完成后,会看到三个文件:rsadecode.h、rsadecode.cpp、rsadecode_global.h。其中“rsadecode”是项目名称。其中rsadecode_global.h头文件中包含的是动态库对外接口宏定义【注意,与visual studio中动态库对外接口宏定义“_declspec(dllexport)”不一样哦】

  • rsadecode.h头文件是对外接口文件,动态库中需要被调用的接口,都是从这里出去的。

(2)修改代码

在rsadecode.h的类中添加需要对外的接口,然后在rsadecode.cpp中实现,就可以了。

rsadecode.h 

#ifndef RSADECODE_H
#define RSADECODE_H

#include "rsadecode_global.h"
#include "RSADecode_Sub.h"  //这是我添加的其他类,不用考虑它

class RSADECODESHARED_EXPORT RSADecode
{

public:
    RSADecode();
    bool CheckKey(char *name, char* dstKey);
};

#endif // RSADECODE_H

rsadecode.cpp

#include "rsadecode.h"
#include <QDebug>

using namespace std;

static RSADecode_Sub rsa;

RSADecode::RSADecode()
{
//    qDebug()<< "Hello";
}

bool RSADecode::CheckKey(char *name, char* dstKey)
{

//    qDebug() << "CheckKey";
//    char *fileName = name;
//    char* macStr;
    rsa.DecodeRSA(name, dstKey);
//    dstKey = (char*)macStr;
//    qDebug() << "解密后的字符:\n";
//    qDebug() << dstKey;
    return true;
}

(3)编译项目,生成动态库

  • 完成接口编码,开始“重新构建”项目。
  • 如果是 Linux 系统,在项目的运行文件目录debug(或release)下可以看到编译的.so文件。

  • 其中我们只需要和项目名相关的四个.so文件就可以了,即前4个文件。
  • 如果是 Windows 系统,在项目的运行文件目录debug(或release)下可以看到编译的.dll文件。

  • 至此,完成了动态库的生成操作。

调用动态库步骤

(1)创建一个项目(控制台项目或者界面项目都可以)

(2)Linux系统,在项目的根目录下创建文件夹include和so,分别存放动态库的所有头文件和so文件。

(3)Linux系统,修改项目的pro文件,添加include和so文件目录,如下:

INCLUDEPATH += /home/server/TestDLL/include/

LIBS += -L/home/server/TestDLL/so -lRSADecode

其中,INCLUDEPATH包含动态库头文件,LIBS包含动态库文件,-L后加上需要添加的目录(中间无空格),-l指定共享库名称(注意:共享库项目名而非共享库文件名

(4)Windows系统,在项目的根目录下创建文件夹include和DLL,分别存放动态库的所有头文件和dll文件。

(5)Windows系统,修改项目的pro文件,添加include和DLL文件目录,如下:

INCLUDEPATH += E:\QTProject\ColorSelector\include\

LIBS += -LE:\QTProject\ColorSelector\DLL -lRSADecode

其中,INCLUDEPATH包含动态库头文件,LIBS包含动态库文件,-L后加上需要添加的目录(中间无空格),-l指定共享库名称(注意:共享库项目名而非共享库文件名

(4)在需要调用动态库里方法的文件中,包含“rsadecode.h”,实例化RSADecode类,调用接口。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "rsadecode.h"  //包含动态库对外的头文件

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    //实例化RSADecode类
    RSADecode m_rsa;

    char macStr[50];
    memset(macStr, 0, sizeof(macStr));
    //调用动态库里的接口
    m_rsa.CheckKey(fileName, macStr);
}

(5)编译运行项目,即可实现调用动态库。至此所有步骤已完成。

参考链接:https://www.cnblogs.com/techiel/p/8035014.html

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页