目录
1.创建共享动态库
1.1 新建工程,选择"Library"->C++库,点击"Choose"
1.2 选择类型"共享库",下拉列表里有“共享库”,“静态链接库”,“Qt plugin”,本文选择“共享库”。然后输入动态库名称,此例我使用“Library”,点击"下一步"
1.3 选择构建套件,本例选择mingw 32bit,点击"下一步"
1.4 选择动态库需要的模块,本例中默认选择,点击"下一步"
1.5 详情提示,这里可以修改类名和头文件源文件名,点击"下一步"
1.6 项目管理界面,保持默认即可,点击"完成"按钮
1.7 上一步点击"完成后",会生成动态库程序
1.8 点击编译按钮
2.使用共享动态库
2.1 创建可执行程序
2.2 设置头文件路径和lib库路径
2.2.1 生成工程后,我们首先把动态库的头文件copy过来。
2.2.2 把lib库和动态库也要copy过来
2.2.3 打开testdll.pro,设置动态库头文件和lib库的路径
2.3 使用函数接口
2.4 将动态库copy到可执行文件路径下
end
1.创建共享动态库
1.1 新建工程,选择"Library"->C++库,点击"Choose"
1.2 选择类型"共享库",下拉列表里有“共享库”,“静态链接库”,“Qt plugin”,本文选择“共享库”。然后输入动态库名称,此例我使用“Library”,点击"下一步"
1.3 选择构建套件,本例选择mingw 32bit,点击"下一步"
1.4 选择动态库需要的模块,本例中默认选择,点击"下一步"
1.5 详情提示,这里可以修改类名和头文件源文件名,点击"下一步"
1.6 项目管理界面,保持默认即可,点击"完成"按钮
1.7 上一步点击"完成后",会生成动态库程序
生成的目录结构如下图:
其中library.h和library_global.h为头文件,我们可以把library_global.h文件的内容copy到library.h中,这样我们在使用动态库时只需要包含library.h即可。
library.pro
#-------------------------------------------------
#
# Project created by QtCreator 2019-08-21T12:56:02
#
#-------------------------------------------------
QT -= gui
TARGET = library
TEMPLATE = lib
DEFINES += LIBRARY_LIBRARY
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += library.cpp
HEADERS += library.h\
library_global.h
unix {
target.path = /usr/lib
INSTALLS += target
}
library_global.h
#ifndef LIBRARY_GLOBAL_H
#define LIBRARY_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(LIBRARY_LIBRARY)
# define LIBRARYSHARED_EXPORT Q_DECL_EXPORT
#else
# define LIBRARYSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // LIBRARY_GLOBAL_H
library.h
原始的library.h中只有一个空的类,我在这个文件中添加了几个方法,有普通函数接口
double LIBRARYSHARED_EXPORT Divide(int a,int b);
有成员函数接口
int Multi(int a ,int b);
静态成员函数接口
static int Add(int a,int b);
static int Del(int a,int b);
#ifndef LIBRARY_H
#define LIBRARY_H
#include "library_global.h"
//函数接口
double LIBRARYSHARED_EXPORT Divide(int a,int b);
//类接口
class LIBRARYSHARED_EXPORT Library
{
public:
Library();
//类静态成员函数接口
static int Add(int a,int b);
static int Del(int a,int b);
//类成员函数接口
int Multi(int a ,int b);
};
#endif // LIBRARY_H
library.cpp
#include "library.h"
Library::Library()
{
}
int Library::Add(int a, int b)
{
return a+b;
}
int Library::Del(int a, int b)
{
return a - b;
}
int Library::Multi(int a, int b)
{
return a*b;
}
double Divide(int a,int b)
{
return (double)a/(double)b;
}
1.8 点击编译按钮
生成了三个文件liblibrary.a,liblibrary.dll,liblibrary.o,其中liblibrary.a,liblibrary.dll是使用动态库需要用到的。到此完成了共享动态库的创建。下面开始介绍共享动态库的使用。
2.使用共享动态库
2.1 创建可执行程序
点击完成,生成工程。
2.2 设置头文件路径和lib库路径
2.2.1 生成工程后,我们首先把动态库的头文件copy过来。
2.2.2 把lib库和动态库也要copy过来
2.2.3 打开testdll.pro,设置动态库头文件和lib库的路径
QT += core
QT -= gui
CONFIG += c++11
TARGET = dlltest
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
HEADERS += $$PWD/library/include/library_global.h \
$$PWD/library/include/library.h
LIBS += $$PWD/library/lib/win32/release/liblibrary.a
2.3 使用函数接口
main.cpp
#include <QCoreApplication>
#include <QDebug>
#include "library/include/library.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int num1 = 10;
int num2 = 3;
qDebug()<<"类静态成员函数接口"<<Library::Add(num1,num2);
qDebug()<<"类静态成员函数接口"<<Library::Del(num1,num2);
Library library;
qDebug()<<"类成员函数接口"<<library.Multi(num1,num2);
qDebug()<<"普通函数接口"<<Divide(num1,num2);
return a.exec();
}
2.4 将动态库copy到可执行文件路径下
2.5 动态加载动态库,需要注意导出的函数名,可使用dumpbin查看
#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QLibrary>
typedef int (*myfun)(int,int);//定义函数形式
typedef double (*myfun2)(int,int);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QLibrary test_dll("library.dll");//加载动态库
if(test_dll.load())
{
myfun2 fun2 = (myfun2)test_dll.resolve("Divide");//获取dll的函数
if(fun2)
{
double result = fun2(10,3);
qDebug()<<result;
}
}
test_dll.unload();
return a.exec();
}