静态库的后缀名:Linux是.a文件,Windows是.lib
动态库的后缀名:Linux是.so文件,Windows是.dll
下面以window为例:
动态库:.dll
看成是一个仓库,一种资源的集合:函数、变量、类等其他资源都可以由动态链接库来导出
静态库:.lib
静态库的代码直接塞到.exe中,动态库则是.exe动态的加载和卸载
1、静态库
工程/项目Project和解决方案Solution区别:
在VS中,Project是基本的执行单元,一个Solution可以包含多个Project
比如我们建立一个静态库就将会包含几个(.lib)Project和一个(.exe)Project用作测试
2、动态库
2.1 DLL程序入口点函数
1、CUI控制台程序(不是DOS):main
2、GUI用户界面程序:WinMain
3、DLL程序入口点函数:DIIMain。注意:大小写是有区别的
(动态链接库可以导出函数、导出变量、导出资源等,对于仅导出资源的DLL可以没有DllMain函数,比如像程序的图标、光标啥的)
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: //当DLL被进程第一次调用,加载进.exe中
case DLL_THREAD_ATTACH: //系统查看映射到进程地址中所有的DLL文件,
//新创建的线程负责执行这次的DLL的DLLMain函数,当所有的DLL都处理完,再去执行自己的线程函数
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH: //当DLL被卸载,解除映射
break;
}
return TRUE;
}
hModule参数:指向DLL本体的实例句柄
ul_reason_for_call:指明DLL被调用原因,用switch-case选择。
2.2 DLL导出函数
DLL里面有两种函数,一种是导出函数,被.exe程序调用;另一种是给DLL内部调用,不提供导出。
操作:在VS2017按常规操作完之后在../×64/Debug/会得到如下的文件
在../DLL1/中得到下面两个主要的函数文件
接下来就是调用,能调用成功才是王道:可以在同级目录下创建测试函数,也可以单独创建解决方案
如果单独创建解决方案,需要将以下文件复制到对应位置:
首先点击生成->生成解决方案,同样在test文件夹下,会得到x64文件夹,将之前的../×64/Debug/文件夹下的DLL1.dll文件复制到当前文件夹×64/Debug/,再把../×64/Debug/下的DLL1.lib和../DLL1/下的Dll1.h文件复制到当前文件夹test下
../×64/Debug/DLL1.dll————>×64/Debug/
../×64/Debug/DLL1.lib————>test
../DLL1/Dll1.h ————>test
然后在头文件中添加Dll1.h,在资源文件中添加DLL1.lib,并在源文件中创建test.cpp测试。
最后在test.cpp编写调用代码,包含#include “Dll1.h”