如何把自己写的几个类,封装成动态链接库

我写了几个类基于QObject的 用 Qt Creator IDE,想把这几个类封装成动态链接库给其它程序调用。提供header file 和 dll , .a

1
class C01 : public QObject
{
    Q_OBJECT
public:
    explicit C01(QObject *parent = nullptr);
    void API01A();
    void API01B();
...
signals:
     void sig01();
     void sig02();
...

};
#endif
------------------------------------------------------------------------------------------------
类2
class C02 : public QObject
{
    Q_OBJECT
public:
    explicit C02(QObject *parent = nullptr);
    void Api02A();
    void API02B();
...
signals:
     void sig02A();
     void sig02B();
...

};
#endif
----------------------------------------------------------------------------------------------
如何把上面两个类 C01, C02 封装到一个库里面

 QtCreator 生成的下面代码, 其它用户是不是先得new 个 Libdemo 实例,再去调用 C01, C02 里面的APIs

libdemo.h
class LIBDEMO_EXPORT Libdemo
{
public:
    Libdemo();
  
};
--------------------------------------------------------------------------------------------------
libdmo_global.h
#include <QtCore/qglobal.h>

#if defined(LIBDEMO_LIBRARY)
#  define LIBDEMO_EXPORT Q_DECL_EXPORT
#else
#  define LIBDEMO_EXPORT Q_DECL_IMPORT
#endif
-----------------------------------------------------------------------------------------------------------------------------------



引用chatgpt部分指引作答:
首先,将您的类封装为动态链接库需要以下步骤:

在 Qt Creator IDE 中创建新的项目,选择 “Library” 项目类型。
将您的类文件添加到项目中,确保它们都在包含了正确的头文件和库的情况下编译通过。
将项目配置为生成动态链接库。在 Qt Creator 中,可以在项目文件的左侧栏中选择 “Projects” 选项卡,然后选择 “Build” 子选项卡,找到 “Build Settings” 部分,并在 “Build Target” 下拉列表中选择 “Shared Library”。
编译项目并生成动态链接库文件。
以下是一些代码示例,说明如何封装您的类为动态链接库:

libdemo.h

#ifndef LIBDEMO_H
#define LIBDEMO_H

#include "c01.h"
#include "c02.h"

class LIBDEMO_EXPORT Libdemo
{
public:
    Libdemo();
    C01* createC01();
    C02* createC02();
};

#endif // LIBDEMO_H

libdemo.cpp

#include "libdemo.h"

Libdemo::Libdemo()
{
}

C01* Libdemo::createC01()
{
    return new C01();
}

C02* Libdemo::createC02()
{
    return new C02();
}

然后,用户可以通过在其代码中链接到生成的动态链接库并创建 Libdemo 实例来访问您的类:

#include "libdemo.h"

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

    Libdemo libdemo;
    C01* c01 = libdemo.createC01();
    C02* c02 = libdemo.createC02();

    // 使用您的类对象

    return a.exec();
}

由于您的类是基于 QObject 的,因此在创建它们的实例时,应该将其父对象设置为合适的父对象,以确保正确的内存管理。

引用chatGPT作答,在Qt Creator中将这些类封装为动态链接库可以按照以下步骤进行:

1.创建一个新的Qt库项目,并将这些类的头文件和源文件添加到该项目中。
2.在项目的.pro文件中,将库类型设置为动态库,即:TEMPLATE = lib,CONFIG += dll。
3.在类定义的头文件中,添加LIBDEMO_EXPORT宏定义,以便在生成DLL时正确地导出类。同时,需要在类的构造函数之前声明Q_DECL_EXPORT宏定义,以确保其可用性。
4.在Qt Creator中编译该项目,并生成DLL文件。
5.在使用该库的其他应用程序中,需要将DLL文件和库头文件添加到该项目中,并在代码中引用库头文件。用户需要在使用类之前创建该库的实例,然后调用其中的API函数。
下面是封装类的示例代码,用于将C01和C02类封装到一个名为“Libdemo”的动态链接库中:

libdemo.h:

#ifndef LIBDEMO_H
#define LIBDEMO_H

#include "libdemo_global.h"
#include <QObject>

class LIBDEMO_EXPORT Libdemo : public QObject
{
    Q_OBJECT
public:
    explicit Libdemo(QObject *parent = nullptr);
    void API01A();
    void API01B();
    void Api02A();
    void API02B();
signals:
     void sig01();
     void sig02A();
     void sig02B();
};

