04 QT创建和加载动态库-②显示加载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gang950502/article/details/74387830

显示加载与隐式加载的异同

  • 同:
    • 插件工程中要导出的函数和类在定义时依旧加***_EXPORT,以示可被外部调用
    • 调用工程的pro文件中依旧 要加 INCLUDEPATH和 LIBS(原本以为因为程序中动态调用所以不用加后来链接失败,所以还是得加)
  • 异:

    • 插件工程中函数要添加对外接口,类要添加对外实例化接口如:

      extern “C”{PLUSSHARED_EXPORT void getPlus(Plus*& p_plus);}

    • 调用工程中添加QLibrary 库加载

      
      #include <QLibrary>
      
      bool MainWindow::generate_plus(){
      QLibrary mylib("D:/workspace/Public_lib/plus.dll");
      if(mylib.load()){..}

    实现

    插件工程和测试工程整体如下:
    这里写图片描述

实现-插件工程

  1. 创建一个c++动态库工程名为plus.
  2. 在plus.h 中添加如下函数

    class PLUSSHARED_EXPORT Plus
    {
    
    public:
        Plus();
        int f_add(int x,int y);//一个测试函数
    };
    //一个对外实例化接口
    extern "C"{PLUSSHARED_EXPORT void getPlus(Plus*& p_plus);}
  3. 在plus.cpp 中实现这两个函数,其余不做修改
    C++
    int Plus::f_add(int x,int y){ return x + y ;}
    void getPlus(Plus*& p_plus){p_plus = new Plus();}
  4. 插件工程至此完毕,编译后复制出插件工程的*.lib 和*.dll (MINGW 下是*.a) 复制到一个插件存放目录.
    • 这里写图片描述

实现-测试工程

  1. 测试工程还是随意生成了一个QWidget Application。
  2. pro文件中添加插件路径

        INCLUDEPATH += $$PWD/../Public_lib  
    
        LIBS += -L$$PWD/../Public_lib -lplus
  3. 在MainWindow中添加如下定义

    
        #include <QMainWindow>
        #include "plus.h"
        /*增加一个函数指针对应在插件工程中的void getPlus(Plus*& p_plus)函数*/
        typedef void (*ty_getPlus)(Plus*&);
    
        namespace Ui {
        class MainWindow;
        }
    
        class MainWindow : public QMainWindow
        {
            Q_OBJECT
    
        public:
            explicit MainWindow(QWidget *parent = 0);
            ~MainWindow();
            bool generate_plus();
        private:
            Ui::MainWindow *ui;
            //增加一个对象指针
            Plus* myplus;
        };
  4. 在MainWindow.cpp 中添加调用实现。并将调用添加到构造函数。

    
    
    #include <QLibrary>
    
    bool MainWindow::generate_plus(){
        QLibrary mylib("D:/workspace/Public_lib/plus.dll");
        if(mylib.load()){
            ty_getPlus fp_getplus = (ty_getPlus)mylib.resolve("getPlus");
            if(fp_getplus){
                (fp_getplus)(myplus);
                if(myplus){
                    std::cout << "my plus func has load sucess and test f_add(55,88):"<<myplus->f_add(55,88)<<std::endl;
                }
                else{std::cout << "my getins has filed" << std::endl;return false;}
            }
            else{std::cout << "load getplus filed" <<std::endl;return false;}
        }
        else{std::cout << "load plus.dll filed"<<std::endl;return false;}
        return true;
    }
  5. 编译后执行结果
    • 这里写图片描述

猜你喜欢

转载自blog.csdn.net/gang950502/article/details/74387830
04