简述
在 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 是导入库,它们有助于将我们的代码链接到库中,并且在构建文件时需要。
创建共享库
要创建一个共享库,需要执行以下几个步骤:
文件 -> 新建文件或项目,选择:Library -> C++ 库:
- 选择“共享库”,然后输入“名称”(这里以 SharedLib 为例),并选择“创建路径”:注意: “类型”下拉列表中有三个选项,分别是:共享库、静态链接库、Qt Plugin(Qt 插件)。
选择一个适当的“构建套件”
选择需要的模块(默认勾选“QtCore”,如果需要其他模块,请自行勾选。例- 如:界面需要依赖 QtWidgets)。
执行要创建的源码文件的基本信息(默认即可)
完成向导
项目文件
在项目创建完成之后,Qt Creator 会帮我们生成一系列相关文件,目录结构如下:
查看 .pro,并对其稍作修改:
TARGET = SharedLib
# 新增部分
CONFIG += debug_and_release
CONFIG(debug, debug|release) {
unix: TARGET = $join(TARGET,,,_debug)
else:
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_H
符号 - 函数、变量或类 - 包含在供客户端(例如:应用程序或其他库)使用的共享库中,必须以一种特殊的方式标记。这些符号被称为公共符号,它们被导出或公开可见。
在编译共享库时,必须将其标记为导出。为了在客户端使用共享库,一些平台可能需要一个特殊的导入声明。
为此,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_H
sharedlib.cpp 内容如下:
#include "sharedlib.h"
int subtract(int x, int y)
{
return x - y;
}
SharedLib::SharedLib()
{
}
int SharedLib::add(int x, int y)
{
return
构建(不运行)项目,会生成相应的 .lib 和 .dll 文件。
注意: Debug 版本(带 d)为 SharedLibd.lib 和 SharedLibd.dll,Release 版本(不带 d)为 SharedLib.lib 和 SharedLib.dll。
将应用程序与共享库链接
为了使用共享库,创建一个简单的客户端 - Qt Console Application,然后调用库中导出的符号,效果如下:
项目创建成功后,将刚才生成的共享库组织成以下结构:
一切准备就绪,到了最关键的时刻 - 添加和使用库:
右键项目 -> 添加库:
选择链接到的库类型,这里选“外部库”:
指定链接库和包含目录、平台等选项:
这时,.pro 中会自动添加以下代码:
win32:CONFIG(release, debug|release): LIBS += -L$PWD/3rdparty/SharedLib/lib/ -lSharedLib
else:win32:CONFIG(debug, debug|release): LIBS += -L$PWD/3rdparty/SharedLib/lib/ -lSharedLibd
INCLUDEPATH += $PWD/3rdparty/SharedLib/include
DEPENDPATH += $PWD/3rdparty/SharedLib/include
$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
OK,运行程序,效果如上所示。
注意: 在运行程序时,需要将对应的 dll(Debug 为 SharedLibd.dll,Release 为 SharedLib.dll) 拷贝到和可执行程序同一级目录下,否则会出错。
点击领取Qt学习资料+视频教程~
链接:http://docs.qq.com/doc/DUlVwTW1FZlZuWE9G
本文暂时没有评论,来添加一个吧(●'◡'●)