首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt 實戰教程:創建與使用共享庫

     編輯:關於C語言

為什麼需要共享庫?

觀察 Windows 程序目錄會發現:主程式 .exe 往往只有幾百 KB,伴隨大量 .dll 文件。這些動態鏈接庫 (共享庫) 的優勢在於:

  • 模塊化復用:通用算法、業務邏輯封裝為庫,多專案共享。
  • 熱更新能力:升級功能只需替換 .dll,無需重新安裝整個應用。
  • 內存效率:多進程加載同一 DLL 時,代碼段在物理內存中僅駐留一份。

雖然動態鏈接比靜態鏈接有微小性能損耗,但現代硬件下完全可忽略。

步驟 1:用 Qt Creator 創建共享庫專案

  1. 選擇 C++ Library → Shared Library。
  2. 按需勾選 Qt 模塊 (如需 GUI 則勾選 QtGui / QtWidgets)。

Qt Creator 自動生成關鍵文件:{ProjectName}_global.h —— 導出/導入宏定義。

步驟 2:理解導出宏機制

// lib_global.h
#ifndef LIB_GLOBAL_H
#define LIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(LIB_LIBRARY)
#  define LIBSHARED_EXPORT Q_DECL_EXPORT  // 構建庫時:導出符號
#else
#  define LIBSHARED_EXPORT Q_DECL_IMPORT  // 使用庫時:導入符號
#endif

#endif // LIB_GLOBAL_H

Q_DECL_EXPORT/Q_DECL_IMPORT 映射到平台特定關鍵字 (Windows: __declspec(dllexport/dllimport),Linux/GCC: __attribute__((visibility("default"))))。

步驟 3:編寫導出類

// lib.h
#ifndef LIB_H
#define LIB_H

#include <QMainWindow>
#include "lib_global.h"

class LIBSHARED_EXPORT MainWindow : public QMainWindow {
public:
    explicit MainWindow(QWidget *parent = nullptr);
};

#endif // LIB_H
// lib.cpp
#include "lib.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    // 初始化 UI 等
}

關鍵點:類聲明前加 LIBSHARED_EXPORT,構建時定義 LIB_LIBRARY 宏 (`.pro` 自動處理)。

步驟 4:構建生成產物

編譯後在 debug/ (或 release/) 目錄獲得:

  • lib.dll —— Windows 動態庫
  • liblib.a —— 導入庫 (MinGW) / lib.lib (MSVC),鏈接時需要

步驟 5:在應用專案中使用共享庫

修改 .pro 文件

TARGET = test
TEMPLATE = app

SOURCES += main.cpp

INCLUDEPATH += ../lib          # 頭文件搜索路徑
LIBS += -L../lib/debug -llib   # 庫文件搜索路徑 + 庫名 (去掉前綴 lib 及後綴 .dll/.a)

或直接指定完整路徑:LIBS += ../lib/debug/lib.dll (qmake 自動處理)。

編寫 main.cpp

#include <QtWidgets/QApplication>
#include "lib.h"  // 來自共享庫的頭文件

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    MainWindow w;  // 類定義在 lib.dll 中
    w.show();
    return a.exec();
}

步驟 6:解決運行時「找不到 DLL」問題

編譯鏈接成功 ≠ 運行成功。 Windows DLL 搜索順序:

  1. 應用程序加載目錄 (含 .exe 同級目錄)
  2. 系統目錄 (System32, SysWOW64)
  3. 環境變量 PATH 指定的目錄

解決方案:將構建生成的 lib.dll 複製到應用程序 .exe 同級目錄,或配置 PATH,或使用 windeployqt 自動部署。

驗證與熱更新演示

  1. 運行 test.exe,彈出來自 lib.dll 的 MainWindow 窗口。
  2. 修改庫代碼 (如給窗口添加按鈕),重新構建 lib.dll。
  3. 用新 lib.dll 覆蓋舊文件,重新運行 test.exe —— 無需重新編譯主程式,新功能即時生效。

這正是 Qt 自身採用的插件/模塊化架構原理 (如 QtGui.dll, QtCore.dll)。

總結

階段關鍵動作
創建庫Qt Creator → Shared Library → 加 LIBSHARED_EXPORT 宏
構建庫生成 .dll + 導入庫 .a/.lib
使用庫.pro 添加 INCLUDEPATH + LIBS → #include "lib.h" → 實例化類
部署.dll 放至 .exe 同目錄 (或配置 PATH)

掌握共享庫開發,是構建模塊化、可維護、支援熱更新的 Qt 應用的基礎技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved