软件版本: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. Bracket 使用指南

    Brackets 是一个免费.开源且跨平台的 HTML/CSS/JavaScript 前端 WEB 集成开发环境 (IDE工具).该项目由Adobe 创建和维护,根据MIT许可证发布,支持 Windo ...

  2. LOJ6041 SAM+set+树状数组

    首先对于原串建$SAM$,我们可以发先在一个点$i$的$right$集合里的点的相似度就是$len[i]$,于是可以将$SAM$的$right$集合通过$set$来启发式合并,每次加入新的点对$(i, ...

  3. ios多target开发

    链接: ios开发时,在Xcode中添加多个targets进行版本控制 如何在iOS项目中创建多个target 多个Target的使用 iOS开发中如何创建多个target

  4. EF6 简单增删改查示例代码

    示例一: private DbContext _dbContext; public DbContext CurrentContext { get { if (_dbContext == null) { ...

  5. EasyUI学习总结(三)——easyloader源码分析(转载)

    声明:这一篇文章是转载过来的,转载地址忘记了,原作者如果看到了,希望能够告知一声,我好加上去! easyloader模块是用来加载jquery easyui的js和css文件的,而且它可以分析模块的依 ...

  6. Shutting down CodePlex 03/31/2017

    Almost 11 years after we created CodePlex, it’s time to say goodbye.  We launched CodePlex in 2006 b ...

  7. [Android] 判断手机上是否安装了某个程序

    http://blog.csdn.net/xiaodongrush/article/details/9320135 1. 首先得到该程序的包名 这个连上手机ADB,看logcat就能看到.比如:QQ客 ...

  8. Hyperledger超级账本在Centos7下搭建运行环境

    超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,加入成员包括:荷兰银行(ABN AMRO).埃森哲(Accenture)等十几个不同利益体 ...

  9. caffe中的fine-tuning

    caffe finetune两种修改网络结构prototxt方法 第一种方法:将原来的prototxt中所有的fc8改为fc8-re.(若希望修改层的学习速度比其他层更快一点,可以将lr_mult改为 ...

  10. Windows安装Flask Traceback (most recent call last):

    Exception: File "c:\users\appdata\local\programs\python\python36-32\lib\site-packages\pip\compa ...