首先感谢我的室友xqb的帮助,确实他平时也给了我很多的帮助。
点击cancel,之后在你的debug目录下就会生成一个my_lib.dll的文件,现在我们的动态链接库就建立完毕。
1.我们首先讲解QT中动态链接库的建立:
由于不是很熟悉QT中动态链接库的建立过程,就参考网上的方法实现了标准C++链接库的建立,并没有采用QT中的方法,但是这个建立的动态链接库其他程序可以调用的。
1.1 首先新建个C++library工程, File->New->Other Project->C++ Library
之后选择shared 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;
}
之后运行,弹出如下界面框:
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目录下,运行结果如下:
。
之后就是在其他开发环境中测试,我用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拷贝到文件所在目录下,编译运行如下:
整个的动态链接库生成及使用过程结束。欢迎