日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt之创建并使用共享库

發(fā)布時間:2025/1/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt之创建并使用共享库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡述

在 Windows 中,有動態(tài)鏈接庫(DLL - Dynamic Link Library);在 Linux 中,有共享庫(Shared Library),它們是相同的!

由于平臺和編譯器的差異,輸出的庫文件也不同:

  • 在 Windows 中,MinGW 將輸出 .a 和 .dll;MSVC 將輸出 .lib 和 .dll。
  • 在 Linux 中,MinGW 將輸出 .so、.so.1、.so.1.0 和 .so.1.0.0 - .lib
    .a 和 .so 是導入庫,它們有助于將我們的代碼鏈接到庫中,并且在構建文件時需要。

創(chuàng)建共享庫

要創(chuàng)建一個共享庫,需要執(zhí)行以下幾個步驟:
文件 -> 新建文件或項目,選擇:Library -> C++ 庫:

- 選擇“共享庫”,然后輸入“名稱”(這里以 SharedLib 為例),并選擇“創(chuàng)建路徑”:

注意: “類型”下拉列表中有三個選項,分別是:共享庫、靜態(tài)鏈接庫、Qt Plugin(Qt 插件)。

  • 選擇一個適當?shù)摹皹嫿ㄌ准?/li>
  • 選擇需要的模塊(默認勾選“QtCore”,如果需要其他模塊,請自行勾選。例- 如:界面需要依賴 QtWidgets)。
  • 執(zhí)行要創(chuàng)建的源碼文件的基本信息(默認即可)
  • 完成向導

項目文件

在項目創(chuàng)建完成之后,Qt Creator 會幫我們生成一系列相關文件,目錄結構如下:

查看 .pro,并對其稍作修改:

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:指定庫的名稱
  • TEMPLATE:模板的意思,將其指定為 lib,是要告訴 qmake 我們需要生成的是一個庫文件(app 為可執(zhí)行程序)。
  • DEFINES:用于定義編譯選項
  • CONFIG(新增部分):用于編譯控制,區(qū)分 Debug 和 Release 版本的庫名稱(Debug 帶 d,Release 不帶)。

這里,同時出現(xiàn)了一個非常重要的文件 - {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

符號 - 函數(shù)、變量或類 - 包含在供客戶端(例如:應用程序或其他庫)使用的共享庫中,必須以一種特殊的方式標記。這些符號被稱為公共符號,它們被導出或公開可見。

在編譯共享庫時,必須將其標記為導出。為了在客戶端使用共享庫,一些平臺可能需要一個特殊的導入聲明。

為此,Qt 提供了兩個特殊的宏:

  • Q_DECL_EXPORT:當編譯共享庫時,必須將其添加到使用的符號聲明。
  • Q_DECL_IMPORT:當編譯一個(使用了該共享庫)客戶端時,必須將其添加到使用的符號聲明。

所以,要確保正確的宏能夠被調用(無論是編譯共享庫本身,還是在客戶端使用共享庫),通常通過添加一個特殊的頭文件({projectName}_global.h)來解決,這就是 sharedlib_global.h 存在的原因。

生成共享庫

可以看到,生成的庫中只有一個簡單的類定義。為了便于使用,為其添加一些簡單的函數(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_H

sharedlib.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; }

構建(不運行)項目,會生成相應的 .lib 和 .dll 文件。

  • 注意: Debug 版本(帶 d)為 SharedLibd.lib 和 SharedLibd.dll,Release 版本(不帶 d)為 SharedLib.lib 和 SharedLib.dll。

將應用程序與共享庫鏈接

為了使用共享庫,創(chuàng)建一個簡單的客戶端 - Qt Console Application,然后調用庫中導出的符號,效果如下:

項目創(chuàng)建成功后,將剛才生成的共享庫組織成以下結構:

一切準備就緒,到了最關鍵的時刻 - 添加和使用庫:

  • 右鍵項目 -> 添加庫:

  • 選擇鏈接到的庫類型,這里選“外部庫”:

  • 指定鏈接庫和包含目錄、平臺等選項:

這時,.pro 中會自動添加以下代碼:

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 - 指定編譯項目時應該被搜索的 #include 目錄
  • LIBS - 指定鏈接到項目中的庫列表

開始測試,main.cpp 內(nèi)容如下:

#include <QCoreApplication> #include <qDebug> #include "sharedlib.h"int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 測試庫SharedLib lib;qDebug() << lib.add(2, 3);qDebug() << subtract(5, 2);return a.exec(); }

OK,運行程序,效果如上所示。

注意: 在運行程序時,需要將對應的 dll(Debug 為 SharedLibd.dll,Release 為 SharedLib.dll) 拷貝到和可執(zhí)行程序同一級目錄下,否則會出錯。

更多參考

Qt使用第三方庫


版權所有:一去丶二三里
原文出處:http://blog.csdn.net/liang19890820

總結

以上是生活随笔為你收集整理的Qt之创建并使用共享库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。