Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明
本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法:
1、添加动态库(直接添加动态库文件.dll,非子项目)
通过qtcreator创建动态库的方法就不在此处赘述了。
唯一值得强调的是动态库与静态库的创建在pro文件中配置的区别在于静态库多了
CONFIG += staticlib ,如下图所示(稍安勿躁,以下示例的工程代码最后会统一打包上传)
注:mingw32编译器生成的动态库文件包括一个***.dll和一个***.a文件(这里的.a文件为导入库,类似于vc动态库生成的lib文件, .dll.a类型文件是MinGW下的DLL文件的imp-lib,即与MSVS下DLL文件附带了一个引入库.lib类似。在MSVS下编程,当要使用DLL文件时,在开发时必须要有.lib文件才能链接通过。在MinGW无需imp-lib库文件的帮助,可直接与.dll文件链。在大多数情况下,.dll.a文件不起作用。具体见https://www.cnblogs.com/liushui-sky/articles/9488020.html),vc编译器生成的动态库文件包含一个***.dll和一个***.lib文件
接下来言归正传,如何添加动态库,右击工程名,选择“添加库”,由于是添加外部的库,就选择“外部库”,如果是子项目的生成的动态库,则选择“内部库”,系统库就不在此介绍了。
这里需要吐槽下,貌似qtcreator添加外部库的步骤在windows下只能添加.lib文件,也就是说主要用于添加vc编译器生成的动态库文件,这个比较坑,linux下到是没有这个问题。
那么qtcreator mingw32编译器生成的库如何添加呢,在看上面两幅图的第一幅,添加库的最终目的是“请将库和它的include路径添加到.pro文件中”,所以我们直接把库文件和include路径直接写到pro文件中即可。添加方法主要有以下几种,不赘述,直接看图
这样动态库就添加好了。
2、添加静态库(直接添加静态库文件.a,非子项目)
与添加动态库类似,不详细说明,直接看图,相信聪明的你一看就明白
pro文件: 编译生成文件(静态库***.a文件):
接下来,如何添加静态库,右击工程名,选择“添加库”,由于是添加外部的库,就选择“外部库”,如果是子项目的生成的动态库,则选择“内部库”,系统库就不在此介绍了。
还是得说声抱歉,貌似qtcreator添加外部库的步骤在windows下不管是动态库和静态库都只能添加.lib文件,也就是说主要用于添加vc编译器生成的动态库(库文件.dll和其引导文件.lib)和静态库文件(.lib文件),这个比较坑,linux下到是没有这个问题。
那么上面qtcreator mingw32编译器生成的静态库如何添加呢,其实跟添加动态库是一样的,指定库文件和include路径,具体看第一节的图。
3、添加动态库或静态库子项目
当一个工程包含多个子项目时,往往一个带main主文件的项目作为主项目(即最后运行的程序),其它子项目以生成库(动态库或者静态库)的方式让主项目进行包含。
未来调试方便,我们通过添加”内部库”的方式建立依赖关系,达到动态关联的目的。添加方法如下:
最终在test_lib.pro的文件中添加了以上代码,但是由于mingw32生成的静态库不带lib文件,所以以上最后3行要删除,即下图中的注释部分不需要
添加内部动态库更加简单,都不用删除,见下图:
4、多级库依赖
以下图中项目为例介绍,test_lib依赖test_lib.2,而test依赖test_lib,所以也要依赖test_lib2,记住不管动态库还是静态库子项目都要把多级依赖的库都添加上,而且还要注意顺利(具体如图中红线所示),否则哪怕编译未出错,也无法正常实现功能。也许有人先在test项目pro中加上了test_lib2的依赖,然后编译通过了,然后再注释掉重新编译还是可以正常运行,但是我想告诉你的是----这都是假象,不相信你把编译的文件都删掉再编译就不行了,这只不过是qtcreator重新构建的功能没有把一些编译文件清除干净而已,所以还是要求把依赖项都加上。这个依赖关系的学习可以具体看这篇文章https://www.cnblogs.com/liushui-sky/articles/9487600.html
注意:这里包含的顺序与库依赖的顺序刚好相反,最底层的子项目在上面,最顶层的项目在下面
5、动态库、静态库混合使用
这个是否可以混合使用呢,答案当然是可以的了,为什么这么说呢,一个很简单的道理——动态编译的qt库本身都是dll的,而静态编译的子项目生成的库为静态库,既然这样可以
使用说明就可以一起混合使用。具体还是以上述项目为例:
这里把test_lib2配置为生成静态库,test_lib不变,仍为动态库,test依次包含,运行结果OK,说明可行。
项目示例代码位置:https://files.cnblogs.com/files/liushui-sky/TEST123.rar
6.动态库改成静态库
通过qtcreator创建的动态库项目中除pro文件中有专门的“DEFINES +=******* ”定义之外,还会有 ******_global.h的头文件生成。如以上TEST12项目中增加子项目(动态库)test_share_lib。
如果项目后期需要改成静态库的话,除了pro中增加“CONFIG += staticlib”之外,还需要把这个头文件和DEFINES删除掉,并且在test_share_lib.h的头文件中把下图中的红色划线部分删除,否则当他还依赖其它几个静态库时会报找不到库(注:_imp__***相关的问题一般是动态库相关的问题)的报错及dllimport相关的报警,具体见下图,这个错误很隐蔽,切记,如果没有删除这些,有时候编译也能过,那是应该有些编译文件(还是动态库时候编译的文件)没有删除干净的原因,这个前面已经说明过类似的情况了,切记。
未注释而报错的项目代码位置:https://files.cnblogs.com/files/liushui-sky/TEST123_2.rar
你只需要按上删除pro中的内容和test_share_lib_global.h头文件,并按上修改test_share_lib.h,就不会报错,可以自己试一下吧。
Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明的更多相关文章
- VS2010中如何将动态链接库改成静态链接库
VS2010中如何将动态链接库改成静态链接库 VS2010静态编译生成的.exe可执行文件,可以免安装免DLL在其他电脑直接运行. 静态编译:就是在编译可执行文件的时候,将可执行文件需要调用的对应动态 ...
- delphi 程 序从exe运行改成dll库
第一种方法: 具体步骤: 1.生成新的或着打开已经存在的工程文件(DPR)(Project1.dpr). 2.选择[View]—>[Project Manager],选中[ProjectGrou ...
- Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库 本文地址:https ...
- dlib编译成静态库及被其它程序调用
一.git下载:https://github.com/davisking/dlib 官网:http://dlib.net/ 二.vs中编译成静态库 1.在vs2015中创建静态库工程(vs2015以上 ...
- c++动态库封装及调用(3、windows下动态库调用)
1.DLL的隐式调用 隐式链接采用静态加载的方式,比较简单,需要.h..lib..dll三件套.新建“控制台应用程序”或“空项目”.配置如下: 项目->属性->配置属性->VC++ ...
- swift调用oc语言文件,第三方库文件或者自己创建的oc文件——简书作者
Swift是怎样调用OC的第三方库的呢?请看下面详情: 情况一: 1.首先打开Xcode,iOS->Application->Single View Application, 选Next. ...
- java web(一) 使用sql标签库+tomcat+mysql手动创建一个jsp练习总结
2016-09-0111:06:53 使用sql标签库+tomcat+mysql手动创建一个jsp 1. 1.1安装tomcat ...
- 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)
最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...
- 【翻译】利用Qt设计师窗体在运行时创建用户界面(Creating a user interface from a Qt Designer form at run-time)
利用Qt设计师窗体在运行时创建用户界面 我们利用Calculator窗体例子中创建的窗体(Form)来展示当一个应用(application)已经生成后,是可以在其运行时产生与例子中相同的用户界面. ...
随机推荐
- JSONObject基本内容(一)
参考资料:http://swiftlet.net/archives/category/json,十分感谢~ 平时做项目,难免有遇到使用json对象的时候,这个东西不难,但是一不使用久了,就会忘记,所以 ...
- Shiro笔记(一)基本概念
Shiro笔记(一)基本概念 一.简介 Shiro是一个Java安全框架,可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等. Authentication:身份认证/登录,验证用户是 ...
- 潭州课堂25班:Ph201805201 并发 第九课 (课堂笔记)
TCP/IP 1,建立连接(三次握手) 1,客户端发起请求 2,服务器请求回应 3,请求确认,双方建立连接 2,数据传输 3,断开连接(四次挥手) 1,客户端请求断开 连接 2,服务器回应请求 3,服 ...
- extend与append的区别
''' list 的两个方法extend 和 append 看起来类似,但实际上完全不同. extend接受一个参数,这个参数,总是一个list,并把list中的每个元素添加到原list中 appen ...
- 利用gsoap工具,通过wsdl文件生成webservice的C++工程文件
一.下载gsoap文件,下载地址:https://zh.osdn.net/projects/sfnet_gsoap2/releases/ 二.以gsoap-2.8为例,解压到D盘,在D:/gsoap- ...
- innodb文件
参数文件 日志文件 socket文件 pid文件 mysql表结构文件 存储引擎文件 1. 错误日志 启用错误日志方法 /etc/init.d/mysql启动文件中 /usr/bin/mysqld_s ...
- MX4_ADB
一.Ubuntu环境1. 建立或修改文件 ~/.android/adb_usb.ini,在文件开头或末尾添加一行,内容是0x2a45. 2. 建立或修改文件 /etc/udev/rules.d/51- ...
- .Net Standard HttpClient封装Htt请求常用操作整理
一.常用Http操作 1.Get请求,有参数,无参数 2.Post 请求,有参数,无参数 3.文件简单下载 修改NetHelper中Post请求方法Bug:请求编码默认UTF8,字符串内存流读取后这是 ...
- Android 如何保持屏幕常亮
确认应用需要像游戏或者视频应用一样保持屏幕处于开启状态.最好的方式是在Activity中使用FLAG_KEEP_SCREEN_ON.(and only in an activity, never in ...
- Spark LDA实战
选取了10个文档,其中4个来自于一篇论文,3篇来自于一篇新闻,3篇来自于另一篇新闻. 首先在pom文件中加入mysql-connector-java: <dependency> <g ...