我们在做大型项目的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护。我们可以把他们制作成相应的功能函数,比如动态库,这样还可以对项目进行分工,加快项目的进度。下面就是qt 调用动态库接口的方法。
首先编译一个简单的动态库接口文件Test.dll
新建一个普通的qt项目,代码如下:
#include "testdll.h"
#include <QLibrary>
#include <QDebug>
QString DLL_NAME = "Test.dll"; //库文件名
QString DLL_PATH = "./bin/"; //库文件路径
typedef int (*jk_TEST_A)();//根据动态库接口函数返回值类型定义一个类型
typedef int (*jk_TEST_B)();//该dll接口的返回值全为int
typedef int (*jk_TEST_C)();
typedef int (*jk_TEST_D)();
jk_TEST_A TEST_A; //根据类型定义自己调用的函数名
jk_TEST_B TEST_B;
jk_TEST_C TEST_C;
jk_TEST_D TEST_D;
TestDll::TestDll(QWidget *parent) :
QWidget(parent),
ui(new Ui::TestDll)
{
ui->setupUi(this);
this->loadLibrary();
qDebug() << TEST_A() << endl;
qDebug() << TEST_B() << endl;
qDebug() << TEST_C() << endl;
qDebug() << TEST_D() << endl;
}
TestDll::~TestDll()
{
delete ui;
}
bool TestDll::loadLibrary()
{
//将库接口与自己定义的调用接口名关联起来
//前面的为自己要调用的函数名
//括号里的为动态库的接口名
QLibrary myLib(DLL_PATH + DLL_NAME);
TEST_A = (jk_TEST_A)myLib.resolve("TEST_A");
TEST_B = (jk_TEST_B)myLib.resolve("TEST_B");
TEST_C = (jk_TEST_C)myLib.resolve("TEST_C");
TEST_D = (jk_TEST_D)myLib.resolve("TEST_D");
return myLib.isLoaded();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
接口函数
结果
完美调用
注:Test.dll 放在在exe目录下的 bin目录下
Test.dll 是 vc++ 编译的,具体编译方法请看下一条