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

问题描述

大家好!

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

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

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

提前感谢您的帮助!

标签: c++visual-studiodlllib

解决方案


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

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

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

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

1、将头文件的路径添加到Additional Include Directories(property ->c/c++ -> General -> Additional Include Directories) 2、将.lib文件的路径添加到Additional Library Directories(property -> linker -> General -> Additional Library Directories) 3、将.lib 文件的名称及其扩展名添加到 Additional Dependencies (property -> linker -> input -> Additional Dependencies)

有关更多详细信息,我建议您可以参考链接: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文件的路径添加到Additional Library Directories(property -> linker -> 常规 -> 附加库目录) 3,将 .lib 文件的名称及其扩展名添加到附加依赖项(属性 -> 链接器 -> 输入 -> 附加依赖项) 4,将构建后事件添加到您的项目中,添加一个将 DLL 复制到构建输出目录的命令(Properties > Build Events > Post-Build Event)</p>

有关更多详细信息,我建议您可以参考链接: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


推荐阅读