软件版本:QT5.12.0 + Qt Creator4.8.0

  动态链接

  动态链接库又叫"共享库",即sharedLib。

  Qt Creator中新建项目,选择"Library"->"C++ 库"

选择"共享库",选择位置,输入名称:QtSharedLib

选择MinGW构建,一直默认到完成即可!

最终生成如下文件:

完善导出类和导出函数:

编译链接最终生成文件:

  其中.a是导入库,相当于Windows下的lib文件,.dll是共享库文件,相当于Windows下的dll文件,.o是目标文件,相当于Windows下的obj文件。

  共享库的调用:

  1)、使用QLibrary显式链接,需要将dll与exe放在一起

  新建Qt Console应用程序,代码如下:

C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
#include <QCoreApplication>
#include <QLibrary>
#include <QDebug>
#include "QtStaticLib.h"

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

// 声明函数指针
    typedef int (*Add)(int a, int b);
    typedef int (*Sub)(int a, int b);
    typedef int (*Mul)(int a, int b);
    typedef int (*Div)(int a, int b);

// 显式链接
    QLibrary mylib("QtSharedLib.dll");
    if(!mylib.load())
    {
        // 加载 dll 失败
        qDebug() << "Load QtSharedLib.dll failed!";
        ;
    }

// 需要知道有哪些导出函数,可通过depends.exe查看
    Add add = (Add)mylib.resolve("add");
    Sub sub = (Sub)mylib.resolve("subtraction");
    Mul mul = (Mul)mylib.resolve("multiplication");
    Div div = (Div)mylib.resolve("division");
    if(nullptr == add)
    {
        qDebug() << "Load function add failed!";
        ;
    }
    if(nullptr == sub)
    {
        qDebug() << "Load function sub failed!";
        ;
    }
    if(nullptr == mul)
    {
        qDebug() << "Load function mul failed!";
        ;
    }
    if(nullptr == div)
    {
        qDebug() << "Load function div failed!";
        ;
    }

// 调用函数
);
    qDebug() << sub();
    qDebug() << mul();
    qDebug() << div();

return a.exec();
}

  2)、使用隐式链接

  新建Qt Widget应用程序:

  将QtSharedLib工程源码目录下的 QtSharedLib.h、QtSharedLib_global.h和QtSharedLib.a复制到该工程源码目录下,将 QtSharedLib.dll 文件复制到生成exe所在目录中。

  添加.a文件时,可在工程上右键,在弹出的菜单中选择"添加库…"

  

  最后自动在pro文件中加入库链接:

  

  主函数调用:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 # include "Widget.h"
 # include < QApplication >
 # include "QtSharedLib.h"

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

// Widget w;
    // w.show();

QtSharedLib sharedLib;
    sharedLib.showMessage();

return a.exec();
}

  输出showMessage实现的打印信息:

  

  静态链接

  Qt Creator中新建项目,选择"Library"->"C++ 库"

选择"静态链接库",选择位置,输入名称:QtStaticLib

选择MinGW构建,一直默认到完成即可!

  完善静态库代码

  

  编译生成静态库文件:只有.a和.o文件

  

  静态库的调用

  这里使用隐式链接的方法:

  继续使用前面的Console应用程序,将静态库的.a文件以及.h文件拷贝到工程源码目录下,是"添加库…"操作将库配置写入pro文件

  输出showMessage实现的打印信息:

  

QT动态库和静态库使用的更多相关文章

  1. 【转】iOS动态库和静态库的简要介绍

    静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...

  2. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  3. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

  4. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

  5. Linux系统中“动态库”和“静态库”那点事儿【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...

  6. libjpeg 交叉编译动态库和静态库

    1.下载libjpeg库,解压之     得到了jpeg6b和libtool-2.2.4两个文件夹. 2.编译安装libtool工具.   这是配置libtool,这里需要注意:configure 参 ...

  7. VS2008 动态库和静态库的生成和加载

    第一:动态库和静态库的生成: 1) 新建一个生成dll工程: 文件->新建->项目->Win32->Win32控制台应用程序 输入项目名称:dllTest ,项目路径:D:\V ...

  8. 技巧:Linux 动态库与静态库制作及使用详解

    技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...

  9. Linux系统中“动态库”和“静态库”那点事儿

    摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...

  10. linux --> 动态库和静态库

    库的分类 根据链接时期的不同,库分为静态库和动态库之分. 静态库:在链接阶段被链接的,生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 动态库:在程序执行的时候被链接的,即使程 ...

随机推荐

  1. rabbitmq使用(三)

    Publish/Subscribe In the previous tutorial we created a work queue. The assumption behind a work que ...

  2. 构造函数,super()

    一.构造函数的作用 创建类的对象,只有对象才能调用一个类中的方法和属性 二.在有继承关系的类中,创建子类对象,初始化的顺序 先父类构造 —>后子类构造 为什么父类构造会被调用?因为有继承关系,子 ...

  3. PHP 利用QQ邮箱发送邮件「PHPMailer」

    在 PHP 应用开发中,往往需要验证用户邮箱.发送消息通知,而使用 PHP 内置的 mail() 函数,则需要邮件系统的支持. 如果熟悉 IMAP/SMTP 协议,结合 Socket 功能就可以编写邮 ...

  4. 使用 IntraWeb (28) - 基本控件之 TIWTemplateProcessorHTML、TIWLayoutMgrHTML、TIWLayoutMgrForm

    TIWTemplateProcessorHTML //使用外部的 html 文件做模板 TIWLayoutMgrHTML //直接输入 Html 文本做模板 TIWLayoutMgrForm //这应 ...

  5. 查询当前Oracle数据库的实例

    select name from v$database; select instance_name from v$instance; // 查看实例状态 >select instance_nam ...

  6. springboot2.X 集成redis+消息发布订阅

    需求场景:分布式项目中,每个子项目有各自的 user 数据库, 在综合管理系统中存放这所有用户信息, 为了保持综合管理系统用户的完整性, 子系统添加用户后将用户信息以json格式保存至redis,然后 ...

  7. 坚果云无法同步SVN文件夹

    把svn的库放在云盘上,同步到本地,以前在金山快盘.360网盘都用得好好的,换坚果云后,想着肯定没问题,结果发现,不行! 新机子上的版本库可以建起来,但检出时报错: Could not open th ...

  8. 使用 BeautifulSoup 进行解析 html

    #coding=utf-8   import urllib2 import socket import httplib from bs4 import BeautifulSoup   UserAgen ...

  9. Java 迭代器综述

    一.摘要 迭代器模式是与集合共生共死的.一般来说.我们仅仅要实现一个容器,就须要同一时候提供这个容器的迭代器.使用迭代器的优点是:封装容器的内部实现细节,对于不同的集合,能够提供统一的遍历方式,简化c ...

  10. 拯救者y720 双显卡, nvidia 1060 ,Ubuntu16.04 安装 Nvidia 显卡驱动

    为了能够记录,下次可以有参考的东西,就记录如此 多谢网上大牛的帖子,我都是安装您们的才顺利的一次性,无黑屏现象的完成了安装 1. 参考: 1.secure boot option ( 开机进入bios ...