本教程说明了在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