Qt 静态库和动态库
Qt 静态库和动态库
- 创建和使用静态库
- 创建静态库
- 使用静态库的文件
- 创建和使用动态库
- 创建动态库
- 使用动态库
- 隐式链接调用共享库
- 显示调用
创建和使用静态库
创建静态库
1.选择新建文件和项目。=>选择C++ Library
2.进入界面
类型选择:静态库
项目的名字和类的名字根据自己的实际的情况修改就行。
静态库项目可以使用MinGW或MSVC编译器编译,但是项目编译生成的文件与使用的编译器有关。若使用MSVC编译,编译后会生成一个库文件.lib;若使用MinGW编译,编译后会生成一个库文件.a。
然后根据自己需要选择编译成debug版本和release版本的静态库文件。
看一下.pro文件的内容:
TEMPLATE=lib 定义项目模板是库,而不是应用程序。
CONFIG += staticlib 配置项目为静态库。
TARGET = myStaticLib定义项目编译后生成的目标文件名称是myStaticLib。
使用静态库的文件
在自己的项目中,增加库就行。
1.选择外部库
2.把自己编译好的动态库增加到自己的项目的include的文件夹下面。包括头文件.h和动态库文件.lib。
选择静态库文件,选择自己的静态库的路径增加进去。
最后可以在.pro文件中看到,自动帮助我们增加了路径
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/include/ -lmyStaticLibd
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/include/ -lmyStaticLibdINCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/includewin32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/include/libmyStaticLibd.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/include/libmyStaticLibd.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/include/myStaticLibd.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/include/myStaticLibd.lib
注意:
如果你的静态的版本库与你现在项目的编译的编译器类型不同,或者编译的位数不同,会出现无法解析的外部符号。
创建和使用动态库
创建动态库
1.选择新建文件和项目。=>选择C++ Library
2.进入界面
类型选择:动态库
项目的名字和类的名字根据自己的实际的情况修改就行。
进去之后会发现我们的项目会多一个_global.h的文件
查看一下内容:
#ifndef DLL_GLOBAL_H
#define DLL_GLOBAL_H#include <QtCore/qglobal.h>#if defined(DLL_LIBRARY)
# define DLL_EXPORT Q_DECL_EXPORT
#else
# define DLL_EXPORT Q_DECL_IMPORT
#endif#endif // DLL_GLOBAL_H
这里定义了符号DLL_EXPORT用于替代Qt的宏Q_DECL_EXPORT或Q_DECL_IMPORT。
可以到符号DLL_EXPORT,就是我们开始给起的项目的名字,我们需要在我们需要输出的地方使用这个宏来输出可以使用的对象。比如一个类,一个函数等。
注意:有时候我们看到文件输出了.dll,但是没有文件.lib,就是没有使用这个宏去输出我们的文件。
一个共享库导出给用户使用的类、符号、函数等都需要用宏Q_DECL_EXPORT来定义导出,一个使用共享库的应用程序需要通过Q_DECL_IMPORT导入共享库里的可用对象。
再看一下.pro文件:
Qt += widgets
TARGET = mySharedLib //生成的动态库的名字
TEMPLATE = lib //库DEFINES += MYSHAREDLIB_LIBRARY
目的文件准备好之后就可以编译生成DLL文件,根据使用的编译器不同,生成的文件有些区别。
若使用MSVC编译,编译后会生成.dll和.lib两个文件,.dll在运行应用程序时调用,.lib在应用程序隐式调用动态链接库时使用。
若使用MinGW编译,编译后会生成.dll和.a两个文件,.dll在运行应用程序时调用,.a在应用程序隐式调用动态链接库时使用。
使用动态库
两种调用方式:隐式链接(implicit linking)调用和显式链接(explicit linking)调用。
隐式链接调用是在编译应用程序时,有动态库的lib文件(或.a文件)和h头文件,知道DLL中有哪些接口类和函数,编译时就隐式地生成必要的链接信息,使用DLL中的类或函数时根据h头文件中的定义使用即可。应用程序运行时将自动加载DLL文件。隐式链接调用主要用于同一种编程软件(如Qt)生成的代码的共享。
显式链接调用是只有DLL文件,知道DLL里的函数原型,使用QLibrary类对象在应用程序里动态加载DLL文件,声明函数原型,并使用DLL里的函数。这种方式需要在应用程序里声明函数原型,并解析DLL里的函数。
隐式链接调用共享库
需要准备.h文件,_global.h文件,.lib文件。放到项目的include目录下。
然后增加库,跟静态的增加库是一样的。然后把.dll,文件放到程序的运行的位置就可以了。
查看一下.pro文件:
已经链接好.lib文件了
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/include/ -lmySharedLib
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/include/ -lmySharedLibdINCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include
显示调用
说白了,就是只有有动态库.dll文件,和知道动态库中有什么函数,那么使用的时候,就能够直接调用动态库的文件,就是不需要连接什么。
显式链接调用共享库是通过QLibrary类实现的。QLibrary是与平台无关的,用于在运行时载入共享库,一个QLibrary对象只对一个共享库进行操作。
一般在QLibrary的构造函数中传递一个文件名,可以是带路径的绝对文件名,也可以是不带后缀的单独文件名。QLibrary会根据运行的平台自动查找不同后缀的共享库文件,例如Unix上是“.so”,Mac上是“.dylib”,Windows上是“.dll”。
例如简单调用
void MainWindow::on_pushButton_clicked()
{QLibrary myLib("DelphiDLL");//加载动态库文件if (myLib.isLoaded())QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第1处");typedef int (*FunDef)(int); FunDef myTriple = (FunDef) myLib.resolve("triple"); //解析DLL中的函数int V=myTriple(ui->spinInput->value()); //调用函数ui->spinOutput->setValue(V);if (myLib.isLoaded())QMessageBox::information(this,"信息","DelphiDLL.DLL已经被载入,第2处");
}
QLibrary有几个函数用于DLL文件的载入与卸载:load()用于手动载入DLL文件到内存里,一般无需手工调用此函数,在DLL里的函数第一次被使用时QLibrary会自动调用此函数;isLoaded()用于判断DLL是否已经被载入内存;unload()用于将DLL从内存中卸载。
一个动态链接库在内存里只能有一个实例,也就是即使有多处调用了这个动态链接库里的函数,它也只会被载入一次,如果不是所有的实例都使用unload()卸载它,那么它会在应用程序退出时才卸载。
显式调用动态链接库里的函数,需要声明函数原型的类型,即:
typedef int (*FunDef)(int);
然后使用QLibrary的resolve()函数解析需要调用的函数。
FunDef myTriple = (FunDef) myLib.resolve(“triple”);
这样就定义了一个函数myTriple,用于实现DLL文件里的函数"triple"的功能,当然重新声明的函数名称可以和DLL里的函数名称完全相同。
Qt 静态库和动态库相关推荐
- QT 静态库和动态库的使用方法
QT 静态库和动态库的使用方法 背景知识:程序在编译成可执行文件时,会有四步过程: 1预处理(头文件和宏定义) g++ -E 1.cpp -o 1.i 2编译 将c代码编译成汇编代码 g++ -S 1 ...
- QT添加库(静态库和动态库)
QT添加库(静态库和动态库) 添加动态库(dll库)的方法:** 就是把所有需要的dll库全部放到exe所在文件夹,和exe处于同一级目录下. 添加静态库(lib库)的方法: 1.右键项目文件,点击添 ...
- C++基于QT创建并使用静态库和动态库
如果这个宇宙里没有你所爱的人,那还算什么宇宙. -- 斯蒂芬 · 威廉 · 霍金 之前写了一篇文章(C++初始动态库和静态库)简单介绍了一下C++静态库和动态库的特点,今天来说一下使用QT这个开发工具 ...
- 包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库,动态库的创建与调用和vs里引用的使用
引言:vs中怎么添加外部头文件? 如过直接在项目头文件处,添加一下,如下图: 否则,依然会报错,如下图: 有两种方法,来解决(你不在vs上的添加它也没事): (1) 直接把外部头文件复制过来,放在此项 ...
- [学习备忘录]Linux平台静态库、动态库的一些笔记
先声明几点: 1.操作系统:linux(fc9).编译器:gcc-4.3.0.编辑器:包括但不限于emacs.vim.这些无理由也不应造成限制. 2.生成的可执行文件名称比较有规律,仅仅是为了演示的方 ...
- PHP编译为静态库,makefile生成静态库和动态库
库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...
- 关于Linux静态库和动态库的分析
From: http://hi.baidu.com/bdccutysj/blog/item/5bae7f0202abac7c3912bb15.html 1.什么是库 在windows平台和linux平 ...
- C/C++ 静态库和动态库的区别
可执行目标文件 可重定位目标文件 共享目标文件 静态库和动态库的区别: 生效阶段不同,静态库是在编译阶段就会把其链接到可执行目标文件中:动态库是在程序运行过程中指定路径或者系统动态库路径下寻找. -l ...
- 静态库与动态库详细剖析
技术交流QQ群:1027579432,欢迎你的加入! 1.库的介绍 库是什么? 二进制文件: 将源代码(.c或.cpp文件)变成二进制格式的源代码: 加密操作(只能使用,无法知道源代码是什么): 库制 ...
最新文章
- spring+mybatis事务的readonly属性无效
- Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.ClassVisitor
- java 微信 菜单_java微信开发API第四步 微信自定义个性化菜单实现
- java类放到对象_Java中类和对象总结
- 放弃Eclipse Juno
- json返回页面读取data里的值都是object_【一】尤大神都说Vite香,让我来手把手分析Vite原理...
- 如何将JAR包发布到Maven中央仓库?
- TypeScript 变量声明
- 用CMD批量ping ip地址
- 最新CPC客户端安装教程,亲试有效
- 数列分块入门4-6题解
- 冠捷云计算机功能,USB3.0显示器亮相!AOC多款LCD新品赏
- 数据分析项目实战项目四:亚马逊Kindle书籍多渠道商业分析项目
- 欠四大银行信用卡不还,最终会怎么样?
- 射灯安装方法图解_射灯安装图解
- 面试|详细分析ScheduledThreadPoolExecutor(周期性线程池)的原理
- 车用计算机电路板,使用车充、LED头灯电路板制作1.5V电源模块(可代替1号电池)...
- 红帽8使用nfs共享本地镜像
- 死锁避免——银行家算法
- Qt开发经验小技巧171-175
热门文章
- Mac OS 删除 ~$.doc|pptx|xlsx 文件
- Background Matting V2 学习
- 【数论+莫比乌斯反演】Exclusive Multiplication | gym103688E
- Linux连接与基础命令
- 学校里计算机专业有什么奖项,2021中小学电脑制作活动奖项可以报考哪些综合评价院校?...
- 人工智能走进中小学课堂法则
- SAP发出商品业务配置
- 从零打造一个机器人003【初识STM32单片机】
- #QNAN、1.#IND和1.#INF等“无效”浮点数说明及其判断
- 【C++】实现敏感词过滤算法(含源码)