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

  1. 首先我们先建立一个库文件:



qt 添加resource_QT






qt 添加resource_QT_02





你可以选择更换库名,像我一样把它改为calculate,点击下一步:



qt 添加resource_qt 添加resource_03





点击下一步,然后选择你的动态库所需要的模块,我选择了如下图:



qt 添加resource_动态库_04






再选择下一步:



qt 添加resource_动态库_05







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




qt 添加resource_动态库_06




你就会看到了:




qt 添加resource_动态库_07





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




qt 添加resource_动态库_08





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




qt 添加resource_qt 添加resource_09






qt 添加resource_动态库_10




点击构建里的qmake,然后重新构建时,你会遇到如下问题:



qt 添加resource_qt 添加resource_11




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




qt 添加resource_qt 添加resource_12





重新执行构建里qmake和重新构建,就会遇到如下图,我可以不管它:



qt 添加resource_静态库_13






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



qt 添加resource_QT_14




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





qt 添加resource_动态库_15






qt 添加resource_动态库_16





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





qt 添加resource_qt 添加resource_17





qt 添加resource_静态库_18




你点击完成看到的一个界面:



qt 添加resource_qt 添加resource_19





然后请在建立动态库的地方查找,点击它:



qt 添加resource_QT_20




然后打开debug,(有时可能在release里,关键在于

qt 添加resource_静态库_21

选择了debug还是release)



qt 添加resource_静态库_22




将.dll 和 .lib 复制到 result文件里



qt 添加resource_静态库_23




qt 添加resource_动态库_24




也将calculate里的calculate.h复制



qt 添加resource_静态库_25



复制到result文件里



qt 添加resource_静态库_26




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



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




qt 添加resource_动态库_27





正确的步骤:首先右击头文件,添加现有文件,选择calculate.h,添加横线的语句,



qt 添加resource_QT_28






qt 添加resource_动态库_29





然后执行qmake 和构建,你会遇到:



qt 添加resource_动态库_30





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




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




请将result的红框的内容复制到built_result里debug里



qt 添加resource_qt 添加resource_31





qt 添加resource_qt 添加resource_32



qt 添加resource_动态库_33

粘贴



qt 添加resource_qt 添加resource_34




然后右击result文件,选择添加库



qt 添加resource_QT_35





qt 添加resource_QT_36

qt 添加resource_静态库_37






qt 添加resource_qt 添加resource_38






qt 添加resource_静态库_39










qt 添加resource_动态库_40





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





qt 添加resource_qt 添加resource_41







只有删除后你才能正常的使用



qt 添加resource_静态库_42





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






qt 添加resource_动态库_43






注意:



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



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








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


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

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

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