#endif // LIBDEMO_H

libdemo.cpp:

#include "libdemo.h"

Libdemo::Libdemo(QObject *parent) : QObject(parent)
{
    // 构造函数
}

void Libdemo::API01A()
{
    // 调用C01类的API01A函数
}

void Libdemo::API01B()
{
    // 调用C01类的API01B函数
}

void Libdemo::Api02A()
{
    // 调用C02类的Api02A函数
}

void Libdemo::API02B()
{
    // 调用C02类的API02B函数
}

libdemo_global.h:

#ifndef LIBDEMO_GLOBAL_H
#define LIBDEMO_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(LIBDEMO_LIBRARY)
#  define LIBDEMO_EXPORT Q_DECL_EXPORT
#else
#  define LIBDEMO_EXPORT Q_DECL_IMPORT
#endif

#endif // LIBDEMO_GLOBAL_H

在.pro文件中添加以下行:

TEMPLATE = lib
CONFIG += dll

编译生成的DLL文件和对应的.a文件将会出现在构建输出目录中。用户可以将这些文件拷贝到自己的应用程序中使用。在应用程序中,用户需要添加以下行:

#include "libdemo.h"

然后,用户可以创建一个Libdemo对象并调用其API函数:

Libdemo *demo = new Libdemo();
demo->API01A();
demo->Api02A();

请注意,为了确保库能够正确链接,需要将Qt版本和编译器版本与应用程序中使用的版本匹配。

这个看你要封装成windows的还是linux的,还是都需要,是需要在不同平台上写动态库的代码和分别编译的。

chatGPT回答:
要将 C01 和 C02 封装到一个库中,可以先创建一个名为 libdemo 的项目,在其中添加 C01 和 C02 类的头文件和实现文件,然后将它们编译成一个共享库(或者静态库)。

为了让其他用户能够使用这个库,可以在 libdemo.h 头文件中添加 C01 和 C02 类的声明,并在构造函数中初始化这些对象,例如:

#include "c01.h"
#include "c02.h"

class LIBDEMO_EXPORT Libdemo
{
public:
    Libdemo() : m_c01(new C01(this)), m_c02(new C02(this)) {}
  
    C01* c01() const { return m_c01; }
    C02* c02() const { return m_c02; }

private:
    C01* m_c01;
    C02* m_c02;
};

这样,其他用户可以在创建一个 Libdemo 实例后,通过 c01() 和 c02() 方法来访问 C01 和 C02 类的公共接口。

需要注意的是,在 Libdemo 类中,需要将 C01 和 C02 类的父对象设置为 Libdemo 实例,这样在 Libdemo 对象销毁时,C01 和 C02 对象也会被自动销毁,避免内存泄漏。

最后,为了让 libdemo.h 文件能够正确导出 Libdemo 类的声明,需要在 libdmo_global.h 中定义 LIBDEMO_EXPORT 宏,例如:

#include <QtCore/qglobal.h>

#if defined(LIBDEMO_LIBRARY)
#  define LIBDEMO_EXPORT Q_DECL_EXPORT
#else
#  define LIBDEMO_EXPORT Q_DECL_IMPORT
#endif

这样,在构建共享库时,LIBDEMO_EXPORT 宏会被设置为 Q_DECL_EXPORT,表示 Libdemo 类的声明和实现都会被导出;在使用共享库时,LIBDEMO_EXPORT 宏会被设置为 Q_DECL_IMPORT,表示 Libdemo 类的声明只会被导入。

为了将这两个类封装到一个库中,您需要按照以下步骤操作:

  1. 创建一个新的 Qt 库项目。在 Qt Creator 中,选择 "文件" -> "新建文件或项目" -> "库" -> "C++ 库"。然后按照向导的提示完成项目的创建。

  2. 将您的 C01 和 C02 类源代码文件(.h 和 .cpp 文件)添加到新创建的库项目中。

  3. 修改 C01 和 C02 的头文件,以便它们使用 LIBDEMO_EXPORT 宏。这将确保在构建库时正确导出这些类的符号。例如,对于 C01 类,您需要这样修改头文件:

#ifndef C01_H
#define C01_H

#include "libdemo_global.h"
#include <QObject>

class LIBDEMO_EXPORT C01 : public QObject
{
    Q_OBJECT
public:
    explicit C01(QObject *parent = nullptr);
    void API01A();
    void API01B();
...
signals:
     void sig01();
     void sig02();
...

};
#endif

