【Qt QML】QLibrary加载共享库中的类

QLibrary是一个用于加载动态链接库(或称为共享库)的类。它提供了一种独立于平台的方式来访问库中的功能。

在QLibrary中,可以通过构造函数或setFileName()方法设置要加载的库文件名。当加载库文件时,QLibrary会搜索所有平台特定的库位置,除非传入的文件名具有绝对路径。如果传入的文件名具有绝对路径,那么会首先尝试加载该目录。如果该文件找不到,QLibrary会使用不同的平台特定的文件前缀或后缀再次尝试。例如,在Unix和Mac平台上使用"lib"前缀,在Unix平台上使用".so"后缀,在Mac平台上使用".dylib",在Windows平台上使用".dll"。

使用QLibrary可以在程序运行时加载动态链接库,一个QLibrary的实例作用于一个单一的共享库上。QLibrary提供了一种平台无关的方式访问库中的函数。此外,通过调用load()函数加载链接库,使用isLoad()函数判断加载是否成功,使用resolve()与load()差不多,但是当如果load失败,将会尝试再次加载。当经过一次加载后,链接库将会存储到内存中直到应用程序退出。使用unload()函数解除,如果有多个QLibrary使用了同一个动态链接库unload()将返回false。

下面的例子用来演示如何运行时加载共享库中的类

一、创建一个共享库

1、打开Qt Creator,创建共享库,新建类TestPlugin

TestPlugin.h

cpp 复制代码
#ifndef TESTPLUGIN_H
#define TESTPLUGIN_H

#include "testPlugin_global.h"

class TESTPLUGIN_EXPORT TestPlugin
{
public:
    virtual ~TestPlugin();
    virtual int TestAddFunc(int a, int b) = 0;
};

class TESTPLUGIN_EXPORT TestPluginLib : public TestPlugin
{
public:
    virtual ~TestPluginLib();
    int TestAddFunc(int a, int b) override;
};

extern "C"{
TESTPLUGIN_EXPORT void* createTestPlugin();
}

#endif // TESTPLUGIN_H

TestPlugin.cpp

cpp 复制代码
#include "testplugin.h"

TestPlugin::~TestPlugin()
{

}

void *createTestPlugin()
{
    return new TestPluginLib();
}

TestPluginLib::~TestPluginLib()
{

}

int TestPluginLib::TestAddFunc(int a, int b)
{
    return a+b;
}

2、导出宏定义

cpp 复制代码
#ifndef TESTPLUGIN_GLOBAL_H
#define TESTPLUGIN_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(TESTPLUGIN_LIBRARY)
#define TESTPLUGIN_EXPORT Q_DECL_EXPORT
#else
#define TESTPLUGIN_EXPORT Q_DECL_IMPORT
#endif

#endif // TESTPLUGIN_GLOBAL_H
二、新建动态库加载demo,加载方式如下:
cpp 复制代码
	using pluginFunc = void*(*)();

    QLibrary lib("testPlugin");
    if(!lib.load()){
        qCritical() <<__FUNCTION__<<" load error!";
        return -1;
    }

    auto func = (pluginFunc)lib.resolve("createTestPlugin");

    TestPlugin* cppLibObj = static_cast<TestPlugin*>(func());
    if(!cppLibObj)
    {
        qCritical() <<__FUNCTION__<<" cppLibObj is nullptr!";
        return -1;
    }

    qInfo() <<__FUNCTION__<< "cppLibObj->TestAddFunc(1, 2)="<< cppLibObj->TestAddFunc(1, 2);

注意这里需要包含纯虚类TestPlugin定义所在的头文件。

三、运行结果如下:

相关推荐
优雅的潮叭3 小时前
c++ 学习笔记之 shared_ptr
c++·笔记·学习
SunkingYang3 小时前
QT中使用Lambda表达式作为槽函数用法,以及捕获列表和参数列表用法与区别
c++·qt·用法·lambda表达式·捕获列表·槽函数·参数列表
微露清风3 小时前
系统性学习C++-第二十二讲-C++11
java·c++·学习
代码村新手4 小时前
C++-类和对象(中)
java·开发语言·c++
Ccjf酷儿5 小时前
C++语言程序设计 (郑莉)第十章 泛型程序设计与C++标准模板库
开发语言·c++
千疑千寻~7 小时前
【Qt图形】详细介绍Qt中的图形场景、图元、视图
qt
千疑千寻~8 小时前
【Qt图形】Qt中的图形场景、图元、视图 的坐标的转换
qt
明洞日记8 小时前
【CUDA手册002】CUDA 基础执行模型:写出第一个正确的 Kernel
c++·图像处理·算法·ai·图形渲染·gpu·cuda
oioihoii9 小时前
程序员如何系统入门Vibe Coding?
c++
C+++Python9 小时前
C++类型判断
开发语言·c++