问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Qt静态链接库入门指南:从创建到使用

创作时间:
作者:
@小白创作中心

Qt静态链接库入门指南:从创建到使用

引用
CSDN
9
来源
1.
https://blog.csdn.net/Superman___007/article/details/116855359
2.
https://blog.csdn.net/ACK_ACK/article/details/138301689
3.
https://cloud.baidu.com/article/3319045
4.
https://blog.csdn.net/qq_43689451/article/details/140406490
5.
https://blog.csdn.net/nn_84/article/details/136104836
6.
https://blog.csdn.net/qq_48597462/article/details/141920909
7.
https://www.cnblogs.com/xy0797/p/18372635
8.
https://www.cnblogs.com/Dir-A/p/18278796
9.
https://doc.embedfire.com/linux/rk356x/Qt/zh/latest/lubancat_qt/install/introduce.html

在Qt开发中,静态库是一种非常实用的组件,它可以帮助我们更好地组织代码、提高程序的可维护性。本文将从静态库的基本概念入手,详细介绍如何在Qt Creator中创建和使用静态库。

01

什么是静态库

静态库(Static Library)是一个外部函数与变量的集合体。在编译期间,由编译器和连接器将静态库集成到应用程序中,制作成目标文件以及可以独立运作的可执行文件。静态库的特点是在编译时就与应用程序链接在一起,因此运行时不需要额外的库加载步骤。

静态库的主要优点包括:

  • 独立性:静态库与应用程序集成在一起,分发时无需额外的库文件
  • 性能优势:由于静态库的代码在编译时就被嵌入到可执行文件中,运行时不需要额外的库加载步骤,因此可能会有轻微的性能优势
  • 易于维护:对于小型项目或封闭环境,静态库的使用和维护相对简单
02

创建静态库

在Qt Creator中创建静态库的步骤如下:

  1. 新建项目:打开Qt Creator,选择“文件”->“新建文件或项目”,然后选择“库”->“C++库”,点击“选择”。

  2. 配置项目:在“新建C++库项目”对话框中,输入项目名称(例如StaticLib),选择保存位置,然后点击“下一步”。

  3. 选择类型:在“选择C++库类型”对话框中,选择“静态链接库”,然后点击“下一步”。

  4. 配置细节:在“配置项目”对话框中,选择所需的套件,然后点击“完成”。

创建完成后,Qt Creator会自动生成相关的文件。与共享库不同,静态库项目不会生成{projectName}_global.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 += staticlib

其中,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)。

03

使用静态库

创建静态库后,我们可以在其他项目中使用它。下面是一个简单的示例:

  1. 新建客户端项目:创建一个新的Qt控制台应用程序项目(例如StaticLibClient)。

  2. 组织文件结构:将生成的静态链接库组织成以下结构:

StaticLibClient (工程文件夹)
|
|___StaticLibClient.pro
|
|___main.cpp
|
|___3rdparty (文件夹)
    |
    |___StaticLib (文件夹)
        |   
        |___include (文件夹)
        |   |___staticlib.h
        |
        |___lib (文件夹)
            |___StaticLibd.lib
            |___StaticLib.lib
  1. 添加库:在Qt Creator中,右键点击项目根节点,选择“添加库”,然后选择“静态”。按照提示选择相应的.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.lib

其中,INCLUDEPATH指向头文件所在目录,LIBS变量指向.lib文件。此外,还有一个PRE_TARGETDEPS变量,用于列出目标所依赖的库,这对于显式列出相关的静态库很有用。

  1. 测试:在main.cpp中使用静态库中的函数:
#include <QCoreApplication>
#include "staticlib.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    StaticLib lib;
    qDebug() << "1 + 2 = " << lib.add(1, 2);
    qDebug() << "5 - 3 = " << subtract(5, 3);

    return a.exec();
}

构建并运行项目,如果一切正常,你将看到控制台输出正确的计算结果。

04

常见问题及解决方案

在使用静态库的过程中,可能会遇到一些问题,以下是一些常见的解决方案:

  1. 找不到静态库文件:确保你的静态库文件路径正确,并且在项目配置中包含了这些路径。

  2. 链接错误:检查是否所有依赖的静态库都已正确包含。

  3. 运行时错误:静态编译的应用程序可能依赖于特定版本的操作系统库。确保目标系统上的库版本与编译时的版本兼容。

通过以上步骤,你应该能够成功创建和使用Qt静态库。静态库的使用虽然会增加可执行文件的大小,但能提高程序的独立性和易用性,特别适合用于开发需要独立运行的程序或在封闭环境中使用的应用程序。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号