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

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

2011-05-10 21:27:25|  分类: 大学 |  标签:qt  c++  动态链接库  |举报|字号 订阅

      首先感谢我的室友xqb的帮助,确实他平时也给了我很多的帮助。
       1.我们首先讲解QT中动态链接库的建立:
      由于不是很熟悉QT中动态链接库的建立过程,就参考网上的方法实现了标准C++链接库的建立,并没有采用QT中的方法,但是这个建立的动态链接库其他程序可以调用的。
     1.1 首先新建个C++library工程, File->New->Other Project->C++ Library
 
之后选择shared library
之后就新建了三个文件,如果我的文件名为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;
}
 
   
之后运行,弹出如下界面框:
 点击cancel,之后在你的debug目录下就会生成一个my_lib.dll的文件,现在我们的动态链接库就建立完毕。
2.链接库的使用
首先使用QT自己的链接库打开方式,即使用QLibrary类,我是新建一个工程Lib_test,这个工程就是个简单的界面,主要是两个按钮,用来一些简单的显示,代码如下:
Widget.h
#ifndef  WIDGET_H
#define WIDGET_H
 
    
#include 
#include 
#include 
#include 
 
    
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  
#include "widget.h"
 
    
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
 
    
    return a.exec();
}

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

   
     
     
     
     
 。


之后就是在其他开发环境中测试,我用DEVC++新建一个程序test.cpp
代码如下:
#include 
 #include  
#include   
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++程序中的引用)