Qt之创建并使用共享库
来源:互联网 发布:怎样做数据分析表 编辑:程序博客网 时间:2024/04/30 06:36
在 Windows 中,有动态链接库(DLL - Dynamic Link Library);在 Linux 中,有共享库(Shared Library),它们是相同的!
由于平台和编译器的差异,输出的库文件也不同:
在 Windows 中,MinGW 将输出
.a
和.dll
;MSVC 将输出.lib
和.dll
。在 Linux 中,MinGW 将输出
.so
、.so.1
、.so.1.0
和.so.1.0.0
-.lib
.a
和 .so
是导入库,它们有助于将我们的代码链接到库中,并且在构建文件时需要。
简述
创建共享库
项目文件
生成共享库
将应用程序与共享库链接
更多参考
版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820
创建共享库
要创建一个共享库,需要执行以下几个步骤:
文件 -> 新建文件或项目,选择:Library -> C++ 库:
选择“共享库”,然后输入“名称”(这里以
SharedLib
为例),并选择“创建路径”:
注意: “类型”下拉列表中有三个选项,分别是:共享库、静态链接库、Qt Plugin(Qt 插件)。
选择一个适当的“构建套件”
选择需要的模块(默认勾选“
QtCore
”,如果需要其他模块,请自行勾选。例如:界面需要依赖QtWidgets
)。执行要创建的源码文件的基本信息(默认即可)
完成向导
项目文件
在项目创建完成之后,Qt Creator 会帮我们生成一系列相关文件,目录结构如下:
查看.pro
,并对其稍作修改:
TARGET = SharedLib# 新增部分CONFIG += debug_and_releaseCONFIG(debug, debug|release) { unix: TARGET = $$join(TARGET,,,_debug) else: TARGET = $$join(TARGET,,,d)}TEMPLATE = libDEFINES += SHAREDLIB_LIBRARY1234567891011
TARGET
:指定库的名称TEMPLATE
:模板的意思,将其指定为 lib,是要告诉 qmake 我们需要生成的是一个库文件(app 为可执行程序)。DEFINES
:用于定义编译选项CONFIG
(新增部分):用于编译控制,区分Debug
和Release
版本的库名称(Debug
带d
,Release
不带)。
这里,同时出现了一个非常重要的文件 -{projectName}_global.h
,这是 Qt Creator 帮我们创建的,内容如下:
#ifndef SHAREDLIB_GLOBAL_H#define SHAREDLIB_GLOBAL_H#include <QtCore/qglobal.h>#if defined(SHAREDLIB_LIBRARY)# define SHAREDLIBSHARED_EXPORT Q_DECL_EXPORT#else# define SHAREDLIBSHARED_EXPORT Q_DECL_IMPORT#endif#endif // SHAREDLIB_GLOBAL_H123456789101112
为什么要自动创建这么一个文件呢?为了明确这一点,先来了解一些基本概念:
符号 - 函数、变量或类 - 包含在供客户端(例如:应用程序或其他库)使用的共享库中,必须以一种特殊的方式标记。这些符号被称为公共符号,它们被导出或公开可见。
在编译共享库时,必须将其标记为导出。为了在客户端使用共享库,一些平台可能需要一个特殊的导入声明。
为此,Qt 提供了两个特殊的宏:
Q_DECL_EXPORT
:当编译共享库时,必须将其添加到使用的符号声明。Q_DECL_IMPORT
:当编译一个(使用了该共享库)客户端时,必须将其添加到使用的符号声明。
所以,要确保正确的宏能够被调用(无论是编译共享库本身,还是在客户端使用共享库),通常通过添加一个特殊的头文件({projectName}_global.h
)来解决,这就是sharedlib_global.h
存在的原因。
生成共享库
可以看到,生成的库中只有一个简单的类定义。为了便于使用,为其添加一些简单的函数:
sharedlib.h
内容如下:
#ifndef SHAREDLIB_H#define SHAREDLIB_H#include "sharedlib_global.h"SHAREDLIBSHARED_EXPORT int subtract(int x, int y);class SHAREDLIBSHARED_EXPORT SharedLib{public: SharedLib(); int add(int x, int y);};#endif // SHAREDLIB_H123456789101112131415
sharedlib.cpp
内容如下:
#include "sharedlib.h"int subtract(int x, int y){ return x - y;}SharedLib::SharedLib(){}int SharedLib::add(int x, int y){ return x + y;}123456789101112131415
构建(不运行)项目,会生成相应的.lib
和.dll
文件。
注意:Debug
版本(带d
)为SharedLibd.lib
和SharedLibd.dll
,Release
版本(不带 d
)为SharedLib.lib
和SharedLib.dll
。
将应用程序与共享库链接
为了使用共享库,创建一个简单的客户端 - Qt Console Application,然后调用库中导出的符号,效果如下:
项目创建成功后,将刚才生成的共享库组织成以下结构:
SharedLibClient/
SharedLibClient.pro
main.cpp
3rdparty/
SharedLib/
include/
sharedlib_global.h
sharedlib.h
lib/
SharedLibd.lib
SharedLib.lib
一切准备就绪,到了最关键的时刻 - 添加和使用库:
右键项目 -> 添加库:
选择链接到的库类型,这里选“外部库”:
指定链接库和包含目录、平台等选项:
这时,.pro
中会自动添加以下代码:
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/3rdparty/SharedLib/lib/ -lSharedLibelse:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/3rdparty/SharedLib/lib/ -lSharedLibdINCLUDEPATH += $$PWD/3rdparty/SharedLib/includeDEPENDPATH += $$PWD/3rdparty/SharedLib/include12345
$$PWD
用于指定包含.pro
文件的目录的完整路径INCLUDEPATH
- 指定编译项目时应该被搜索的#include
目录LIBS
- 指定链接到项目中的库列表
开始测试,main.cpp
内容如下:
#include <QCoreApplication>#include <qDebug>#include "sharedlib.h"int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); // 测试库 SharedLib lib; qDebug() << lib.add(2, 3); qDebug() << subtract(5, 2); return a.exec();}12345678910111213141516
OK,运行程序,效果如上所示。
注意: 在运行程序时,需要将对应的dll
(Debug
为 SharedLibd.dll
,Release
为 SharedLib.dll
) 拷贝到和可执行程序同一级目录下,否则会出错。
- Qt之创建并使用共享库
- Qt之创建并使用共享库
- Qt 学习 第5节 Qt之创建并使用共享库
- Qt之创建并使用静态链接库
- Qt之静态链接库的创建并使用
- Qt之创建并使用静态链接库
- QT Creator使用共享库(一)创建共享库
- Qt创建共享库
- Linux 创建共享对象,共享库并安装使用共享库
- Qt中创建并运用动态链接库(共享库)的示例
- QT创建自己的动态库并使用
- QT创建自己的静态库并使用
- QT学习笔记(九):创建QT的共享库
- QT Creator使用共享库(二)使用共享库
- qt 创建共享内存举例
- QT共享内存使用
- Qt创建一个透明图像并修改之
- C++02:构建并使用共享库
- 橘子有多少瓣?
- springboot学习笔记(三)使用JDBC以及整合spring data jpa
- js遍历json中所有的键值对
- [ 1.309420] Freeing initrd memory: 484K 卡死问题解决办法
- 商品订单信息管理
- Qt之创建并使用共享库
- PLSQ连接oracle数据库的使用
- 代码规范 : 控制逻辑
- mysql解决datetime与timestamp精确到毫秒的问题
- [知了堂学习笔记] java基础回顾_01
- .Net 知识点链接转载(持续更新)
- markdown编辑器使用方法
- 北京SEO祭司:惊雷算法,刷点击的噩梦
- 组合属性动画的使用