QT 创建共享动态库和使用动态库

本文详细介绍了如何使用Qt Creator创建共享动态库,并演示了从新建工程到编译生成动态库的全过程。同时,文章还讲解了如何在可执行程序中使用这些动态库,包括设置头文件和lib库路径,以及动态加载动态库的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值