同样的,也要修改 C02 类的头文件。

  1. 在库项目的 .pro 文件中添加 QT += core,以便包含 Qt 核心模块。

  2. 构建您的库项目。构建成功后,您将获得一个 .dll(Windows)或 .so(Linux)动态链接库文件,以及一个 .lib(Windows)或 .a(Linux)静态库文件。

  3. 其他程序可以通过包含 C01 和 C02 的头文件,并链接到您刚刚生成的库文件来使用这两个类。注意,他们不需要创建一个 Libdemo 实例,而是直接创建 C01 和 C02 类的实例。例如:

#include "C01.h"
#include "C02.h"

int main()
{
    C01 c01;
    c01.API01A();

    C02 c02;
    c02.API02A();

    return 0;
}

为了正确地链接到库文件,他们可能需要在他们的项目文件中添加一些设置,例如添加库文件的路径和库文件名。这可能因平台和编译器而异。

https://blog.csdn.net/qq_41071758/article/details/123615092?spm=1001.2014.3001.5502
这是之前写的一篇关于这方面的介绍,附带有简单例程,不过偏重于ubuntu下动态库的生成和使用,windows下基本步骤是一致的,可以参考下.

要将自己写的几个类封装成动态链接库,你需要遵循以下步骤:

1、首先,为你的类添加导出宏。你已经在libdemo_global.h中定义了这个宏,现在需要在类声明中使用它。
将以下代码添加到C01和C02类的声明中:

#include "libdemo_global.h"

class LIBDEMO_EXPORT C01 : public QObject
{
    //... 类定义
};

class LIBDEMO_EXPORT C02 : public QObject
{
    //... 类定义
};

2、创建一个.pro文件,用于定义项目设置。在项目根目录下创建一个名为YourLibrary.pro的文件,并添加以下内容:

QT       += core
QT       -= gui

CONFIG   += c++11

TEMPLATE = lib
CONFIG   += shared

TARGET   = YourLibraryName

DEFINES += YOUR_LIBRARY_NAME_LIBRARY

INCLUDEPATH += $$PWD
DEPENDPATH  += $$PWD

HEADERS += \
    c01.h \
    c02.h \
    libdemo_global.h

SOURCES += \
    c01.cpp \
    c02.cpp

其中,YourLibraryName是你想要为动态链接库命名的名称。

3、在Qt Creator中打开YourLibrary.pro文件,构建项目。构建完成后,你应该会在项目的构建目录下找到生成的动态链接库(.dll,.so,.dylib等,具体取决于你的操作系统)以及导入库(.lib或.a)。

4、将生成的动态链接库、导入库以及对应的头文件(c01.h,c02.h和libdemo_global.h)提供给其他项目使用。在使用这些类的项目中,需要将这些头文件包含在源文件中,将导入库添加到项目链接器设置中,并确保动态链接库在运行时可访问。

其他用户不需要先创建Libdemo实例。他们可以直接创建C01和C02类的实例并使用这些类的API。

案例:在Comm文件夹下,有两个类:MsgBox、Log。

如下为 MsgBox.h 的内容:

// MsgBox.h
#if defined(MSGBOX_STATICLIB)
    #define MSGBOX_EXPORT
#else
    #if defined(MSGBOX_LIB)
    #define MSGBOX_EXPORT Q_DECL_EXPORT
    #else
    #define MSGBOX_EXPORT Q_DECL_IMPORT
    #endif
#endif

class MSGBOX_EXPORT MsgBox
{
public:
    MsgBox() {}
    ~MsgBox() {}
    
    void MsgA() {}
...
}


如下为 Log.h 的内容:

// Log.h
#if defined(LOG_STATICLIB)
    #define LOG_EXPORT
#else
    #if defined(LOG_LIB)
    #define LOG_EXPORT Q_DECL_EXPORT
    #else
    #define LOG_EXPORT Q_DECL_IMPORT
    #endif
#endif

class LOG_EXPORT Log
{
public:
    Log() {}
    ~Log() {}
    
    void LogA() {}
    int LogB() {}
...
}

添加文件 Information.h 文件,可以解决多个类封装为一个动态库的问题。

#ifndef __INFORMATION_H__
#define __INFORMATION_H__

namespace
{
    class MsgBox;
    class Log;
}

#endif // !__INFORMATION_H__


多个类封装为一个动态库

可以借鉴下
https://blog.csdn.net/yunxiaoqinghe/article/details/100108392