本文主要是介绍尝试制作和使用lib与dll,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
关于lib和dll这两种库的概念,网上已有很多讨论可以参阅。这篇博客主要记录我动手尝试用VS来制作lib和dll并随后使用的过程。
参考:
lib和dll的区别与使用 - LuckyAnnika - 博客园
C++编写一个简单的DLL - _No.47 - 博客园
dumpbin工具
在开始之前,需要介绍一下VS提供的dumpbin工具,这个工具可以获取一些lib与dll中的信息。
它被放在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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!