Qt 创建并使用dll及踩坑

今天终于解决如何使用动态库的方法:

  1. 首先我们先建立一个库文件:
Qt 创建并使用dll及踩坑


Qt 创建并使用dll及踩坑


你可以选择更换库名,像我一样把它改为calculate,点击下一步:
Qt 创建并使用dll及踩坑


点击下一步,然后选择你的动态库所需要的模块,我选择了如下图:
Qt 创建并使用dll及踩坑



再选择下一步:
Qt 创建并使用dll及踩坑




再点击下一步,选择完成:

Qt 创建并使用dll及踩坑

你就会看到了:

Qt 创建并使用dll及踩坑


然后将calculate_glbbal.h中的如下图红色框里的代码复制到calculate.h里,并将calculate_glbbal.h头文件删除:

Qt 创建并使用dll及踩坑


可以编辑属于自己的代码了:

Qt 创建并使用dll及踩坑


Qt 创建并使用dll及踩坑

点击构建里的qmake,然后重新构建时,你会遇到如下问题:
Qt 创建并使用dll及踩坑

原来我在calculate.h文件少添加红色库里的语句:

Qt 创建并使用dll及踩坑


重新执行构建里qmake和重新构建,就会遇到如下图,我可以不管它:
Qt 创建并使用dll及踩坑



动态库基本构建好了,接下来我就要使用动态库了,有基础的小伙伴们就可以新建一个工程(写给刚刚接触QT的人):
Qt 创建并使用dll及踩坑

下图所示的是:可以修改默认的名称


Qt 创建并使用dll及踩坑


Qt 创建并使用dll及踩坑


下图所示的你可以选择的类名的地方:


Qt 创建并使用dll及踩坑

Qt 创建并使用dll及踩坑

你点击完成看到的一个界面:
Qt 创建并使用dll及踩坑


然后请在建立动态库的地方查找,点击它:
Qt 创建并使用dll及踩坑

然后打开debug,(有时可能在release里,关键在于Qt 创建并使用dll及踩坑选择了debug还是release)
Qt 创建并使用dll及踩坑

将.dll 和 .lib 复制到 result文件里
Qt 创建并使用dll及踩坑
Qt 创建并使用dll及踩坑

也将calculate里的calculate.h复制
Qt 创建并使用dll及踩坑
复制到result文件里
Qt 创建并使用dll及踩坑

接下来进入我被别人坑死的步骤:错误,可以跳过:


首先在result.pro 添加横线的语句:

Qt 创建并使用dll及踩坑


正确的步骤:首先右击头文件,添加现有文件,选择calculate.h,添加横线的语句,
Qt 创建并使用dll及踩坑


Qt 创建并使用dll及踩坑


然后执行qmake 和构建,你会遇到:
Qt 创建并使用dll及踩坑


在百度里你可能会找到正确的答案,但是你已经被坑几次了,像我一样,说起来就是一把辛酸泪啊!


接下来告诉你正确的打开的方式:


请将result的红框的内容复制到built_result里debug里
Qt 创建并使用dll及踩坑

Qt 创建并使用dll及踩坑

Qt 创建并使用dll及踩坑

粘贴

Qt 创建并使用dll及踩坑

然后右击result文件,选择添加库
Qt 创建并使用dll及踩坑

Qt 创建并使用dll及踩坑Qt 创建并使用dll及踩坑


Qt 创建并使用dll及踩坑


Qt 创建并使用dll及踩坑






Qt 创建并使用dll及踩坑


如果你不删除红框里的,你会遇到E:\qt\build-result-Desktop_Qt_5_7_0_MSVC2015_64bit-Debug\debug\calculate.dll:-1: error: LNK1107: 文件无效或损坏: 无法在 0x378 处读取


Qt 创建并使用dll及踩坑




只有删除后你才能正常的使用
Qt 创建并使用dll及踩坑


如果你还有少许程序异常:



Qt 创建并使用dll及踩坑



注意:


QT坑人一大亮点:如果你在构建过程中出现问题,你重新修改后确定没有错误的前提下,再运行可能还是相同的错误,那么你需要

清除----------重新执行qmake------重新构建






编译出现问题: 编译Qt程序使用动态库时,报错 error: LNK1107: 文件无效或损坏: 无法在 0x310 处读取

原因
链接时,使用的dll,而不是lib。
lib是编译时需要的,dll是运行时需要的。

windows下动态库和静态库
动态库:生成动态库时,除了生成dll还有与之对应的lib,在这里lib不是静态库而是编译时动态链接库的导入库。因此编译时需要dll和lib;运行时需要dll

静态库:只有一个lib库,编译时需要,lib被编译到程序中,因此运行时,不再需要