QT链接库中类的导出,以及使用

主体思路如下:
      我们的动态链接库建立一个基类,里面的函数全部是纯虚函数,之后再建立一个子类继承基类,实现里面的函数,最后导出一个函数,这个函数返回一个子类的对象但是却被强制转换为基类的基类指针。然后在应用程序中也对应建立一个基类,之后调用导出的函数,就可以使用子类实现的哪些功能了。

动态链接库的建立
myclass_lib.h
#ifndef  MYCLASS_LIB_H
#define MYCLASS_LIB_H
#include <windef.h>
 
              
class baseClass                                       //基类,全部是纯虚函数,也即导出的接口
{
public:
    virtual int add(int, int) = 0;
    virtual int sub(int, int) = 0;
 
              
};
 
              
class sonClass : public baseClass                     // 子类,实现虚函数
{
public:
    int add(int, int);
    int sub(int, int);
};
 
              
extern "C" _declspec(dllexport) baseClass* Create();    //这个函数用来返回一个指向子类但返回值为父类的指针
 
              
#endif // MYCLASS_LIB_H
 
             

myclass_lib.cpp
#include   "myclass_lib.h"
 
               
baseClass* Create()
{
    return (baseClass *) new sonClass;          //强制转换为父类
}
 
               
int sonClass::add(int x, int y)                 //函数的实现
{
    return x + y;
}
 
               
int sonClass::sub(int x, int y)
{
    return x - y;
}

之后编译就可以生成我们需要的myclass_lib.dll了,之后就是dll的引用了。

我在DEVCPP环境下新建一个.cpp文件,代码如下:
my_lib_class.cpp
#include <stdio.h>
#include <stdlib.h>
#include <windows.h> 
#include <windef.h>  
class baseClass             //同样的基类  
public:     
    virtual int add(int, int) = 0;     
    virtual int sub(int, int) = 0;       
};  
int main() 
{     
    baseClass *test;            // 新建一个父类指针      
    int flag = 0;     
    typedef baseClass* (*Create)();    //定义一个函数吧,,和dll中的对应          
    HINSTANCE hdll = NULL;             //Windows的句柄什么的吧          
    hdll = LoadLibrary("myclass_lib.dll");  //加载动态链接库      
    if(hdll == NULL)    
    {        
         printf("Load library error!\n");        
         system("pause");        
         return 1;           
    }        
    Create create;    
    create = (Create)GetProcAddress(hdll, "Create"); //取得函数地址     
    if(create == NULL)    
    {         
        printf("GetProcAddress error!\n");        
  system("pause");        
  return 1;         
     }       
     test = create();                                
                
                
 //test为create()返回的一个父类的指针    

                
                
     printf("3 + 2 = %d \n", test->add(3, 2));        //函数调用     

                
                
     printf("3 - 2 = %d \n", test->sub(3, 2));          

                
                
     flag = FreeLibrary(hdll);                //释放链接库    

                
                
     if(flag == 0)    

                
                
   {         

                
                
        printf("Free library error!\n");        

                
                
        system("pause");         

                
                
        return 1;          

                
                
    }       

                
                
    system("pause");   

                
                
    return 0;   

                
                
 } 


把dll复制到该文件目录下,编译运行,结果如下图:
QT链接库中类的导出,以及使用 - vanpire110 - vanpire110的博客
 
调用成功。



附:
不知道认真的阅者有没有发现这个程序的一个问题,就是dll new了一个子类的对象都没有释放,这个问题还没有具体找出想法,还望大家指教。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,动态库是一种非常常见的代码组织方式,可以方便地实现代码的重用和模块化。如果你想在动态库中导出一个,你需要做以下几个步骤: 1. 在的定义中使用Q_DECL_EXPORT宏进行修饰。这个宏是Qt提供的,它会根据不同平台生成不同的修饰符,以保证动态库可以正确导出和链接。 2. 在的定义文件(.cpp)中包含头文件并使用Q_DECLARE_EXPORT宏进行声明。这个宏会生成导出声明,让动态库可以正确导出。 3. 在动态库的.pro文件中添加模块定义文件(.def)。这个文件可以指定动态库中需要导出的函数和符号,包括我们需要导出。 下面是一个示例代码: // MyExportClass.h #include <QObject> #ifdef MYLIBRARY_EXPORT // 定义一个宏来控制导出 #define MYLIBRARY_EXPORT Q_DECL_EXPORT #else #define MYLIBRARY_EXPORT Q_DECL_IMPORT #endif class MYLIBRARY_EXPORT MyExportClass : public QObject { Q_OBJECT public: explicit MyExportClass(QObject *parent = nullptr); void myExportFunction(); }; // MyExportClass.cpp #include "MyExportClass.h" Q_DECLARE_EXPORT(MyExportClass) MyExportClass::MyExportClass(QObject *parent) : QObject(parent) { } void MyExportClass::myExportFunction() { // ... } // MyLibrary.pro TARGET = MyLibrary TEMPLATE = lib DEFINES += MYLIBRARY_EXPORT HEADERS += \ MyExportClass.h SOURCES += \ MyExportClass.cpp win32 { LIBS += -Wl,--out-implib,$$PWD/MyLibrary.lib DEFINES += MYLIBRARY_LIB SOURCES += MyLibrary.def }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值