软件版本:QT5.12.0 + Qt Creator4.8.0
动态链接
动态链接库又叫"共享库",即sharedLib。
Qt Creator中新建项目,选择"Library"->"C++ 库"
![](https://img-blog.csdnimg.cn/img_convert/26001e7b9153920b1b1a97f424239383.png)
选择"共享库",选择位置,输入名称:QtSharedLib
![](https://img-blog.csdnimg.cn/img_convert/5bc3616e356cab3cbfef4f1b8673bf04.png)
选择MinGW构建,一直默认到完成即可!
最终生成如下文件:
![](https://img-blog.csdnimg.cn/img_convert/2ab52fd6b98b6ee8735215f1b0972030.png)
完善导出类和导出函数:
![](https://img-blog.csdnimg.cn/img_convert/9b37a023eb7fdf6793678819eaf9e50c.png)
编译链接最终生成文件:
![](https://img-blog.csdnimg.cn/img_convert/a30254a983c2ad7434160f2d4d0f4444.png)
其中.a是导入库,相当于Windows下的lib文件,.dll是共享库文件,相当于Windows下的dll文件,.o是目标文件,相当于Windows下的obj文件。
共享库的调用:
1)、使用QLibrary显式链接,需要将dll与exe放在一起
新建Qt Console应用程序,代码如下:
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | | #include <QCoreApplication> #include <QLibrary> #include <QDebug> #include "QtStaticLib.h"
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
// 声明函数指针 typedef int (*Add)(int a, int b); typedef int (*Sub)(int a, int b); typedef int (*Mul)(int a, int b); typedef int (*Div)(int a, int b);
// 显式链接 QLibrary mylib("QtSharedLib.dll"); if(!mylib.load()) { // 加载 dll 失败 qDebug() << "Load QtSharedLib.dll failed!"; return -1; }
// 需要知道有哪些导出函数,可通过depends.exe查看 Add add = (Add)mylib.resolve("add"); Sub sub = (Sub)mylib.resolve("subtraction"); Mul mul = (Mul)mylib.resolve("multiplication"); Div div = (Div)mylib.resolve("division"); if(nullptr == add) { qDebug() << "Load function add failed!"; return -1; } if(nullptr == sub) { qDebug() << "Load function sub failed!"; return -1; } if(nullptr == mul) { qDebug() << "Load function mul failed!"; return -1; } if(nullptr == div) { qDebug() << "Load function div failed!"; return -1; }
// 调用函数 qDebug() << add(1, 2); qDebug() << sub(6, 2); qDebug() << mul(3, 2); qDebug() << div(8, 2);
return a.exec(); } |
2)、使用隐式链接
新建Qt Widget应用程序:
将QtSharedLib工程源码目录下的 QtSharedLib.h、QtSharedLib_global.h和QtSharedLib.a复制到该工程源码目录下,将 QtSharedLib.dll 文件复制到生成exe所在目录中。
添加.a文件时,可在工程上右键,在弹出的菜单中选择"添加库…"
![](https://img-blog.csdnimg.cn/img_convert/af90bddc4b24f35616283d75b28cec2a.png)
最后自动在pro文件中加入库链接:
![](https://img-blog.csdnimg.cn/img_convert/5878b7f3b132804611520069508d6494.png)
主函数调用:
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | | # include "Widget.h" # include < QApplication > # include "QtSharedLib.h"
int main(int argc, char * argv[]) { QApplication a(argc, argv);
// Widget w; // w.show();
QtSharedLib sharedLib; sharedLib.showMessage();
return a.exec(); } |
输出showMessage实现的打印信息:
![](https://img-blog.csdnimg.cn/img_convert/43394e0498afacaca97bd848bcc72967.png)
静态链接
Qt Creator中新建项目,选择"Library"->"C++ 库"
![](https://img-blog.csdnimg.cn/img_convert/2c2695048a212b450e961f92a65bd36f.png)
选择"静态链接库",选择位置,输入名称:QtStaticLib
![](https://img-blog.csdnimg.cn/img_convert/7c926214bc1880d762761493dd6acb0a.png)
选择MinGW构建,一直默认到完成即可!
完善静态库代码
![](https://img-blog.csdnimg.cn/img_convert/389e009e05a5612cd72d7aaa4d15938c.png)
编译生成静态库文件:只有.a和.o文件
![](https://img-blog.csdnimg.cn/img_convert/ac68fef043de3be2efdeeb805139422a.png)
静态库的调用
这里使用隐式链接的方法:
继续使用前面的Console应用程序,将静态库的.a文件以及.h文件拷贝到工程源码目录下,是"添加库…"操作将库配置写入pro文件
![](https://img-blog.csdnimg.cn/img_convert/48dd883d005fbb2305ca68a856ae48c5.png)
输出showMessage实现的打印信息:
![](https://img-blog.csdnimg.cn/img_convert/f59001a8ce53cad0c60503799c63dd6d.png)