• Qt创建使用动态链接库工程(转)


    目录

    1、建立并生成动态链接库

    2、测试生成的DLL

    验证环境:ubuntu18.04+Qt5.14

    验证内容:导出类,导出函数带参数/不带参数的函数。

    1、建立并生成动态链接库
    1、打开QtCreator,新建工程,我们选择Library,C++库,然后就是choose。

    2、然后在弹出的C++库对话框我们默认类型共享库,名称为MyDll。然后,一直下一步,直到点击完成。

    3、生成的代码结构

    MyDll.pro

    QT -= gui # 不需要界面

    TARGET = MyDll #工程名
    TEMPLATE = lib # 生成lib

    DEFINES += MYDLL_LIBRARY # 预定义宏
    DEFINES += QT_DEPRECATED_WARNINGS

    SOURCES += \
    mydll.cpp

    HEADERS += \
    mydll.h \
    mydll_global.h

    unix {
    target.path = /usr/lib
    INSTALLS += target
    }

    mydll_global.h中,内容如下:

    #ifndef MYDLL_GLOBAL_H
    #define MYDLL_GLOBAL_H

    #include <QtCore/qglobal.h>

    #if defined(MYDLL_LIBRARY)
    # define MYDLLSHARED_EXPORT Q_DECL_EXPORT
    #else
    # define MYDLLSHARED_EXPORT Q_DECL_IMPORT
    #endif

    #endif // MYDLL_GLOBAL_H
    可以看到系统自动定义了两个宏。用于声明哪些函数是需要我们导出的。

    4、导出类,导出函数

    首先我们在mydll.h中添加几行代码,如下图。注意:extern "C" MYDLLSHARED_EXPORT必须要有。

    #ifndef MYDLL_H
    #define MYDLL_H
    #include mydll_global.h

    class MYDLLSHARED_EXPORT MyDll
    {
    public:
    MyDll();
    virtual int sub(int a, int b);
    };

    extern C MYDLLSHARED_EXPORT void sayHello(); # 导出无参函数
    extern C MYDLLSHARED_EXPORT int add(int a, int b); # 导出带参函数

    extern C MYDLLSHARED_EXPORT MyDll *getMyDll(); # 导出类接口
    #endif // MYDLL_H

    mydll.cpp中的实现代码如下:

    #include mydll.h
    #include <iostream>

    MyDll::MyDll()
    {
    }

    int MyDll::sub(int a, int b)
    {
    return a-b;
    }

    void sayHello()
    {
    std::cout<<hello!<<std::endl;
    }

    int add(int a, int b)
    {
    return a+b;
    }

    MyDll * getMyDll()
    {
    return new MyDll();
    }

    代码编写完毕后,我们直接构建就行了。然后就可以看到我们生成的动态库了。

    2、测试生成的DLL
    1、新建一个基于Qt的控制台应用程序,名称为DllTest,与MyDll放在同一级目录下。

    2、建好了以后,就可以进行调用验证了。

    调用编译好的动态库需要引用两个东西:动态库的头文件和动态库文件。

    1)在.pro中添加对Lib的引用

    LIBS += ../build-MyDll-unknown-Release/mydll.o
    2)在引用文件中,添加头文件的引用

    #include ../MyDll/mydll.h
    main.cpp调用完整代码:

    #include <QCoreApplication>
    #include <QLibrary>
    #include <iostream>
    #include ../MyDll/mydll.h

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

    sayHello();
    int c = add(1, 2);
    std::cout<<add(1,2) = << c << std::endl;
    MyDll *mydll = getMyDll();
    int d = mydll->sub(2,1);
    std::cout<<mydll->sub(2,1) = << d << std::endl;

    return a.exec();
    }

    输出结果:


    ————————————————
    版权声明:本文为CSDN博主「alex1801」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_34910922/article/details/111185787

  • 相关阅读:
    svn git 共存
    如何写软件设计文档
    spring boot requestbody string to date
    asp.net core 1.1 publish to a linux
    asp.net core 1.1 entityframework mysql
    [FPGA]記錄一些不錯的網站推薦給大家參考。
    [FPGA][DE0] Qsys 加入 FLASH 記憶體 方法及步驟
    [FPGA][Nios][DP83848] 網路開發筆記-軟體篇(1)
    [Nios][UART] 使用UART 的一些問題?
    [Nios][Eclipse] find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer
  • 原文地址:https://www.cnblogs.com/xihong2014/p/16517769.html
Copyright © 2020-2023  润新知