zoukankan      html  css  js  c++  java
  • Qt 共享库(动态链接库)和静态链接库的创建及调用

    前言: 编译器 Qt Creator, 系统环境 win7 64 位

    1.创建共享库:

    新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sharedlib)

    生成的目录结构如图:

    修改 sharedlib.h 中的代码:

    // sharedlib.h
    #ifndef SHAREDLIB_H
    #define SHAREDLIB_H
    
    #include "sharedlib_global.h"
    
    class SHAREDLIBSHARED_EXPORT Sharedlib// 导出类, 客户端可直接加载
    {
    
    public:
        Sharedlib();
        void test();
    };
    
    extern "C" Q_DECL_EXPORT int add(int a, int b);//导出函数, 客户端可用 QLibrary 加载
    
    #endif // SHAREDLIB_H

    修改 sharedlib.cpp 中的代码:

    // sharedlib.cpp
    #include "sharedlib.h"
    
    #include <QMessageBox>
    
    
    Sharedlib::Sharedlib()
    {
    }
    
    void Sharedlib::test()
    {
        QMessageBox::warning(0, "Sharedlib::test", "Sharedlib::test");
    }
    
    int add(int a, int b)
    {
        return a+b;
    }

    2.调用共享库(方式一):

    新建文件或项目->选择 Application, Qt Console Application->项目名为 app1->下一步

    修改客户端程序 main.cpp 中的代码:

    // main.cpp
    #include <QCoreApplication>
    #include <QLibrary>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        typedef int (*Add)(int a, int b);
    
        QLibrary mylib("sharedlib.dll");
    
        if(!mylib.load()){// 加载 dll 失败
            cout<<"加载 sharedlib.dll 失败!"<<endl;
            return -1;
        }
        Add add = (Add)mylib.resolve("add");
        if(0 == add){// 加载失败
            cout<<"加载函数 add 失败!"<<endl;
            return -1;
        }
    
        int sum = add(1,2);// 调用 add 函数
    
        cout<<sum<<endl;
    
        return 0;
    
        return a.exec();
    }

    编译 sharedlib 工程和 app1 工程-> 将生成的 sharedlib.dll 文件复制到 app1.exe 所在目录中->运行 app1.exe 输出 3

    总结:这种调用方式需要在客户端程序编译时需要提供 .dll 的名字信息及其函数信息, 需要在客户端程序运行时提供 .dll 文件, 客户端中要写的代码较多.

    3.调用共享库(方式二):

    新建文件或项目->选择 Application, Qt QWidgets Application->项目名为 app2->下一步

    在 app2.pro 文件最后添加如下代码, 用来说明 sharedlib.lib 的路径信息:

    unix|win32: LIBS += -L$$PWD/../build-sharedlib-unknown-Debug/debug/ -lsharedlib
    
    INCLUDEPATH += $$PWD/../build-sharedlib-unknown-Debug/debug
    DEPENDPATH += $$PWD/../build-sharedlib-unknown-Debug/debug

    将 sharedlib 工程源码目录下的 sharedlib.h 和 sharedlib_global.h 头文件复制到 app2 工程源码目录下, 将 sharedlib.dll 文件复制到 app2.exe 所在目录中

    修改客户端程序 main.cpp 中的代码:

    // main.cpp
    #include "mainwindow.h"
    #include <QApplication>
    #include "sharedlib.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    //    MainWindow w;
    //    w.show();
        Sharedlib sb;
        sb.test();
    
        return a.exec();
    }

    编译 app2 工程, 运行 app2.exe, 弹出如图对话框, 表示程序正确执行:

    总结: 这种调用方式需要在客户端程序编译时提供 .lib 和 .h 文件, 需要在客户端程序运行时提供 .dll 文件,  客户端中要写的代码较少.

    4.方式一和方式二调用共享库的异同点:

    客户端程序运行时都是只需要 .dll 文件; 编译时有些差别, 方式一代码较多, 但无需 .lib 和 .h 文件, 方式二代码简单(和调用普通类一样), 但是需要 .lib 和 .h 文件.

    创建好三个项目后的文件结构如图:

    5. 静态链接库的创建:

    新建文件或项目->选择 Library 和 c++ 库->选择静态链接库->下一步(工程名为 staticdlib)

    修改 staticlib.h 中的代码:

    // staticlib.h
    #ifndef STATICLIB_H
    #define STATICLIB_H
    
    
    class Staticlib
    {
    
    public:
        Staticlib();
        void test();
    };
    
    #endif // STATICLIB_H

    修改 staticlib.cpp 中的代码:

    // staticlib.cpp
    #include "staticlib.h"
    #include <iostream>
    using namespace std;
    
    Staticlib::Staticlib()
    {
        cout<<"Staticlib::Staticlib"<<endl;
    }
    
    void Staticlib::test()
    {
        cout<<"Staticlib::test"<<endl;
    }

    编译工程之后会生成 staticlib.lib 文件

    6. 调用静态链接库:

    新建文件或项目->选择 Application, Qt Console Application->项目名为 app->下一步

    在 app.pro 文件最后添加如下代码, 用来说明 staticlib.lib 的路径信息:

    unix|win32: LIBS += -L$$PWD/../build-staticlib-unknown-Debug/debug/ -lstaticlib
    
    INCLUDEPATH += $$PWD/../build-staticlib-unknown-Debug/debug
    DEPENDPATH += $$PWD/../build-staticlib-unknown-Debug/debug

    将 staticlib 工程目录下的 staticlib.h 复制到 app 工程目录下

    修改客户端程序 main.cpp 中的代码:

    // main.cpp
    #include <QCoreApplication>
    #include "staticlib.h"
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        Staticlib sb;
        sb.test();
    
        return a.exec();
    }

    编译 app 工程, 生成 app.exe 文件, 运行 app.exe 文件, 输出如图:

    总结: 客户端程序编译时需要 .h 和 .lib 文件, 运行时无需其它文件.

    7. 共享库(动态链接库)和静态链接库的异同点:

    异: 调用共享库的客户端运行时需要 .dll 文件, 静态链接库的不需要;

          库程序发生改变时, 共享库客户端只需更新 .dll 文件, 静态链接库客户端需要重新编译.

    同: 都可用于多模块共同开发程序

     注: 本文是原创文章, 欢迎咨询或提出修改意见, 联系方式QQ:1871046323@qq.com

    源码地址: https://github.com/ZhangShuaiH/QT/tree/master/demos/lib

  • 相关阅读:
    为html瘦身的pythonl函数
    python字符编码演示三则
    爬虫任务队列方案以及性能测试
    从一道动态规划到卡特兰数
    LeetCode 24 JAVA
    链表笔记
    KMP 算法
    LeetCode 有效数独 JAVA
    Leetcode 139 单词拆分 JAVA
    Leetcode 845 数组的山脉 JAVA
  • 原文地址:https://www.cnblogs.com/woxinfeixiang2015/p/8334112.html
Copyright © 2011-2022 走看看