软件版本: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. 早期(编译器)优化--javac编译器

    java语言的“编译期”其实是一段“不确定”的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用 ...

  2. 20172302 《Java软件结构与数据结构》第九周学习总结

    2018年学习总结博客总目录:第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 教材学习内容总结 第十五章 图 1.图:图(graph)是由一些点(vertex)和这些点之间的连 ...

  3. 20172302《程序设计与数据结构》实验三 敏捷开发与XP实践报告

    课程:<程序设计与数据结构> 班级: 1723 姓名: 侯泽洋 学号:20172302 实验教师:王志强老师 实验日期:2018年5月16日 必修/选修: 必修 1.实验内容 (1)代码规 ...

  4. 安装Git 创建版本库

    安装git [root@node1 ~]# yum -y install git 创建用户 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址 [root@node ...

  5. 虚拟机(VMware Workstation)的使用方法(转)

    虚拟机(VMware Workstation)的使用方法:http://www.aboutyun.com/thread-6273-1-1.html

  6. Oracle中使用透明网关链接到Sqlserver(转)

    测试环境介绍 1.ORACLEServer   Database version:10.2.0 IP:192.168.1.5 ORACLE_HOME:D:\oracle\product\10.2.0\ ...

  7. Linux使用命令 笔记

    1.解压缩 tar -zxvf hadoop.xx.tar.gz2.重命名 mv hadoop-1.1.2 hadoop 3.创建文件夹 mkdir 文件夹名 4.vi编辑器 在一般模式下输入“ZZ” ...

  8. ActiveX学习笔记二 ActiveX在IE中安全级别问题-实现IObjectSafety接口

    http://blog.csdn.net/freedomqx/article/details/4955512 使用MFC开发ActiveX控件,在IE中会提示安全问题,这个可以通过实现IObjectS ...

  9. android:ProgressDialog控件

    ProgressDialog 和 AlertDialog 有点类似,都可以在界面上弹出一个对话框,都能够屏蔽 掉其他控件的交互能力.不同的是,ProgressDialog 会在对话框中显示一个进度条, ...

  10. Windows平台下tomcat 性能调优

    Tomcat 线程查看工具: https://blog.csdn.net/jrainbow/article/details/49026365 16G内存 Tomcat并发优化.内存配置.垃圾回收.宕机 ...