如何在QT中添加.lib,dll还有.h文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在QT中添加.lib,dll还有.h文件相关的知识,希望对你有一定的参考价值。

参考技术A 一:打开腾讯电脑管家,找到工具箱-电脑诊所。
二:点击软件问题专区。
三:在丢失dll文件一键修复区,找要修复的dll文件选项。
四:点击立即修复,便可以恢复正常了本回答被提问者采纳

我有 .lib 和 .dll 文件,但没有 .h - 如何在其他 C++ 项目中使用这些库中的方法?

【中文标题】我有 .lib 和 .dll 文件,但没有 .h - 如何在其他 C++ 项目中使用这些库中的方法?【英文标题】:I have .lib and .dll files, but not .h - how to use methods from those libraries in other C++ project? 【发布时间】:2020-03-12 08:49:08 【问题描述】:

大家好!

我有以下情况:我需要从另一个非常大的项目(称为 B)导入我的 Visual Studio 2019 C++ 项目(称为 A)方法)。实际上我有这个 B 项目的 .sol 文件,并且可以成功构建静态库 (B.lib) 以及动态库 (B.dll)。一个问题是 - 我想从 A 中的 B 调用一些方法,但我不能只加载 B 的标头并创建一些类在 A 中,它继承了 B 中需要的类以及所有需要的方法,因为 B 确实是一个非常大的项目,并且在“main header”使用了很多自定义类,这些类刚刚合并到项目中,我真的会被困在尝试导入一个标题,以使标题工作,以使“主”标题在我的项目等。我想你明白了。

第二件事更具体:我尝试使用LoadLibraryGetProcAdress 加载DLL。有用。实际上,对于我真正需要的所有方法,在 B 中,它定义了每个方法的 void 外部版本,它将指向类对象的指针作为参数。一个问题是 - 如果 B 中没有工厂函数,如何获取此类的实例 - 即函数返回这个需要的类对象的指针,我可以从 .dll 加载到我的 A ?我无法附加正确的代码,因为它受 cw 保护。也许 .lib 文件可以实现?这对事物如何协同工作,这确实是我的问题。

那么,有什么方法可以从这些库中获取方法吗?请更详细地解释一下,如果你有时间,我是 C++ 开发的初级人员,我并不总是清楚地理解它是什么意思。像“只需链接 .lib 文件并使用它” - 如何使用?...等等

提前感谢您的帮助!

【问题讨论】:

对不起,由于某种原因,它跳过了第一行问候语 :( 大家好,很抱歉,我不知道为什么会这样。不想表现出不尊重。 【参考方案1】:

静态库会增加二进制文件中代码的大小。它们始终会被加载,并且您编译时使用的任何版本的代码都是将要运行的代码版本。

动态库是单独存储和版本化的。动态库不一定要加载——它们通常在第一次调用时加载——并且可以在使用相同库的组件之间共享(多个数据加载,一个代码加载)。

您可以根据需要选择使用动态链接还是静态链接。

使用静态链接:要与 .lib 文件链接,您只需:

1、将头文件的路径添加到Additional Include Directories(property ->c/c++ -> General -> Additional Include Directories) 2、将.lib文件的路径添加到附加库目录(属性->链接器->通用->附加库目录) 3、在Additional Dependencies(property -> linker -> input -> Additional Dependencies)中添加.lib文件名及其扩展名

更多详情我建议你可以参考链接:https://docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-static-library-cpp?view=vs-2019

使用动态链接:如果你有a.dll和a.lib,你可以使用静态加载的dll。

1、将头文件的路径添加到Additional Include Directories(property ->c/c++ -> General -> Additional Include Directories) 2、将.lib文件的路径添加到附加库目录(属性->链接器->通用->附加库目录) 3、将.lib文件的名称及其扩展名添加到附加依赖项(属性->链接器->输入->附加依赖项) 4、在你的项目中添加一个构建后事件,添加一个复制DLL到构建输出目录的命令(属性>构建事件>构建后事件)

更多详情我建议你可以参考链接:https://docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2019

如果dll没有对应的.lib文件,则只能使用动态加载来加载DLL。

1、创建一个函数指针,其指针数据类型与调用的DLL导出函数相匹配。 2、通过Win32 API函数LoadLibrary()显式调用DLL,该函数返回DLL的实例句柄。 3、通过Win32 API函数GetProcAddress()获取要调用的DLL的函数地址,将结果赋值给自定义函数的指针类型。 4、使用函数指针调用DLL函数。 5、最终调用完成后,通过Win32 API函数FreeLibrary()释放DLL函数。

更多详情我建议你可以参考链接:https://docs.microsoft.com/zh-cn/windows/win32/dlls/using-run-time-dynamic-linking

【讨论】:

非常感谢您的回答。我做了你所说的一切,现在我遇到了问题。想象一下,我有一个来自该库项目的主头文件 B.h,现在,按照给定的说明,我必须在我的项目 A 中包含这个头文件,我在其中加载.lib 文件。在原始项目 B 中,该标头工作正常,没问题,但是当我将它包含到我的项目中时,以及我写了它的路径,.lib 文件的路径并添加了一个名称附加依赖项中的 .lib 文件 - 它导致 B.h 中的许多错误进入我的项目 A。我做错了什么? @gehirndienst,“这导致我的项目 A 中的 B.h 出现很多错误。”您能告诉我们发生了什么错误吗?【参考方案2】:

这可以通过将B静态链接到A来实现。首先您必须构建B的解决方案并获取lib文件。然后将lib文件作为附加依赖添加到A的项目中。最后将B的头文件分开,并将头文件的位置添加到A的Additional Include Directories部分。

步骤:

    构建B并获取B.lib

    从 B 的源代码中提取头文件到一个单独的目录。 (我们称这个目录为 INC_DIR)

    打开A的解决方案右键A的项目选择属性打开属性窗口。 在属性窗口转到 C/C++ -> 附加包含目录。将 INC_DIR 的位置添加到 Additional Include 目录中 在属性窗口转到链接器 -> 常规 -> 附加库目录。将 B.lib 的位置添加到其他库目录。 在属性窗口转到链接器 -> 输入 -> 附加依赖项。将 lib (B.lib) 的名称添加到 Additional dependencies。

此链接清楚地显示了要做什么: https://***.com/a/23882710/5746085.

在互联网上搜索静态库链接+视觉工作室以获取更多信息。

【讨论】:

非常感谢您的回答!我想我已经尝试过这样做,但我不清楚给定链接中的声明:“现在您应该能够使用该库。记住将它#include 到您的文件中” 如何包含它?还有,这是什么”? #include "B.lib 不起作用,我不能直接包含标题,我在上面指定了原因。我做了你所说的一切,但仍然不明白如何在我的 A 项目中使用 B.lib 中的方法和/或类。 我已经更新了答案并添加了要遵循的步骤。你不能做#include "B.lib。你可以从B的源代码中获取头文件。头文件是必须的。 我做了所有的步骤。现在:如果我不能在 A.hA.cpp 中写类似 #include "B.h" 的东西,如何使用来自 B.lib 的方法?这是我的问题,如果我写得不太清楚,请见谅。 您可以使用“#include B.h”包含头文件。所以项目“A”可以看到B的定义。我之前提到的是你不能包含lib文件。即#include B.lib 是无法完成的。 是的,但遗憾的是我不能包含标题。它包含一个类,它继承了大约 10 个其他类,对于每个类,我需要包含一个适当的标头,然后我就会出现错误和冲突,因为所有这些标头都被硬编码在 B 中。所以,这种方式很难,这就是为什么我问有没有办法避免包含标题但仍然可以访问方法?

以上是关于如何在QT中添加.lib,dll还有.h文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将外部库添加到 QT?

Qt:如何导入没有头文件和lib文件的dll

在 Qt 中使用非标准名称链接 lib 文件

QT creator 如何调用VC写的静态库

如何在 Qt 中使用 GLEW?

当您的外部 SDK 只有 .dll、.lib、.h 文件时如何链接和构建项目