当前位置: 首页 > article >正文

C++ Dll 库 的创建与使用方法记录

一、生成Dll,使用qt creator 工程,而且DLL 使用了QtCore 模块(具体看应用需要增加使用那些模块)

        默认生成三个文件

//libTest_global.h
#ifndef LIBTEST_GLOBAL_H
#define LIBTEST_GLOBAL_H

#include <QtCore/qglobal.h>

//qt 使用的 导入导出关键属性 
// LIBTEST_LIBRARY 是在pro 中定义

#if defined(LIBTEST_LIBRARY)
#  define LIBTEST_EXPORT Q_DECL_EXPORT 
#else
#  define LIBTEST_EXPORT Q_DECL_IMPORT
#endif

#endif // LIBTEST_GLOBAL_H
// 导出函数、类 的 头文件 libtest.h

#ifndef LIBTEST_H
#define LIBTEST_H

#include "LibTest_global.h"

/***************************************************************
*  @Copyright:  Copyright (c) 2024 LK. All rights reserved.
*  @FileName:   libtest.h
*  @Brief:      关于c++ 如何创建 dll 的例子
*  @Author:     HXJ
*  @Date:       2024-09-06
****************************************************************/

#ifdef __cplusplus
//第一种,直接导出类
//为了避免暴露实现细节,使用类似于D 指针的实现方式进行封装
class LibDirectImp;
class LIBTEST_EXPORT LibDirect
{
public:
    LibDirect();
    ~LibDirect();

    //外部可用的函数
    void PrintName();
private:
    LibDirectImp* m_imp;
};


//第二种, 导出虚基类,
//内部实现 一个子类
//提供一个创建函数,创建子类对象返回基类指针
class LIBTEST_EXPORT LibVirtualBase{

public:
    virtual void PrintName() = 0;
};

//导出创建函数 更好的是返回智能指针
//这个函数甚至可用使用 c风格导出
LIBTEST_EXPORT LibVirtualBase *CreatLib();

#endif

//c 风格函数导出

extern "C"
{
    LIBTEST_EXPORT void TestFun();
}


#endif // LIBTEST_H
// 具体实现

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

#ifdef __cplusplus
class LibDirectImp{
public:
    LibDirectImp()
    {

    }

    //外部可用的函数
    void PrintName()
    {
        qDebug() << "LibDirect";
    }
};


LibDirect::LibDirect()
    :m_imp(new LibDirectImp())
{
}

LibDirect::~LibDirect()
{
    delete m_imp;
}

void LibDirect::PrintName()
{
    m_imp->PrintName();
}


//子类化,偷懒写法,
class LibVirtualSub : public LibVirtualBase{

public:
    virtual void PrintName() override final
    {
        qDebug() << "LibVirtualSub";
    }
};


LibVirtualBase *CreatLib()
{
    return new LibVirtualSub();
}

#endif
extern "C"
{
    void TestFun()
    {
        qDebug() << "TestFun";
    }
}

二、VS2022 工程应用

        1、创建工程

        2、将上述工程的 DLL 的头文件,Lib、Dll 文件拷入工程

        3、如果本地没有QT 的环境,可用直接从上述工程环境中将 qt/include / QtCore 目录  和 对应的 QtCore.lib、QtCored.lib 拷入当前工程

        4、配置属性--> c/c++ ---> 常规--> 包含目录中 -->添加 qtcore 的目录、添加libtest.h 的目录

        5、配置属性--> 链接器 ---> 常规--> 附加库目录 -->添加 对应的lib 所在目录

        6、配置属性--> 链接器 ---> 输入--> 附加依赖项--> 添加 libtest.lib。

        7、程序中调用需要的 类 或者 函数


http://www.kler.cn/a/293500.html

相关文章:

  • 1.两数之和-力扣(LeetCode)
  • Leecode热题100-35.搜索插入位置
  • Android音频架构
  • 结构体(c语言)
  • 虚拟机安装Ubuntu 24.04服务器版(命令行版)
  • 物理设备命名规则(Linux网络服务器 15)
  • 打造安心宠物乐园:EasyCVR平台赋能猫咖/宠物店的智能视频监控解决方案
  • Linux——进程概念
  • 数据结构(邓俊辉)学习笔记】排序 2——快速排序:性能分析
  • springboot项目引入Sentinel熔断
  • SpringBoot和Mybatis框架怎么防止SQL注入
  • 轴承知识大全,详细介绍(附3D图纸免费下载)
  • Codeforces Round 970 (Div. 3)(ABCDEF)
  • LLVM IR指令VM混淆分析
  • 【LeetCode面试150】——205同构字符串
  • 解决解压缩时的错误提示 “无法成功完成操作, 因为文件包含病毒或者潜在垃圾文件“
  • 论文解读 | KDD2024 演化图上的森林矩阵快速计算
  • 【OpenCV1】虚拟环境的使用、opencv的使用、图像和视频的创建和显示
  • 政府招商引资管理数字化平台:渠道、意向客户、项目管理、招商载体、绩效一体化管理平台
  • Spring MVC思想 实践开发 核心组件 流程分析
  • 【go-zero】win启动rpc服务报错 panic: context deadline exceeded
  • 设计模式学习-命令模式
  • HTTP 方法
  • Redis 的内存淘汰策略详解
  • 电机驱动及编码器测速(基于STM32F103C8T6HAL库)
  • ARM32开发——GD32F4 DMA功能查询