重学Qt——自定义库

自定义库

静态库

静态库的使用

当第三方代码以源程序文件的形式提供时,可以直接将文件加入项目进行编译。静态库则是将编译好的目标文件进行归档处理得到的库文件,其特点是编译时会嵌入到可执行文件中,无需在运行时额外加载。

使用静态库时,需要确保静态库的头文件和库文件都已正确添加到项目中,并在编译链接时指定静态库的路径。

大型软件项目中的使用

对于大型软件项目,使用动态库更为合适,因为可以独立更新和维护库文件,而不需要重新编译整个应用程序。例如,VTK和OpenCV等大型软件库通常会被编译为动态库供其他项目使用。

Qt Creator中的操作

Qt Creator支持创建和管理静态库和动态库项目。无论是MSVC还是MinGW等编译器,都可以在Qt Creator中创建相应的库文件。

创建静态库

在Qt中创建静态库的过程与创建共享库类似,但有一些不同之处。下面是创建静态库的步骤:

步骤1:创建一个新项目

  1. 打开 Qt Creator。
  2. 选择"新建项目"。
  3. 选择"库"下的"C++静态库"。
  4. 点击"继续",根据提示设置项目名称和路径。

步骤2:设置项目文件(.pro

在项目的 .pro 文件中,添加以下配置以指定创建静态库:

plain 复制代码
QT += core
QT -= gui  # 如果不需要GUI支持

CONFIG += c++11  # 选择C++11标准
CONFIG += staticlib  # 指定为静态库

TARGET = mystaticlibrary  # 静态库名称

步骤3:编写代码

创建一个头文件和实现文件。例如,创建 mymath.hmymath.cpp

mymath.h

cpp 复制代码
#ifndef MYMATH_H
#define MYMATH_H

class MyMath {
public:
    static double add(double a, double b);
};

#endif // MYMATH_H

mymath.cpp

cpp 复制代码
#include "mymath.h"

double MyMath::add(double a, double b) {
    return a + b;
}

步骤4:构建静态库

  1. 在 Qt Creator 中,选择构建(Build)按钮。
  2. 选择"构建项目"以生成静态库。

构建完成后,你会在项目的输出目录(通常是 releasedebug 文件夹)中找到生成的静态库文件(.a.lib)。

步骤5:使用静态库

要在其他 Qt 项目中使用这个静态库,请按照以下步骤:

  1. 将生成的静态库文件复制到新的项目目录的某个位置。
  2. 在新项目的 .pro 文件中添加如下配置:
plain 复制代码
INCLUDEPATH += path/to/mylibrary  # 头文件路径
LIBS += -Lpath/to/mylibrary -lmystaticlibrary  # 库文件路径

在代码中包含头文件并调用库中的函数:

cpp 复制代码
#include "mymath.h"

int main() {
    double result = MyMath::add(1.0, 2.0);
    // ...
}

使用静态库

步骤1:创建一个新项目

  1. 打开Qt Creator。
  2. 选择"新建项目"。
  3. 选择"库"下的"C++静态库"。
  4. 点击"继续",并设置项目名称和路径。

步骤2:设置项目文件(.pro

在项目的 .pro 文件中,添加以下配置以指定创建静态库:

plain 复制代码
QT += core
QT -= gui  # 如果不需要GUI库

CONFIG += c++11  # 选择C++11标准
CONFIG += static  # 指定为静态库

TARGET = mylibrary  # 静态库名称

步骤3:编写代码

创建头文件和实现文件。例如,创建 mymath.hmymath.cpp

mymath.h

cpp 复制代码
#ifndef MYMATH_H
#define MYMATH_H

class MyMath {
public:
    static double add(double a, double b);
};

#endif // MYMATH_H

mymath.cpp

cpp 复制代码
#include "mymath.h"

double MyMath::add(double a, double b) {
    return a + b;
}

步骤4:构建静态库

  1. 在Qt Creator中,选择构建(Build)按钮。
  2. 选择"构建项目"以生成静态库。

构建完成后,你会在项目的输出目录(通常是 releasedebug 文件夹)中找到生成的静态库文件(例如,.a.lib)。

步骤5:使用静态库

要在其他Qt项目中使用这个静态库,请按照以下步骤:

  1. 将生成的静态库文件复制到新的项目目录的某个位置。
  2. 在新项目的 .pro 文件中添加如下配置:
plain 复制代码
INCLUDEPATH += path/to/mylibrary  # 头文件路径
LIBS += -Lpath/to/mylibrary -lmylibrary  # 链接库文件

在代码中包含头文件并调用库中的函数:

cpp 复制代码
#include "mymath.h"

int main(int argc, char *argv[]) {
    // 调用静态库中的函数
    double result = MyMath::add(1.0, 2.0);
    // ...
}

动态库

在Qt中,动态库被称为共享库,在 Windows 平台上就是动态链接库。共享库项目编译后生成后缀为".dll"的动态链接库文件,.dll文件是在应用程序运行时才被加载和调用的,不像静态库那样在编译期间就被嵌入可执行文件。若更新了.dll 文件版本,只要接口未变,应用程序就可以正常调用动态链接库。

动态库的使用

动态库则是在运行时被链接和使用的库文件,不会嵌入到可执行文件中。这种库的优势在于更新时无需重新编译整个项目,灵活性更高。Qt项目在编译和运行时通常会使用到动态库。

动态库的文件名后缀因平台和编译器不同而有所差异,如Windows平台上的".dll"文件。在Qt Creator中,可以创建和管理动态库项目。

创建共享库

在Qt中创建共享库(动态链接库)比较简单。下面是创建共享库的步骤:

步骤1:创建一个新项目

  1. 打开Qt Creator。
  2. 选择"新建项目"。
  3. 选择"库"下的"C++共享库"。
  4. 点击"继续",并根据提示设置项目名称和路径。

步骤2:设置项目文件(.pro

在项目的 .pro 文件中,添加以下配置以指定创建动态库:

plain 复制代码
QT += core
QT -= gui  # 如果不需要GUI库

CONFIG += c++11  # 选择C++11标准
CONFIG += shared  # 指定为共享库

TARGET = mylibrary  # 共享库名称

步骤3:编写代码

创建一个头文件和实现文件。例如,创建 mymath.hmymath.cpp

mymath.h

cpp 复制代码
#ifndef MYMATH_H
#define MYMATH_H

#include <QtCore/qglobal.h>

#if defined(MYMATH_LIBRARY)
#  define MYMATH_EXPORT Q_DECL_EXPORT
#else
#  define MYMATH_EXPORT Q_DECL_IMPORT
#endif

class MYMATH_EXPORT MyMath {
public:
    static double add(double a, double b);
};

#endif // MYMATH_H

mymath.cpp

cpp 复制代码
#include "mymath.h"

double MyMath::add(double a, double b) {
    return a + b;
}

步骤4:构建共享库

  1. 在Qt Creator中,选择构建(Build)按钮。
  2. 选择"构建项目"以生成共享库。

构建完成后,你会在项目的输出目录(通常是 releasedebug 文件夹)中找到生成的共享库文件(.dll.so.dylib)。

步骤5:使用共享库

要在其他Qt项目中使用这个共享库,请按照以下步骤:

  1. 将生成的共享库文件复制到新的项目目录的某个位置,或将其添加到系统路径。
  2. 在新项目的 .pro 文件中添加如下配置:
plain 复制代码
INCLUDEPATH += path/to/mylibrary  # 头文件路径
LIBS += -Lpath/to/mylibrary -lmylibrary  # 库文件路径
  1. 在代码中包含头文件并调用库中的函数:
cpp 复制代码
#include "mymath.h"

int main() {
    double result = MyMath::add(1.0, 2.0);
    // ...
}

使用共享库

调用共享库(也称为动态链接库,DLL或so文件)的方式有两种,分别是显式链接和隐式链接。

1、共享库的调用方式

Qt支持使用共享库来组织和重用代码。共享库可以被多个程序共享,减少内存占用和磁盘空间使用。

显式链接

在显式链接中,程序在运行时加载共享库,并且可以动态地使用库中的函数。你需要使用 dlopendlsym 来加载和调用库。

**示例:**假设有一个共享库 libmymath.so,其包含一个加法函数。

cpp 复制代码
// mymath.h
extern "C" double add(double a, double b);
// mymath.cpp
#include "mymath.h"

extern "C" double add(double a, double b) {
    return a + b;
}

使用显式链接:

cpp 复制代码
#include <QCoreApplication>
#include <QDebug>
#include <dlfcn.h> // 用于Linux共享库

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

    void *handle = dlopen("libmymath.so", RTLD_LAZY);
    if (!handle) {
        qDebug() << "Cannot open library:" << dlerror();
        return 1;
    }

    typedef double (*add_t)(double, double);
    add_t add = (add_t)dlsym(handle, "add");
    if (!add) {
        qDebug() << "Cannot load symbol 'add':" << dlerror();
        dlclose(handle);
        return 1;
    }

    double result = add(1.0, 2.0);
    qDebug() << "Result:" << result;

    dlclose(handle);
    return a.exec();
}

2、隐式链接调用共享库

隐式链接是一种在编译时链接共享库的方法。在编译时,编译器会知道库的存在,并根据选择的编译选项来链接库。

示例:设置项目文件(.pro)来使用共享库。

plain 复制代码
# myproject.pro
TEMPLATE = app
TARGET = MyApp
QT += core
SOURCES += main.cpp
LIBS += -L$$PWD/ -lmymath   # 指定库路径和链接库名

然后在代码中直接调用库中的方法:

cpp 复制代码
#include <QCoreApplication>
#include <QDebug>
#include "mymath.h"  // 包含头文件

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

    double result = add(1.0, 2.0);  // 直接调用
    qDebug() << "Result:" << result;

    return a.exec();
}

总结

  • 显式链接适合于需要在运行时决定是否加载库的场景。使用动态加载提供了更大的灵活性。
  • 隐式链接在编译时进行,与标准的编译和链接过程相似,通常用于更简单的情况。
相关推荐
小燚~15 小时前
MSVCR100.dII报错问题处理
c++·windows·qt
lqj_本人15 小时前
鸿蒙PC:Qt适配OpenHarmony实战【花账】:从一笔支出开始,做一个本地记账小应用
数据库·qt·harmonyos
我在人间贩卖青春15 小时前
重学Qt——文件系统和文件读写
qt
sycmancia16 小时前
Qt——发送自定义事件(下)
开发语言·qt
郝学胜-神的一滴17 小时前
Qt 高级开发 013: 元对象编译器(MOC)
开发语言·c++·qt·程序人生·用户界面
sycmancia1 天前
Qt——文本打印与光标定位
开发语言·qt
qq_401700412 天前
Qt 多线程编程
开发语言·qt
Hua-Jay2 天前
OpenCV联合C++/Qt 学习笔记(二十五)----加载深度神经网络模型及深度神经网络模型的使用
c++·笔记·qt·opencv·学习·计算机视觉·dnn
小牛蛋2 天前
vcpkg 管理 PCL + VTK + Qt 开发三维点云可视化软件
开发语言·qt