版权声明:本文为博主原创文章,未经博主允许不得转载。 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()){..}
实现
插件工程和测试工程整体如下:
实现-插件工程
- 创建一个c++动态库工程名为plus.
在plus.h 中添加如下函数
class PLUSSHARED_EXPORT Plus { public: Plus(); int f_add(int x,int y);//一个测试函数 }; //一个对外实例化接口 extern "C"{PLUSSHARED_EXPORT void getPlus(Plus*& p_plus);}
- 在plus.cpp 中实现这两个函数,其余不做修改
C++
int Plus::f_add(int x,int y){ return x + y ;}
void getPlus(Plus*& p_plus){p_plus = new Plus();}
- 插件工程至此完毕,编译后复制出插件工程的*.lib 和*.dll (MINGW 下是*.a) 复制到一个插件存放目录.
实现-测试工程
- 测试工程还是随意生成了一个QWidget Application。
pro文件中添加插件路径
INCLUDEPATH += $$PWD/../Public_lib LIBS += -L$$PWD/../Public_lib -lplus
在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; };
在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; }
- 编译后执行结果