天天看點

Qt建立使用動态連結庫工程

目錄

1、建立并生成動态連結庫

2、測試生成的DLL

驗證環境:ubuntu18.04+Qt5.14

驗證内容:導出類,導出函數帶參數/不帶參數的函數。

1、建立并生成動态連結庫

1、打開QtCreator,建立工程,我們選擇Library,C++庫,然後就是choose。

Qt建立使用動态連結庫工程

2、然後在彈出的C++庫對話框我們預設類型共享庫,名稱為MyDll。然後,一直下一步,直到點選完成。

Qt建立使用動态連結庫工程

3、生成的代碼結構

MyDll.pro

QT       -= gui # 不需要界面

TARGET = MyDll #工程名
TEMPLATE = lib # 生成lib

DEFINES += MYDLL_LIBRARY # 預定義宏
DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        mydll.cpp

HEADERS += \
        mydll.h \
        mydll_global.h 

unix {
    target.path = /usr/lib
    INSTALLS += target
}
           

mydll_global.h中,内容如下:

#ifndef MYDLL_GLOBAL_H
#define MYDLL_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYDLL_LIBRARY)
#  define MYDLLSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYDLLSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // MYDLL_GLOBAL_H
           

可以看到系統自動定義了兩個宏。用于聲明哪些函數是需要我們導出的。

4、導出類,導出函數

首先我們在mydll.h中添加幾行代碼,如下圖。注意:extern "C" MYDLLSHARED_EXPORT必須要有。

#ifndef MYDLL_H
#define MYDLL_H
#include mydll_global.h

class MYDLLSHARED_EXPORT MyDll
{
public:
    MyDll();
    virtual int sub(int a, int b);
};

extern C MYDLLSHARED_EXPORT void sayHello(); # 導出無參函數
extern C MYDLLSHARED_EXPORT int add(int a, int b); # 導出帶參函數

extern C MYDLLSHARED_EXPORT MyDll *getMyDll(); # 導出類接口
#endif // MYDLL_H
           

mydll.cpp中的實作代碼如下:

#include mydll.h
#include <iostream>

MyDll::MyDll()
{
}

int MyDll::sub(int a, int b)
{
    return a-b;
}

void sayHello()
{
    std::cout<<hello!<<std::endl;
}

int add(int a, int b)
{
    return a+b;
}

MyDll * getMyDll()
{
    return new MyDll();
}
           

代碼編寫完畢後,我們直接建構就行了。然後就可以看到我們生成的動态庫了。

Qt建立使用動态連結庫工程

2、測試生成的DLL

1、建立一個基于Qt的控制台應用程式,名稱為DllTest,與MyDll放在同一級目錄下。

Qt建立使用動态連結庫工程

2、建好了以後,就可以進行調用驗證了。

調用編譯好的動态庫需要引用兩個東西:動态庫的頭檔案和動态庫檔案。

1)在.pro中添加對Lib的引用

LIBS += ../build-MyDll-unknown-Release/mydll.o
           

2)在引用檔案中,添加頭檔案的引用

#include ../MyDll/mydll.h
           

main.cpp調用完整代碼:

#include <QCoreApplication>
#include <QLibrary>
#include <iostream>
#include ../MyDll/mydll.h

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

    sayHello();
    int c = add(1, 2);
    std::cout<<add(1,2) =  << c << std::endl;
    MyDll *mydll = getMyDll();
    int d = mydll->sub(2,1);
    std::cout<<mydll->sub(2,1) =  << d << std::endl;

    return a.exec();
}
           

輸出結果:

Qt建立使用動态連結庫工程

下一篇:Qt動态庫封裝工程最佳實踐

繼續閱讀