c++ - 我有 .lib 和 .dll 文件,但没有 .h - 如何在其他 C++ 项目中使用这些库中的方法?
问题描述
大家好!
我有以下情况:我需要从另一个非常大的项目(称为B )导入我的 Visual Studio 2019 C++ 项目(称为A )方法。实际上,我有一个用于此B项目的 .sol 文件,并且可以成功构建静态库(B.lib)以及动态库( B.dll)。一个问题是 - 我想从A中的B 调用一些方法,但我不能只加载B的标头并在A中创建一些类,它使用所有需要的方法继承B中所需的类,因为B真的是一个非常大的项目,在“主标题”中使用了很多自定义类,这些类只是合并到项目中,我真的会在尝试导入标题时陷入困境,以使标题工作,为了使“主要”标题在我的项目等中工作。我想你明白了。
第二件事更具体:我尝试使用LoadLibrary
and加载 DLL GetProcAdress
。有用。实际上,在B中,对于我真正需要的所有方法,它定义了每个方法的 void 外部版本,它将指向类对象的指针作为参数。一个问题是 - 如果B中没有工厂函数,如何获取这个类的实例- 即函数返回这个需要的类对象的指针,我可以从 .dll 加载到我的 A 中?我无法附加正确的代码,因为它受 cw 保护。也许 .lib 文件可以实现?这对事物如何协同工作,这真的是我的问题。
那么,有什么办法可以从这些库中获取方法吗?请更详细地解释一下,如果你有时间,我是 C++ 开发的初级人员,我并不总是清楚地理解它是什么意思。像“只需链接 .lib 文件并使用它” - 如何使用?...等等
提前感谢您的帮助!
解决方案
静态库会增加二进制文件中代码的大小。它们总是被加载,并且您编译的任何版本的代码都是将运行的代码版本。
动态库是单独存储和版本化的。动态库不一定是加载的——它们通常在第一次调用时加载——并且可以在使用相同库的组件之间共享(多个数据加载,一个代码加载)。
您可以根据需要选择使用动态链接还是静态链接。
使用静态链接:要链接 .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
推荐阅读
- xamarin.forms - 在 Xamarin Forms 应用程序中使用/接受证书
- python - 在 2 个不同的绘图数据框直方图上共享相同的 x 轴
- java - 如何让 MappingIterator 不包含空行?
- react-native - 带有图像的卡片组件不完全适合卡片
- c++ - 如何在旧版驱动程序中使用 PE 标头进行用户修改后获取原始文件类型
- android - 在 Android 上找不到 React Native 中的捆绑图像
- android - Maven 库不会从 POM 中的私有存储库中获取依赖项
- python - 如何使用python将列插入excel文件?
- reactjs - 使用reactjs根据最近时间和数据类型列出数据?
- php - 在 PhpStorm 中开发 WordPress 插件:“找不到路径”-“未解析包含表达式”