目錄
1、建立并生成動态連結庫
2、測試生成的DLL
驗證環境:ubuntu18.04+Qt5.14
驗證内容:導出類,導出函數帶參數/不帶參數的函數。
1、建立并生成動态連結庫
1、打開QtCreator,建立工程,我們選擇Library,C++庫,然後就是choose。

2、然後在彈出的C++庫對話框我們預設類型共享庫,名稱為MyDll。然後,一直下一步,直到點選完成。
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();
}
代碼編寫完畢後,我們直接建構就行了。然後就可以看到我們生成的動态庫了。
2、測試生成的DLL
1、建立一個基于Qt的控制台應用程式,名稱為DllTest,與MyDll放在同一級目錄下。
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動态庫封裝工程最佳實踐