Qt之创建并使用共享库
簡(jiǎn)述
在 Windows 中,有動(dòng)態(tài)鏈接庫(kù)(DLL - Dynamic Link Library);在 Linux 中,有共享庫(kù)(Shared Library),它們是相同的!
由于平臺(tái)和編譯器的差異,輸出的庫(kù)文件也不同:
- 在 Windows 中,MinGW 將輸出 .a 和 .dll;MSVC 將輸出 .lib 和 .dll。
- 在 Linux 中,MinGW 將輸出 .so、.so.1、.so.1.0 和 .so.1.0.0 - .lib
.a 和 .so 是導(dǎo)入庫(kù),它們有助于將我們的代碼鏈接到庫(kù)中,并且在構(gòu)建文件時(shí)需要。
創(chuàng)建共享庫(kù)
要?jiǎng)?chuàng)建一個(gè)共享庫(kù),需要執(zhí)行以下幾個(gè)步驟:
文件 -> 新建文件或項(xiàng)目,選擇:Library -> C++ 庫(kù):
- 選擇“共享庫(kù)”,然后輸入“名稱(chēng)”(這里以 SharedLib 為例),并選擇“創(chuàng)建路徑”:
注意: “類(lèi)型”下拉列表中有三個(gè)選項(xiàng),分別是:共享庫(kù)、靜態(tài)鏈接庫(kù)、Qt Plugin(Qt 插件)。
- 選擇一個(gè)適當(dāng)?shù)摹皹?gòu)建套件”
- 選擇需要的模塊(默認(rèn)勾選“QtCore”,如果需要其他模塊,請(qǐng)自行勾選。例- 如:界面需要依賴(lài) QtWidgets)。
- 執(zhí)行要?jiǎng)?chuàng)建的源碼文件的基本信息(默認(rèn)即可)
- 完成向?qū)?/li>
項(xiàng)目文件
在項(xiàng)目創(chuàng)建完成之后,Qt Creator 會(huì)幫我們生成一系列相關(guān)文件,目錄結(jié)構(gòu)如下:
查看 .pro,并對(duì)其稍作修改:
TARGET = SharedLib# 新增部分 CONFIG += debug_and_release CONFIG(debug, debug|release) { unix: TARGET = $$join(TARGET,,,_debug) else: TARGET = $$join(TARGET,,,d) }TEMPLATE = lib DEFINES += SHAREDLIB_LIBRARY- TARGET:指定庫(kù)的名稱(chēng)
- TEMPLATE:模板的意思,將其指定為 lib,是要告訴 qmake 我們需要生成的是一個(gè)庫(kù)文件(app 為可執(zhí)行程序)。
- DEFINES:用于定義編譯選項(xiàng)
- CONFIG(新增部分):用于編譯控制,區(qū)分 Debug 和 Release 版本的庫(kù)名稱(chēng)(Debug 帶 d,Release 不帶)。
這里,同時(shí)出現(xiàn)了一個(gè)非常重要的文件 - {projectName}_global.h,這是 Qt Creator 幫我們創(chuàng)建的,內(nèi)容如下:
#ifndef SHAREDLIB_GLOBAL_H #define SHAREDLIB_GLOBAL_H#include <QtCore/qglobal.h>#if defined(SHAREDLIB_LIBRARY) # define SHAREDLIBSHARED_EXPORT Q_DECL_EXPORT #else # define SHAREDLIBSHARED_EXPORT Q_DECL_IMPORT #endif#endif // SHAREDLIB_GLOBAL_H符號(hào) - 函數(shù)、變量或類(lèi) - 包含在供客戶(hù)端(例如:應(yīng)用程序或其他庫(kù))使用的共享庫(kù)中,必須以一種特殊的方式標(biāo)記。這些符號(hào)被稱(chēng)為公共符號(hào),它們被導(dǎo)出或公開(kāi)可見(jiàn)。
在編譯共享庫(kù)時(shí),必須將其標(biāo)記為導(dǎo)出。為了在客戶(hù)端使用共享庫(kù),一些平臺(tái)可能需要一個(gè)特殊的導(dǎo)入聲明。
為此,Qt 提供了兩個(gè)特殊的宏:
- Q_DECL_EXPORT:當(dāng)編譯共享庫(kù)時(shí),必須將其添加到使用的符號(hào)聲明。
- Q_DECL_IMPORT:當(dāng)編譯一個(gè)(使用了該共享庫(kù))客戶(hù)端時(shí),必須將其添加到使用的符號(hào)聲明。
所以,要確保正確的宏能夠被調(diào)用(無(wú)論是編譯共享庫(kù)本身,還是在客戶(hù)端使用共享庫(kù)),通常通過(guò)添加一個(gè)特殊的頭文件({projectName}_global.h)來(lái)解決,這就是 sharedlib_global.h 存在的原因。
生成共享庫(kù)
可以看到,生成的庫(kù)中只有一個(gè)簡(jiǎn)單的類(lèi)定義。為了便于使用,為其添加一些簡(jiǎn)單的函數(shù):
sharedlib.h 內(nèi)容如下:
#ifndef SHAREDLIB_H #define SHAREDLIB_H#include "sharedlib_global.h"SHAREDLIBSHARED_EXPORT int subtract(int x, int y);class SHAREDLIBSHARED_EXPORT SharedLib { public:SharedLib();int add(int x, int y); };#endif // SHAREDLIB_Hsharedlib.cpp 內(nèi)容如下:
#include "sharedlib.h"int subtract(int x, int y) {return x - y; }SharedLib::SharedLib() { }int SharedLib::add(int x, int y) {return x + y; }構(gòu)建(不運(yùn)行)項(xiàng)目,會(huì)生成相應(yīng)的 .lib 和 .dll 文件。
- 注意: Debug 版本(帶 d)為 SharedLibd.lib 和 SharedLibd.dll,Release 版本(不帶 d)為 SharedLib.lib 和 SharedLib.dll。
將應(yīng)用程序與共享庫(kù)鏈接
為了使用共享庫(kù),創(chuàng)建一個(gè)簡(jiǎn)單的客戶(hù)端 - Qt Console Application,然后調(diào)用庫(kù)中導(dǎo)出的符號(hào),效果如下:
項(xiàng)目創(chuàng)建成功后,將剛才生成的共享庫(kù)組織成以下結(jié)構(gòu):
一切準(zhǔn)備就緒,到了最關(guān)鍵的時(shí)刻 - 添加和使用庫(kù):
右鍵項(xiàng)目 -> 添加庫(kù):
選擇鏈接到的庫(kù)類(lèi)型,這里選“外部庫(kù)”:
- 指定鏈接庫(kù)和包含目錄、平臺(tái)等選項(xiàng):
這時(shí),.pro 中會(huì)自動(dòng)添加以下代碼:
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/3rdparty/SharedLib/lib/ -lSharedLib else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/3rdparty/SharedLib/lib/ -lSharedLibdINCLUDEPATH += $$PWD/3rdparty/SharedLib/include DEPENDPATH += $$PWD/3rdparty/SharedLib/include- $$PWD 用于指定包含 .pro 文件的目錄的完整路徑
- INCLUDEPATH - 指定編譯項(xiàng)目時(shí)應(yīng)該被搜索的 #include 目錄
- LIBS - 指定鏈接到項(xiàng)目中的庫(kù)列表
開(kāi)始測(cè)試,main.cpp 內(nèi)容如下:
#include <QCoreApplication> #include <qDebug> #include "sharedlib.h"int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 測(cè)試庫(kù)SharedLib lib;qDebug() << lib.add(2, 3);qDebug() << subtract(5, 2);return a.exec(); }OK,運(yùn)行程序,效果如上所示。
注意: 在運(yùn)行程序時(shí),需要將對(duì)應(yīng)的 dll(Debug 為 SharedLibd.dll,Release 為 SharedLib.dll) 拷貝到和可執(zhí)行程序同一級(jí)目錄下,否則會(huì)出錯(cuò)。
更多參考
Qt使用第三方庫(kù)
版權(quán)所有:一去丶二三里
原文出處:http://blog.csdn.net/liang19890820
總結(jié)
以上是生活随笔為你收集整理的Qt之创建并使用共享库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++的拷贝构造函数、operator=
- 下一篇: Qt QtConcurrent之 Run