Qt动态库

本文详细介绍如何在QT中创建和使用带界面的动态库,包括项目设置、代码编写、构建过程及动态库的隐式与显示调用方法。

QT带界面的动态库

创建动态库

一、新建一个C++的动态库的项目

在这里插入图片描述

选择C++的动态库的项目,进行下一步

在这里插入图片描述

修改项目的名字和项目的保存的路径。

在这里插入图片描述

选着编译的方式,不需要改,进行下一步。

在这里插入图片描述

选着动态库,编译成动态库,进行下一步。

在这里插入图片描述

项目中会自动的生成这些文件,点击完成。

看一下自动生成的文件

  • .pro

    QT -= gui						#增加的模块
    
    TEMPLATE = lib					#编译成库文件
    DEFINES += LOGIN_LIBRARY		#库文件的名字
    
    CONFIG += c++11
    DEFINES += QT_DEPRECATED_WARNINGS
    SOURCES += \
        login.cpp
    
    HEADERS += \
        LogIn_global.h \
        login.h
    
    # Default rules for deployment.
    unix {
        target.path = /usr/lib
    }
    !isEmpty(target.path): INSTALLS += target
    
    
  • _global.h

    #ifndef LOGIN_GLOBAL_H
    #define LOGIN_GLOBAL_H
    
    #include <QtCore/qglobal.h>
    
    #if defined(LOGIN_LIBRARY)
    #  define LOGIN_EXPORT Q_DECL_EXPORT
    #else
    #  define LOGIN_EXPORT Q_DECL_IMPORT
    #endif
    
    #endif // LOGIN_GLOBAL_H
    
    

    这里定义了符号DLL_EXPORT用于替代Qt的宏Q_DECL_EXPORT或Q_DECL_IMPORT。

    可以到符号DLL_EXPORT,就是我们开始给起的项目的名字,我们需要在我们需要输出的地方使用这个宏来输出可以使用的对象。比如一个类,一个函数等。

    注意:有时候我们看到文件输出了.dll,但是没有文件.lib,就是没有使用这个宏去输出我们的文件。

    一个共享库导出给用户使用的类、符号、函数等都需要用宏Q_DECL_EXPORT来定义导出,一个使用共享库的应用程序需要通过Q_DECL_IMPORT导入共享库里的可用对象。

注意:在需要导出的类,导出函数的地方需要增加*_EXPORT的这个宏,不然在动太库的导出中就会缺失*.lib文件。

  • .h

    #ifndef LOGIN_H
    #define LOGIN_H
    
    #include "LogIn_global.h"
    
    class LOGIN_EXPORT LogIn
    {
    public:
        LogIn();
    };
    
    #endif // LOGIN_H
    

    增加了一行#include “*_global.h”。

二、编写代码

根据自己的需求,编写自己的的动态库的函数和类,在需要导出的地方需要增加导出的宏。才能导出到*.lib文件中,可以根据自己的需要导出,就可以避免了访问。

三、构建动态库项目

生成动态库的项目事不需要进行执行的,只要能够构建成功就可以了。

注意:如果自己动态库中包含了资源文件,那么动态库就可以直接访问了,不管是动态库还是静态库,后面都不需要原始的资源文件了。

在这里插入图片描述

自己使用动态库的版本的信息一定要跟构建时候的信息一致,不然会出现无法打开.lib文件等错误。

构建完成之后,可以在自己的构建的目录中查看生成的动态库的文件。

生成了.dll文件和.lib文件。

四、使用动态库

动态库的隐式调用

隐式链接调用主要用于同一种编程软件(如Qt)生成的代码的共享。

需要的文件:.h文件 _global.h文件 .lib文件,放到项目的include目录下,.dll动态库放到可执行的文件目录下。

在.pro文件中增加进去动态库的链接:一、可以通过界面上的操作进行库的增加。二、直接在.pro中,自己手动的增加和指定库的的路径。如LIBS += -L$$PWD/./ -l(库的名字)

动态库的显示调用

需要的文件: .dll文件

显式链接调用是只有DLL文件,知道DLL里的函数原型,使用QLibrary类对象在应用程序里动态加载DLL文件,声明函数原型,并使用DLL里的函数。这种方式需要在应用程序里声明函数原型,并解析DLL里的函数。

