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的静态库文件增加到使用的项目当中就可以使用了,编译好新的项目的文件是不依赖库文件的,在编译的时候已经加载了静态库,这个就是动态库和静态库的区别。

猜你喜欢

转载自blog.csdn.net/simple_core/article/details/128219968