Qt创建并使用静态链接库(.lib .a)

Qt之创建并使用静态链接库
静态链接库(Statically-linked library),或称静态库,是一个外部函数与变量的集合体。静态库的文件内容,通常包含一堆程序员自定的变量与函数,其内容不像动态链接库那么复杂,在编译期间由编译器与连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件。而这个可执行文件与编译可执行文件的程序,都是一种程序的静态创建(static build)。以过去的观点来说,库只能算是静态(static)类型。

创建静态链接库

创建静态链接库的步骤和共享库基本相同,唯一的区别是【类型】需要选择“静态链接库”:

这里,将项目名称命名为 StaticLib 

项目文件

在项目创建完成之后,Qt Creator 会自动生成相关的文件,目录结构如下:

与共享库不同,这里并没有出现了一个名为 {projectName}_global.h 的文件,Why?这是因为静态链接库将被内置到应用程序中,所以无需在 .h 文件中设置导出和导入符号的特殊功能。

查看 .pro,并对其稍作修改:

TARGET = StaticLib
​
# 新增部分
CONFIG += debug_and_release
CONFIG(debug, debug|release) {
    unix: TARGET = $$join(TARGET,,,_debug)
    else: TARGET = $$join(TARGET,,,d)
}
​
TEMPLATE = lib
CONFIG += staticlib1234567891011

与共享库的另一个不同之处在于:这里多了一个 CONFIG 选项,其值为 staticlib。没错,这正是要告诉 qmake,我们需要生成的是一个静态链接库。

生成静态链接库

可以看到,生成的库中只有一个简单的类定义,对其稍作修改。

staticlib.h 内容如下:

#ifndef STATICLIB_H
#define STATICLIB_H
​
int subtract(int x, int y);
​
class StaticLib
{
public:
    StaticLib();
    int add(int x, int y);
};
​
#endif

staticlib.cpp 内容如下:

#include "staticlib.h"
​
int subtract(int x, int y)
{
    return x - y;
}
​
StaticLib::StaticLib()
{
}
​
int StaticLib::add(int x, int y)
{
    return x + y;
}

构建(不运行)项目,会生成相应的 .lib 文件。

注意: Debug 版本为 StaticLibd.lib(带 d),Release 版本为 StaticLib.lib(不带 d)。

使用静态链接库

创建一个简单的客户端 - Qt Console Application,并使用静态链接库,效果如下:

项目创建成功后,将刚才生成的静态链接库组织成以下结构:

StaticLibClient (工程文件夹)
|
|___StaticLibClient.pro
|
|___main.cpp
|
|___3rdparty (文件夹)
	|
	|___StaticLib (文件夹)
	    |	
	    |___include (文件夹)
	    |	|___staticlib.h
	    |
	    |___lib (文件夹)
	    	|___StaticLibd.lib
	    	|___StaticLib.lib

 

静态链接库的使用方式和共享库类似,不同的是这里将【链接】选择为“静态”(添加库是在工程的根节点,右键添加库):

这时,.pro 中会自动添加以下代码:

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/3rdparty/StaticLib/lib/ -lStaticLib
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/3rdparty/StaticLib/lib/ -lStaticLibd
​
INCLUDEPATH += $$PWD/3rdparty/StaticLib/include
DEPENDPATH += $$PWD/3rdparty/StaticLib/include
​
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/3rdparty/StaticLib/lib/libStaticLib.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/3rdparty/StaticLib/lib/libStaticLibd.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/3rdparty/StaticLib/lib/StaticLib.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/3rdparty/StaticLib/lib/StaticLibd.lib12345678910

类似于为共享库加载所做的工作,需要将 INCLUDEPATH 指向头文件所在目录,并将 LIBS 变量指向 .lib 文件。但是,这里多了一个变量 - PRE_TARGETDEPS,它用于列出目标所依赖的库,尤其是对于显式列出相关的静态库很有用。

建议: 如果使用静态链接库,应该始终同时使用 LIBS 和 PRE_TARGETDEPS

开始测试,main.cpp 内容如下:

#include <QCoreApplication>
#include <qDebug>
#include "staticlib.h"
​
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
​
    // 测试库
    StaticLib lib;
    qDebug() << lib.add(2, 3);
​
    qDebug() << subtract(5, 2);
​
    return a.exec();
}

OK,运行程序,效果如上所示。

选择哪种方式

目前为止,介绍了两种库 - 共享库和静态链接库,但是分享了三种使用方式。

到底如何选择?这完全取决于你的需要。

  • 在创建共享库时,需要将其部署到应用程序中。从好的方面来说,与共享库相关联的应用程序和库很小。

  • 是否要使用 QLibrary 在运行时加载 .dll,取决于是否访问了 .h 头文件和 .lib 文件。如果无法访问这些文件,那么 QLibrary 是另一种选择。

  • 静态链接会生成一个独立的可执行文件,这样做的好处是只需要部署几个文件,缺点是可执行文件很大。

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的示例,演示如何在 Qt 中编写一个静态库,并在另一个项目中使用它。 1. 创建一个新的 Qt 库项目 打开 Qt Creator,选择 “文件” -> “新建文件或项目”,在 “应用程序和库” 类别下选择 “Qt 库” 项目模板,然后按照向导的指示创建一个新的 Qt 库项目。在本例中,我们将项目命名为 “MyLib”。 2. 编写库代码 在 “MyLib” 项目中,打开 “mylib.h” 文件并添加以下代码: ```cpp #ifndef MYLIB_H #define MYLIB_H class MyLib { public: static int add(int a, int b); }; #endif // MYLIB_H ``` 然后在 “mylib.cpp” 文件中实现 `MyLib::add()` 方法: ```cpp #include "mylib.h" int MyLib::add(int a, int b) { return a + b; } ``` 3. 构建库 在 Qt Creator 中,选择 “构建” -> “构建解决方案”(或者按下快捷键 Ctrl + B)来构建库。构建完成后,将在 “MyLib” 项目目录下的 “libMyLib.a” 或 “MyLib.lib” 文件中找到生成的静态库。 4. 创建一个新的 Qt 控制台应用程序项目 选择 “文件” -> “新建文件或项目”,在 “应用程序和库” 类别下选择 “Qt 控制台应用程序” 项目模板,然后按照向导的指示创建一个新的 Qt 控制台应用程序项目。在本例中,我们将项目命名为 “MyApp”。 5. 配置项目 打开 “MyApp.pro” 文件,添加以下行: ``` INCLUDEPATH += $$PWD/../MyLib LIBS += -L$$PWD/../MyLib -lMyLib ``` 这些行会告诉 Qt 编译器在编译 “MyApp” 项目时在 “MyLib” 项目的头文件目录中查找头文件,并在链接使用 “MyLib静态库。 6. 编写代码并测试 打开 “main.cpp” 文件,并添加以下代码: ```cpp #include <QCoreApplication> #include "mylib.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); int sum = MyLib::add(1, 2); qDebug() << "1 + 2 =" << sum; return a.exec(); } ``` 这里,我们调用了 `MyLib::add()` 方法来计算 1 和 2 的和,并使用 `qDebug()` 输出结果。 然后按下 F5 键来构建并运行项目。如果一切正常,控制台应用程序将会输出 “1 + 2 = 3” 的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值