void MainWindow::on_pushButton_clicked()
{
   QLibrary myLib("DelphiDLL");		//加载动态库文件
   if (myLib.isLoaded())			//判断动态库是否已经加载了
     QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第1处");
   typedef int (*FunDef)(int); 		//声明函数的原型
   FunDef myTriple = (FunDef) myLib.resolve("triple"); //解析DLL中的函数 查找函数”triple“
   int V=myTriple(ui->spinInput->value()); //调用函数
   ui->spinOutput->setValue(V);
   if (myLib.isLoaded())
     QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第2处");
}

通过动态库,就可以把自己自定义的控件进行了打包。

创建静态库

有了之前的动态库,如果我们需要生成一个静态库。我们只需要在.pro文件中增加CONFIG+= staticlib

其他的步骤跟动态库的生成是一样的,没有什么的差别。

在构建的目录中会生成一个比较一点的.lib文件

把头文件和.lib的静态库文件增加到使用的项目当中就可以使用了,编译好新的项目的文件是不依赖库文件的,在编译的时候已经加载了静态库,这个就是动态库和静态库的区别。

.pro文件中增加CONFIG+= staticlib

其他的步骤跟动态库的生成是一样的,没有什么的差别。

在构建的目录中会生成一个比较一点的.lib文件

把头文件和.lib的静态库文件增加到使用的项目当中就可以使用了,编译好新的项目的文件是不依赖库文件的,在编译的时候已经加载了静态库,这个就是动态库和静态库的区别。

<think>嗯,用户想了解如何在Qt中使用或下载动态库。首先,我需要整理一下关于Qt动态库的相关知识。根据提供的引用,Qt动态库的创建和使用涉及到几个步骤,比如加载和卸载动态库、导出函数,以及不支持直接实例化QObject派生类的问题。 用户可能想知道具体的操作步骤,比如如何创建动态库,如何在项目中引用它。引用[2]提到在Qt中创建动态库的步骤,包括新建库项目、导出类和函数,以及处理符号导出。这部分需要详细说明,可能用户是开发者,需要实际操作的指导。 然后是关于动态库的使用方法。引用[4]和[5]提到了添加库路径、链接库文件,以及动态加载的方式。用户可能需要知道如何在代码中显式加载动态库,使用QLibrary类。这部分需要分步骤解释,并给出示例代码,可能用户对Qt的库管理不太熟悉,需要清晰的指引。 下载方面,动态库通常是项目自己编译生成的,而不是从网络下载。这点需要明确告诉用户,避免他们去错误的地方寻找下载资源。如果有第三方库的情况,需要说明如何获取,比如官网或包管理工具。 另外,需要注意Qt动态库不支持直接使用QObject的元对象系统,引用[1]提到这一点。用户可能在尝试导出QObject派生类时遇到问题,需要提醒他们使用接口类或信号槽的替代方法。 最后,生成相关问题时要覆盖创建、使用、兼容性、优缺点和第三方库等方面,帮助用户深入理解。确保回答结构清晰,步骤详细,代码示例正确,并且引用标记正确放置。</think>[系统级回答] ### QT动态库的使用方法 1. **动态库的创建步骤** - 在Qt Creator中选择"New Project > Library > C++ Library"创建动态库项目 - 使用`Q_DECL_EXPORT`宏导出需要公开的类和函数: ```cpp class Q_DECL_EXPORT MyMathLib { public: static int add(int a, int b); }; ``` - 编译后会生成.dll(Windows)、.so(Linux)或.dylib(macOS)文件[^2][^3] 2. **动态库的使用方法** *方式一:隐式链接* - 在.pro文件中添加: ```qmake LIBS += -L$$PWD/lib -lMyMathLib INCLUDEPATH += $$PWD/include DEPENDPATH += $$PWD/include ``` - 运行时需要将动态库文件放在可执行文件同级目录[^4] *方式二:显式加载* ```cpp typedef int (*AddFunc)(int, int); QLibrary lib("MyMathLib"); if(lib.load()) { AddFunc add = (AddFunc)lib.resolve("add"); if(add) { qDebug() << add(5,3); // 输出8 } lib.unload(); } ``` 注意:显式加载需要处理函数符号匹配问题[^1][^5] 3. **动态库的兼容性说明** - 需保证编译时使用的Qt版本、编译器版本与应用程序一致 - 跨平台使用时需要分别编译对应平台的动态库 - 避免直接导出QObject派生类,建议使用接口类封装[^1] 4. **动态库的获取方式** - 自行编译生成(推荐) - 第三方动态库需从官网下载预编译版本 - 通过包管理工具获取(如vcpkg、conan)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值