其实Qt下建立一个动态链接库是相对容易的,因为Qt Creator替我们准备好了动态链接库的项目模板。今天突然发现有个小朋友没有做过Qt的动态链接库,所以撰文记录希望可以帮到更多的同学。

代码库:mrchipset/qt-components

moRvVaXiMrmB7FimbshGn6uUskfgUwwMr5q6ckVVbq4.png
点击确认后选择下一步,在向导中选择共享库,选择对应的Qt模块

UZsad7ASHfUuST3xisAtq4zEbYQCDc6FGBauRD6FOqg.png

我们可以看到,IDE帮我们创建好了刚刚输入的类名源文件。仔细观察种店其实是FOOAPI_EXPORT的宏定义。

注意:后面新建的类,函数也需要增加FOOAPI_EXPORT这个宏定义

#ifndef FOOAPI_H
#define FOOAPI_H

#include "FooAPI_global.h"

class FOOAPI_EXPORT FooAPI
{
public:
    FooAPI();
};

#endif // FOOAPI_H

我们跟踪这个宏定义可以发现最终其实是两个编译器的指令关键字,从字面意思就能看出是操作动态链接库符号导入/导出的意思。

#ifndef FOOAPI_GLOBAL_H
#define FOOAPI_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(FOOAPI_LIBRARY)
#  define FOOAPI_EXPORT Q_DECL_EXPORT
#else
#  define FOOAPI_EXPORT Q_DECL_IMPORT
#endif

#endif // FOOAPI_GLOBAL_H
#  define Q_DECL_EXPORT __declspec(dllexport)
#  define Q_DECL_IMPORT __declspec(dllimport)

我们随便写一个输出调试信息和求和的接口,然后在一个可执行文件中导入刚刚制作的动态链接库。

在调用对应动态链接库的时候,需要增加对应的qmake配置

INCLUDEPATH += ../dynamic_libraries/FooAPI
LIBS += -L$$DESTDIR -lFooAPI

不出意外的话效果如下,如果出意外也很正常,多搜索多尝试。实在不行请联系小虎。

image

#include "FooAPI.h"

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

    FooAPI foo;
    foo.foo();
    qDebug() << "3 + 5 = " << foo.sum(3, 5);
    return a.exec();
}