第一次写总结,有错误希望各位大神指正!
先引用一位大神的文章
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就可以使用了!