尝试制作和使用lib与dll

2024-09-06 23:48
文章标签 lib 使用 dll 尝试 制作

本文主要是介绍尝试制作和使用lib与dll,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

关于libdll这两种库的概念,网上已有很多讨论可以参阅。这篇博客主要记录我动手尝试用VS来制作libdll并随后使用的过程。
参考:
lib和dll的区别与使用 - LuckyAnnika - 博客园
C++编写一个简单的DLL - _No.47 - 博客园

dumpbin工具

在开始之前,需要介绍一下VS提供的dumpbin工具,这个工具可以获取一些libdll中的信息。
它被放在VS目录的MSVC目录中,例如目前我是社区版VS2017,则工具的位置在:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64
如果这个路径被添加到了环境变量中,则cmd中打出dumpbin应该会有提示:
在这里插入图片描述
参数中:
/EXPORTS可以看到dll中的函数定义。
/LINKERMEMBER可以看到lib中的一些内容
其他参数详见官方文档

制作lib

首先用“静态库”模板来创建一个项目:
在这里插入图片描述
VS直接帮我生成了四个文件,还贴心地写了一个示例的函数:
在这里插入图片描述
我随便改了一下函数让它有点辨识度:

int yaksueFuncA(int x)
{return x * 10 - 3;
}int yaksueFuncB(int x, int y)
{return x * y + 5;
}

对这个项目进行“生成”,可以看到lib文件被成功创建:

生成: 项目: TestStaticLib1, 配置: Debug Win32 ------
1>pch.cpp
1>TestStaticLib1.cpp
1>TestStaticLib1.vcxproj -> D:\0_WorkSpace\Cpp\TestStaticLib1\Debug\TestStaticLib1.lib
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

我将其放到D:/Test/路径中。
使用dumpbin -LINKERMEMBER "D:/Test/TestStaticLib1.lib"命令可以看到那两个函数:
在这里插入图片描述

使用lib

随便创建一个可以测试使用的工程,比如“控制台应用”模板。
在这里插入图片描述
添加附加库目录:
在这里插入图片描述
随后,加载这个库:

#pragma comment(lib, "TestStaticLib1.lib")

然后添加yaksueFuncB函数的定义:

int yaksueFuncB(int x, int y);

随后,就可以使用它了,结果符合预期:
在这里插入图片描述

制作dll

首先用“动态链接库”模板来创建一个项目:
在这里插入图片描述
VS直接帮我生成了四个文件,还贴心地生成了一个DllMain
在这里插入图片描述
我直接补充了两个函数在下面:

extern "C" __declspec(dllexport) int yaksueFuncC(int a, int b)
{return (a + b) * 3;
}extern "C" __declspec(dllexport) int yaksueFuncD(int a)
{return a + 5;
}

随后点击生成,得到dll文件(和一个配套的lib文件):

1>------ 已启动生成: 项目: TestDll1, 配置: Debug Win32 ------
1>dllmain.cpp
1>  正在创建库 D:\0_WorkSpace\Cpp\TestDll1\Debug\TestDll1.lib 和对象 D:\0_WorkSpace\Cpp\TestDll1\Debug\TestDll1.exp
1>TestDll1.vcxproj -> D:\0_WorkSpace\Cpp\TestDll1\Debug\TestDll1.dll
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

我将其放到D:/Test/路径中。
使用dumpbin -exports “D:/Test/TestDll1.dll“命令可以看到那两个函数:
在这里插入图片描述

使用dll(配合lib)

回到刚才测试lib时候的ConsoleApplication1项目中。
加载lib库(已经将路径添加了):

#pragma comment(lib, "TestDll1.lib")

函数定义:

extern "C" __declspec(dllimport) int yaksueFuncC(int x, int y);

接下来可以编译通过,但是运行时找不到dll:
在这里插入图片描述
Windows中关于dll的搜索有一套规则,当前我图方便直接放到项目文件夹中了。
之后可以运行,结果符合预期:
在这里插入图片描述

使用dll(无lib配合)

dll也可以直接读入,无须lib文件配合。下面先将D:\Test\TestDll1.lib中删掉,并将TestDll1.dll放到D:\Test\中。

首先,#include <windows.h>,为了能得到读取dll以及获得函数地址相关的函数。
定义这个函数的类型为_func

typedef int(*_func)(int a, int b);

读取这个dll:

HINSTANCE hDll = LoadLibrary(L"D:/Test/TestDll1.dll");	

通过名字获得这个函数的指针:

_func funcPtr = (_func)GetProcAddress(hDll, "yaksueFuncC");

最后用完之后需要释放掉dll:

FreeLibrary(hDll);

运行后,结果符合预期:
在这里插入图片描述
·

这篇关于尝试制作和使用lib与dll的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143463

相关文章

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp