C++-dll动态链接库和lib静态链接库有什么区别和联系

意见反馈 意见反馈 主题:991 回复:2082

C++-dll动态链接库和lib静态链接库有什么区别和联系

偏爱自由 发布于 2017-07-23 字数 307 浏览 1232 回复 4

经常配置环境的时候要把一些dll文件复制到什么地方 lib文件复制到什么地方 大致的我的理解是这些库是用来存放函数定义 数据定义的地方 但动态静态有什么区别吗 最好举个简单的例子 我刚刚步入工作 对大程序的了解还太少谢谢各位

(DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。) DLL程序是什么呢?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(4

夜无邪 2017-10-26 4 楼

首先要明白lib和dll的概念。

lib文件有两种情况:
  1、Object libraries,又叫静态链接库,此时,lib文件里面包含了所有的符号,标识以及资源。编译时不依赖dll文件,可以独立参与链接。缺点是每个应用程序需要将库链接到自己里面,造成程序体积增加。 优点是运行速度会稍快,并且只会生成一个文件,不需要附带dll文件发布。
  2、Import Libraries,又叫导入库,此时,lib文件并不包含任何代码,符号及资源,而仅仅是包含了一些链接信息,建立起相对应的动态库的重定向表,帮助应用程序能正确地找到dll动态库中的函数及符号。

dll文件则称为动态库链接库,动态链接库需要用_declspec(dllexport)来导出相应的符号,外部程序才能使用,优点是:多个程序可以共用同一个dll库,减小了程序体积。缺点是:程序发布时需要带着dll文件一起发布才行。dll动态库使用也有两种情况:
  1、静态调用,此时dll需要提供上面所说的导入库lib文件参与编译链接,使用上用静态链接库的方法差不多,只是需要运行时能在PATH路径,或程序当前路径下能找到相应的dll文件。dll会在程序加载时同时加载到内存中。
  2、动态调用,此时程序可以在需要的时候才用LoadLibrary()来装载动态库,用GetProcAddress来得到函数地址,以及用FreeLibrary来卸载。 这样子可以最大程序地合理地利用资源。这种情况下dll不需要参与编译,只是在需要时时候加载使用就行了。缺点是使用稍显复杂。

泛泛之交 2017-09-24 3 楼

静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!

对于动态链接库:
动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我们必须先注意到DLL内的函数分为两种:
(1)DLL 导出函数,可供应用程序调用;
(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。

灵芸 2017-08-31 2 楼

lib 在编译的时候就程序内就跟这个模块产生关联,以后就不用重定向lib里的方法地址等,以及许多东西都已经准备好了。在程序运行的时候也会进行加载。但是他修改一次类库,那么可以存在整个项目都要进行编译。所以一般lib都只该项目的核心内容以及一些核心方法,通用方法。
动态库,dll,程序运行的时候去加载,载入的时候会进行许多的判断,以及一些方法地址的判断。然后载入到内存中,然后运行,接着退出。所以一般用于第三方库,就是很少机会会调用到。
所以按自己的意愿进行选择。

虐人心 2017-08-27 1 楼

简单的说,静态库是在编译的时候就加载到了程序中,而动态库是你在程序运行的时候再去加载,所以你修改静态库话需要重编译整个程序,而动态库你只需要重编译更改的库就行了