我們在做大型項目的時候,經常會遇到好多重複或常用的部分,如果每次都重新編寫固然是可以的,不過那樣會大大降低工作效率,並且影響代碼的可讀性,更不利於後期的代碼維護。我們可以把他們製作成相應的功能函數,比如動態庫,這樣還可以對項目進行分工,加快項目的進度。下面就是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++ 編譯的,具體編譯方法請看下一條