QT中动态链接库的建立,以及在QT中的引用,C++程序中的引用

首先感谢我的室友xqb的帮助,确实他平时也给了我很多的帮助。
       1.我们首先讲解QT中动态链接库的建立:
      由于不是很熟悉QT中动态链接库的建立过程,就参考网上的方法实现了标准C++链接库的建立,并没有采用QT中的方法,但是这个建立的动态链接库其他程序可以调用的。
     1.1 首先新建个C++library工程, File->New->Other Project->C++ Library
QT中动态链接库的建立,以及在QT中的引用,C++程序中的引用 - vanpire110 - vanpire110的博客

 
之后选择shared library
QT中动态链接库的建立,以及在QT中的引用,C++程序中的引用 - vanpire110 - vanpire110的博客
之后就新建了三个文件,如果我的文件名为my_lib,则三个文件为:my_lib.h, my_lib_global.h, my_lib.cpp, 由于我使用的是标准C++来建立动态链接库,只是让QT环境编译生成,故my_lib_global.h可以删除,把其余的两文件清空,输入以下内容:
my_lib.h
#ifndef  MY_LIB_H
#define MY_LIB_H
 
               
 
               
extern "C" int add(int x, int y);
 
               
#endif // MY_LIB_H
 
              
my_lib.cpp
#include   "my_lib.h"
 
               
 
               
int add(int x, int y)
{
    return x+y;
}
 
              
之后运行,弹出如下界面框:
QT中动态链接库的建立,以及在QT中的引用,C++程序中的引用 - vanpire110 - vanpire110的博客
 点击cancel,之后在你的debug目录下就会生成一个my_lib.dll的文件,现在我们的动态链接库就建立完毕。

2.链接库的使用
首先使用QT自己的链接库打开方式,即使用QLibrary类,我是新建一个工程Lib_test,这个工程就是个简单的界面,主要是两个按钮,用来一些简单的显示,代码如下:
Widget.h
#ifndef  WIDGET_H
#define WIDGET_H
 
              
#include <QtGui/QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLibrary>
 
              
class Widget : public QWidget
{
    Q_OBJECT
 
              
public:
    Widget(QWidget *parent = 0);
    ~Widget();
 
              
    QPushButton *button1;
    QPushButton *button2;
 
              
};
 
              
#endif // WIDGET_H
 
              

Widget.cpp
#include   "widget.h"
 
               
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QVBoxLayout *VBLayout = new QVBoxLayout(this);
    button1 = new QPushButton();
    button2 = new QPushButton();
 
               
    VBLayout->addWidget(button1);
    VBLayout->addWidget(button2);
    QLibrary test("my_lib.dll");
    if(test.load())
    {
        typedef int (*Add)(int x, int y);
        int i;
        Add add;
        add = (Add)test.resolve("add");
        if(add)
        {
            i = add(3, 2);
        }
 
               
        button1->setText(QString::number(i, 10));
 
               
        if(test.unload())
        {
            button2->setText(tr("Free succeed!"));
        }
        else
        {
            button2->setText(tr("Free failed!"));
        }
 
               
    }
    else
    {
        button1->setText(tr("Load failed!"));
    }
 
               
 
               
 
               
}
 
               
Widget::~Widget()
{
 
               
}
 
               
main.cpp
#include   <QtGui/QApplication>
#include "widget.h"
 
              
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
 
              
    return a.exec();
}

之后编译运行(记住把上面生成的my_lib.dll)复制到该工程的目录下,还有debug目录下,运行结果如下:

               
               
QT中动态链接库的建立,以及在QT中的引用,C++程序中的引用 - vanpire110 - vanpire110的博客
 。


之后就是在其他开发环境中测试,我用DEVC++新建一个程序test.cpp
代码如下:
#include <stdio.h>
 #include <windows.h> 
#include <windef.h>  
int main() 
{     
    typedef int (*Add)(int, int);       //定义一个函数指针      
    bool flag = false;          
    HINSTANCE hdll = NULL;            // 定义一个句柄           
    Add add;         
    hdll = LoadLibrary("my_lib.dll");     //打开链接库     
    if(hdll == NULL)    
    {         
        printf("Load library error!\n");         
        system("pause");         
        return 1;           
    }        
    add = (Add)GetProcAddress(hdll, "add");  //获取函数     
    if(add == NULL)    
    {         
        printf("GetProcAddress error!\n");         
        system("pause");         
        return 1;          
    }        
    printf("3 + 2 = %d\n", add(3, 2));        
    flag = FreeLibrary(hdll);                //释放链接库     
    if(flag == 0)    
    {         
        printf("Free library error!\n");         
        system("pause");         
        return 1;          
     }        
    system("pause");    
    return 0;         
 } 

运行时把my_lib.dll拷贝到文件所在目录下,编译运行如下:
               
               
QT中动态链接库的建立,以及在QT中的引用,C++程序中的引用 - vanpire110 - vanpire110的博客

整个的动态链接库生成及使用过程结束。欢迎
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值