动态链接的总结

第一次写总结,有错误希望各位大神指正!

先引用一位大神的文章

http://blog.csdn.net/ape_neu/article/details/6679246

 

在报上自己的动态库代码!

//kewan.h

#ifndef KEWAN_H
#define KEWAN_H

#include "kewan_global.h"

class KEWANSHARED_EXPORT Kewan {
public:
    Kewan();
    ~Kewan() ;

    int ret();    //virtual int ret();
};

#endif // KEWAN_H

 

//kewan_global.h

#ifndef KEWAN_GLOBAL_H
#define KEWAN_GLOBAL_H

#include <QtCore/qglobal.h>


#if defined(KEWAN_LIBRARY)
#  define KEWANSHARED_EXPORT Q_DECL_EXPORT
#else
#  define KEWANSHARED_EXPORT Q_DECL_IMPORT
#endif


#endif // KEWAN_GLOBAL_H

//kewani.h

#ifndef KEWANI_H
#define KEWANI_H
#include "kewan.h"

extern "C"
{
    Q_DECL_EXPORT Kewan* createKewan();
    Q_DECL_EXPORT void deleteKewan(Kewan* k);
}

#endif // KEWANI_H

 

//kewan.cpp

#include "kewan.h"


Kewan::Kewan()
{
}

Kewan::~Kewan()
{

}

int Kewan::ret()
{
    return 123;
}

//kewani.cpp

#include "kewani.h"


Kewan* createKewan()
{
    return new Kewan();
}

void deleteKewan(Kewan* k)
{
    if(k)
    {
        delete k;
    }
}
在新建一个工程使用dll,这边我简化了没有去释放资源,只是用来演示

#include <QtCore/QCoreApplication>
#include "../kewan/kewan.h"
#include <QLibrary>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QLibrary lib("kewan");

    if(lib.load())
    {
        typedef Kewan* (*CREATE)();
        CREATE cre = (CREATE)lib.resolve("createKewan");
        if(cre)
        {
            Kewan *k = cre();
            qDebug()<<k->ret();
        }
    }

    return a.exec();
}

这时候运行出错

这是为什么,我们使用depend查看一下

发现函数名因为编译器变了,这也是为什么,我们在使用extern "C"的原因,因为C里面函数原来是什么名字编译后就是什么名字。但是C里面没有类啊,这时我们怎么来解决呢?在看了文章开头的博客后,我发现他用接口来实现,就没有问题了?为什么一定要是接口呢?原来是因为虚函数的原因,跟其它的没关系。有虚函数的类会有一个成员变量虚表指针,指向一个虚函数表,虚函数表里面存放的是虚函数地址。那么我们再次调用的时候,就会通过虚表指针,找到虚函数表,找到虚函数地址,那么我们用的就是地址,而不是函数名了,就回避了函数名被编译器改变的事情。就能成功调用该函数。

那么上面的代码只要把kewan.h 里面的int ret();   前面加一个virtual就可以使用了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章