专栏首页Pou光明Qt(MinGW ) Windows下创建动态库

Qt(MinGW ) Windows下创建动态库

点击上方蓝字可直接关注公众号哦,方便下次阅读。

上一次和大家分享的是Linux下Qt创建共享库并链接共享库,这次和大家分享的是Windows下Qt创建共享库并链接共享库。大家肯定注意到标题中Qt后面括号中的minGW,为什么要加上minGW呢?先卖个关子,后面的介绍中会解释的。

在上一篇文章中Linux下Qt创建共享库与链接共享库对共享库的创建与链接都已经有了详细的步骤,所以本次文章中就不再赘述,主要说一下不同的地方。

一、创建共享库

1. 工程文件.pro的修改

QT       -= core gui

TARGET = TestLib
TEMPLATE = lib

DESTDIR = $$PWD/dll

DEFINES += CREATEDLL_LIBRARY

SOURCES += testadd.cpp

HEADERS += testadd.h

unix {
    target.path = /usr/lib
    INSTALLS += target
}

与Linux下相比,去掉了版本号的设置,因为添加上不起作用。。相比Linux下,添加了DESTDIR = $$PWD/dll,这是目标目录,会把生成的文件放到该目录下。这里没有区分debug版本与release版本。

2. 生成共享库的效果

由于我们在pro中指定了生成路径,所以生成的文件都在dll文件中。这里面要注意的是,生成的有两个文件,一个是.a文件,在链接过程中使用,另一个是.dll文件,在运行过程中使用。

二、链接动态库

1. 添加动态库

注意下这里面的库文件选择的是刚才生成的.a文件。默认勾选了为debug版本添加’d’作为后缀。

2. 编译、运行过程中的问题

①编译过程中出现的问题

../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lTestLibd

什么情况?没有找到这个文件?再一看,后面多了一个d,默默地删掉解决问题。

因为刚才勾选了为debug版本添加’d’作为后缀。。

②运行直接崩溃

生成库的时候不还有一个文件么,这时候它就该起作用了。将它与.exe(可执行文件)放到同一目录下或者配置系统的环境变量都可以。

③结果如下

不知道大家能不能看出是Windows风格的?

后记总结:

①对比Linux与Windows,在运行时缺少库的情况下Linux会提示,Windows则没有。不过掌握了动态库的使用方法后,这些都是可以规避的。

②之前看到别人链接库的后缀是.lib,难道是他错了?或者是我错了?可是我的能正常运行啊,但是我又看到的不止一个人链接的是.lib?于是我的求知欲再次被激起,查了下.a 、 .lib 、 .dll等的区别,最终发现是编译工具的不同所导致。

用mingw的会生成.a和.dll后缀的,他们用的是msvc,所以生成的是.lib和.dll。下面的图片是Qt的安装包,可以看到不同安装包所用的编译工具的不同。

所以这也是我为什么要在标题中加入MinGW的原因了。另外,使用MinGW的工程也可以直接链接.lib文件,这个就之后再了解了。

欢迎大家关注公众号:Pou光明

本文分享自微信公众号 - Pou光明(pou0230)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python官方二十七问,你知道个啥?

    Guido van Rossum 认为使用缩进进行分组非常优雅,并且大大提高了普通 Python 程序的清晰度。大多数人在一段时间后就学会并喜欢上这个功能。

    叫我龙总
  • python测试开发django-66.图片403forbidden

    用 django 开发 web 页面,在 HTML 页面上添加图片时,发现本地图片可以正常显示,但是添加一个互联网的图片,却不能正常显示。

    上海-悠悠
  • CBrother脚本10分钟写一个拯救“小霸王服务器”的程序

    到了一家新公司,接手了一坨c++服务器代码,到处内存泄漏,这服务器没有数据库,挂了后重启一下就好了,公司就这么凑活着用了几年了,定时重启吧,也不是天天挂,不定时...

    无剑胜有剑
  • 经典面试题-是否可以从一个static方法内部发出对非static方法的调用

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • Django+Celery框架自动化定时任务开发

    本章介绍使用DjCelery即Django+Celery框架开发定时任务功能,在Autotestplat平台上实现单一接口自动化测试脚本、业务场景接口自动化...

    测试开发社区
  • Java基础系列5:Java代码的执行顺序

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形...

    用代码征服天下
  • xmake从入门到精通4:常用C/C++项目描述设置详解

    xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。

    ruki
  • ArrayList插入1000w条数据之后,我怀疑了jvm...

    "我在一个ArrayList中连续插入1千万条数据,结果耗时不一样,分别是 2346 797 没搞明白 "

    乔戈里
  • 打牢算法基础,从动手出发!

    大家好,我是光城。算法在计算机领域的重要性,就不用我多说了,每个人都想要学算法,打牢算法基础,可是不知道如何做,今天我来推荐一波学习思路。

    公众号guangcity
  • 为什么 Redis 单线程能支撑高并发?

    最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分...

    芋道源码

扫码关注云+社区

领取腾讯云代金券