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 静态库和动态库相关推荐

  1. QT 静态库和动态库的使用方法

    QT 静态库和动态库的使用方法 背景知识:程序在编译成可执行文件时,会有四步过程: 1预处理(头文件和宏定义) g++ -E 1.cpp -o 1.i 2编译 将c代码编译成汇编代码 g++ -S 1 ...

  2. QT添加库(静态库和动态库)

    QT添加库(静态库和动态库) 添加动态库(dll库)的方法:** 就是把所有需要的dll库全部放到exe所在文件夹,和exe处于同一级目录下. 添加静态库(lib库)的方法: 1.右键项目文件,点击添 ...

  3. C++基于QT创建并使用静态库和动态库

    如果这个宇宙里没有你所爱的人,那还算什么宇宙. -- 斯蒂芬 · 威廉 · 霍金 之前写了一篇文章(C++初始动态库和静态库)简单介绍了一下C++静态库和动态库的特点,今天来说一下使用QT这个开发工具 ...

  4. 包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库,动态库的创建与调用和vs里引用的使用

    引言:vs中怎么添加外部头文件? 如过直接在项目头文件处,添加一下,如下图: 否则,依然会报错,如下图: 有两种方法,来解决(你不在vs上的添加它也没事): (1) 直接把外部头文件复制过来,放在此项 ...

  5. [学习备忘录]Linux平台静态库、动态库的一些笔记

    先声明几点: 1.操作系统:linux(fc9).编译器:gcc-4.3.0.编辑器:包括但不限于emacs.vim.这些无理由也不应造成限制. 2.生成的可执行文件名称比较有规律,仅仅是为了演示的方 ...

  6. PHP编译为静态库,makefile生成静态库和动态库

    库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...

  7. 关于Linux静态库和动态库的分析

    From: http://hi.baidu.com/bdccutysj/blog/item/5bae7f0202abac7c3912bb15.html 1.什么是库 在windows平台和linux平 ...

  8. C/C++ 静态库和动态库的区别

    可执行目标文件 可重定位目标文件 共享目标文件 静态库和动态库的区别: 生效阶段不同,静态库是在编译阶段就会把其链接到可执行目标文件中:动态库是在程序运行过程中指定路径或者系统动态库路径下寻找. -l ...

  9. 静态库与动态库详细剖析

    技术交流QQ群:1027579432,欢迎你的加入! 1.库的介绍 库是什么? 二进制文件: 将源代码(.c或.cpp文件)变成二进制格式的源代码: 加密操作(只能使用,无法知道源代码是什么): 库制 ...

最新文章

  1. spring+mybatis事务的readonly属性无效
  2. Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.ClassVisitor
  3. java 微信 菜单_java微信开发API第四步 微信自定义个性化菜单实现
  4. java类放到对象_Java中类和对象总结
  5. 放弃Eclipse Juno
  6. json返回页面读取data里的值都是object_【一】尤大神都说Vite香,让我来手把手分析Vite原理...
  7. 如何将JAR包发布到Maven中央仓库?
  8. TypeScript 变量声明
  9. 用CMD批量ping ip地址
  10. 最新CPC客户端安装教程,亲试有效
  11. 数列分块入门4-6题解
  12. 冠捷云计算机功能,USB3.0显示器亮相!AOC多款LCD新品赏
  13. 数据分析项目实战项目四:亚马逊Kindle书籍多渠道商业分析项目
  14. 欠四大银行信用卡不还,最终会怎么样?
  15. 射灯安装方法图解_射灯安装图解
  16. 面试|详细分析ScheduledThreadPoolExecutor(周期性线程池)的原理
  17. 车用计算机电路板,使用车充、LED头灯电路板制作1.5V电源模块(可代替1号电池)...
  18. 红帽8使用nfs共享本地镜像
  19. 死锁避免——银行家算法
  20. Qt开发经验小技巧171-175

热门文章

  1. Mac OS 删除 ~$.doc|pptx|xlsx 文件
  2. Background Matting V2 学习
  3. 【数论+莫比乌斯反演】Exclusive Multiplication | gym103688E
  4. Linux连接与基础命令
  5. 学校里计算机专业有什么奖项,2021中小学电脑制作活动奖项可以报考哪些综合评价院校?...
  6. 人工智能走进中小学课堂法则
  7. SAP发出商品业务配置
  8. 从零打造一个机器人003【初识STM32单片机】
  9. #QNAN、1.#IND和1.#INF等“无效”浮点数说明及其判断
  10. 【C++】实现敏感词过滤算法(含源码)