QT创建共享库及调用方式

通过QT可创建共享库,即Windows平台上的动态链接库,动态链接库项目编译后产生DLL库,使用的DLL库的好处是便于软件维护,更新DLL库后,只要接口名称未变,应用程序仍然可以调用。 而QT共享库的调用方式有两种形式,分别为隐式链接、显式链接。隐式链接主要在同一编程软件中使用,需要动态的库文件和.h头文件,并且知道DLL库函数名和函数原型;显式链接只需要知道函数名和函数原型即可,在应用程序运行时才会加载共享库的文件。本文主要介绍隐式链接的调用方式,接下来本文将详细介绍QT创建共享库及调用方式:

创建共享库

打开Qt Creator,点击文件下新建文件或项目; 选择Library、C++库,点击Choose; 类型选择共享库,填入项目名称和创建路径,点击下一步; 点击下一步; 本例不进行界面显示,所以这里选择QtCore即可,点击下一步; 填入类名,头文件和源文件会随之变化,点击下一步; 点击完成; myshared_lib.cpp源文件只简单地输出数字:

#include "myshared_lib.h"
int Myshared_lib::print()
{
          
   
    int num=6;
    return num;
}

myshared_lib.h头文件对函数进行声明,函数为static类型,在应用工程函数中调用库中print()函数不需要再实例化:

#ifndef MYSHARED_LIB_H
#define MYSHARED_LIB_H

#include "myshared_lib_global.h"
#include <QDebug.h>

class MYSHARED_LIBSHARED_EXPORT Myshared_lib
{
          
   
public:
    static int print();
};
#endif // MYSHARED_LIB_H

自动生成的myshared_lib_global.h文件,定义符号MYSHARED_LIBSHARED_EXPORT用于替代QT的宏Q_DECL_EXPORT或者Q_DECL_IMPORT。共享库给用户使用的类、函数等通过Q_DECL_EXPORT导出。应用程序通过Q_DECL_IMPORT导入共享库中可用对象:

#ifndef MYSHARED_LIB_GLOBAL_H
#define MYSHARED_LIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYSHARED_LIB_LIBRARY)
#  define MYSHARED_LIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYSHARED_LIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // MYSHARED_LIB_GLOBAL_H

此时在Debug或Release下编译生成DLL库。在生成.dll文件的同时,根据编译器的不同,另外生成的一个文件也有所区别。MSVC编译器生成.lib文件,MinGW编译器生成.a文件。本文以MinGW编译器为例进行接下来的调用共享库讲解。

调用共享库

新建应用工程后,在工程文件目录新建include文件夹,将myshared_lib_global.h、myshared_lib.h头文件、编译生成的myshared_lib.dll、debug模式下生成的libmyshared_libd.a(人为在文件名后加个字母d)、release模式下生成的libmyshared_lib.a全部放入到include文件夹中; 在QT中,应用工程名旁右键单击选择添加库…,选择外部库,点击下一步; 填入库文件、包含路径,选择Windows平台,动态链接,完成后点击下一步; 点击完成,此时在lib_test.pro文件中会自动添加如下一段代码,在debug或者release方式下可自动编译进相应的.a文件; 应用程序中的.h文件中加入代码:

#include "myshared_lib.h"

在源文件函数中调用静态库中的函数:

int num=0;
num=Myshared_lib::print();
qDebug()<<num;

编译执行,输出结果:

6

调用QT静态库成功!

经验分享 程序员 微信小程序 职场和发展