Qt:如何使用Qt创建库并在应用程序中使用它

本教程说明了在Windows上的应用程序中使用自定义库的不同方法。第一部分说明了如何创建共享库以及如何在应用程序中链接共享库。第二部分是关于创建和使用静态库。

创建一个共享库

创建要链接的共享库时,需要确保在创建库时正确导出将在库外部使用的符号。当您链接到库时,随后导入。可以使用Q_DECL_EXPORT和Q_DECL_IMPORT来完成,如以下示例所示:

  • Q_DECL_EXPORT 必须在编译共享库时添加到使用的符号声明中。
  • Q_DECL_IMPORT 必须在编译使用共享库的客户端时添加到使用的符号声明中。

1、test.h

#include <QWidget>

#if defined MAKE_TEST_LIB
    #define TEST_LIB_EXPORT Q_DECL_EXPORT
#else
    #define TEST_LIB_EXPORT Q_DECL_IMPORT
#endif
    
class ​TEST_LIB_EXPORT Widget : public QWidget
{
   ​Q_OBJECT
public:Widget(QWidget *parent = nullptr);
};

2、test.cpp

#include "test.h"
#include <QtWidgets>

Widget::Widget(QWidget *parent) : QWidget(parent) {}

3、test.pro

TEMPLATE = lib
SOURCES += test.cpp
HEADERS += test.h
DEFINES += MAKE_TEST_LIB
QT += widgets
  • 在Windows上,MinGW将输出.a和.dll,MSVC将输出.lib和.dll。
  • 在Linux上,gcc / clang将输出.so,.so.1,.so.1.0和.so.1.0.0 - .lib

.a和.so是导入库。它们有助于将您的代码链接到库,并且在您构建文件(不是一直都是文件)时需要使用它们。

在应用程序中使用共享库

1、loadTestLib.pro

  • 需要在应用程序的.pro文件中通知应用程序在哪里可以找到标头和库
  • 您需要通过将.dll放在应用程序的目录或全局PATH中来确保找到该.dll
TEMPLATE = app
TARGET =
DEPENDPATH += . ../testLib
INCLUDEPATH += ../testLib
LIBS += -L../testLib/debug -ltestLib
#Input
SOURCES += main.cpp

2、main.cpp

#include "test.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.resize(100, 100);
    w.show();
    return a.exec();


}

或者,您可以在Qt Creator中右键单击您的项目,然后选择“添加库…”,选择“外部库”并浏览您的库文件:

对于在Windows中使用MSCV编译器编译的库,请查找.lib或.dll
在Windows上,MinGW编译的链接库位于.a中,但您需要手动添加(自Qt Creator 2.7起)。您也可以尝试直接链接.dll,因为它可能会起作用。不要尝试使用MSVC编译库。
在Linux上,您寻找.so文件
这会将以下代码附加到您的* .pro文件中:

ps:

  • INCLUDEPATH指定编译项目时应搜索的#include目录。
  • LIBS指定要链接到项目的库列表
Unix:LIBS + = -L /usr/local/lib -lmath
win32:LIBS + = c:/mylibs/math.lib
win32:LIBS + =“ C:/ mylibs / extra libs / extra.lib”
Unix:LIBS + =-L / home / user / extra libs” -lextra