Qt(MinGW ) Windows下创建动态库

  • 2019 年 12 月 5 日
  • 筆記

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

上一次和大家分享的是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光明