动态链接库的工作原理
How Dynamic-link library works
我在想:当我用Visual Studio (c++)生成DLL时,它生成
- .dll文件 .lib文件
还有一个。h文件
那么,为什么不直接开发一个静态的。lib库呢?例如,为什么Office没有.lib文件?
并且,在将来,如果我更改DLL,我是否必须将新的。lib文件和。h文件发送到所有的机器?
.h和.lib仅供开发人员使用。无论谁编写程序来使用DLL。
那些只执行应用程序的人只需要. dll。
所以如果你发布了一个新版本,你将DLL发送给用户,并将三元组发送给开发人员。除非您更改了公共接口(导出),否则旧客户端将很乐意使用更新后的DLL,而无需任何工作。
如果你构建一个静态的.lib,每个客户端必须重新构建他的二进制文件。
.lib文件和头文件是动态库的静态部分。
您需要.lib和头文件来编译和链接程序,以便它使用您的库。
原因有很多。一种情况是,如果使用静态库,每次更改库都会导致程序重新编译。另一个是程序的规模将会增加。还有更多。
所以对于第二个问题,lib文件对于程序的用户来说是无用的。在办公室。如果你没有源代码和编译器,那么lib文件是没有用的。
对于你的最后一个问题。答案也很简单。不,您不需要分发.lib文件。只要接口保持不变,就可以用新版本替换dll文件。这是一个简短的版本,试图回答你的具体问题。"DLL和共享库是如何工作的"这个主题有好几页长,我不打算把它全部写下来作为答案。
从编译器生成的部分开始,一个。lib和一个。dll文件,使用如下:。lib文件包含使用。dll进入。exe文件的"存根",并包含在。dll文件中"在哪里可以找到不同的函数"。因此,这仅在构建.exe文件时使用。类似地,.h文件在编译.dll和.exe文件时使用,一旦有了组成产品的最终二进制文件(.exe和.dll文件)就不会使用。
当有多个可执行文件使用相同的. DLL文件时,使用DLL的目的比静态链接更重要。如果一个DLL只有一个"用户",那么好处就会减少,但仍然有一些好处(比如分隔,只对那部分代码提供更新的能力,插件等)。
假设你的。dll是一个只包含二进制文件的程序的一部分,没有源代码,那么你只需要分发新的。dll[只要函数没有改变,使用这个。dll的。exe或其他。dll必须改变,当然]。
- g++用户定义的动态链接库上的全局new和delete运算符
- 如何使用C++导出制作动态链接库
- 动态链接库中C++回调函数
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- 将函数传递给动态链接库
- 如何将动态链接库与CMake一起使用
- 从另一个动态链接库项目调用静态库函数
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- 如何将此动态链接库链接到程序
- Ordinal 3283不能位于动态链接库libmysql.dll中
- 检查动态链接库是否已过时
- Qt测试模拟动态链接库
- SDL_AudioStreamFlush无法在动态链接库SDL2_mixer.dll中找到
- 在 Win 7 SP 中创建 exe vcxproj:过程入口点<function>无法位于动态链接库中KERNAL32.dll
- 编译C++中动态链接库,存在运行路径问题
- 导入库<>动态链接库兼容性
- Java/Python在C/C++中访问的动态链接库
- 多个动态链接库(DLL)是否可以从静态库(LIB)共享线程本地存储
- 将静态库封装在动态链接库(DLL)中
- 动态链接库的工作原理