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)编译运行项目,即可实现调用动态库。至此所有步骤已完成。
更多推荐
所有评论(0)