lib(静态库)
- 静态库定义:
.lib
文件是静态库文件,包含了在编译时被链接到目标程序的代码。使用静态库时,库的代码会被复制到最终生成的可执行文件中。 - 优点:
- 性能:由于库代码在编译时就被集成到可执行文件中,所以在运行时不需要加载外部文件,通常有更好的性能。
- 分发方便:无需在分发应用程序时包含额外的库文件,因为所有代码都已包含在可执行文件中。
- 缺点:
- 占用空间:由于每个使用静态库的可执行文件都包含了库的代码,所以会导致生成的可执行文件较大。
- 更新不便:如果库代码需要更新,则必须重新编译每个使用该库的应用程序。
dll(动态库)
- 动态库定义:
.dll
文件是动态链接库文件,包含了在运行时被加载的代码。使用动态库时,库的代码在程序运行时才被加载,并且可以被多个程序共享使用。 - 优点:
- 节省内存:多个程序可以共享同一个动态库实例,节省内存。
- 易于更新:更新动态库时,只需要替换旧的
.dll
文件,而无需重新编译依赖该库的所有程序。
- 缺点:
- 依赖性:应用程序在运行时必须能够找到并加载所需的动态库文件,否则会报错。
- 加载开销:在程序运行时加载库文件会增加一些开销。
使用场景
- 静态库适用于那些不经常更新,并且不需要被多个程序共享的代码模块。
- 动态库则适用于需要被多个程序共享,并且可能需要频繁更新的代码模块。
在VS2022中的使用
- 创建静态库:在VS2022中,可以通过选择“静态库(.lib)”项目类型来创建静态库。编译后会生成一个
.lib
文件和相关的头文件。 - 创建动态库:同样,可以通过选择“动态链接库(.dll)”项目类型来创建动态库。编译后会生成一个
.dll
文件以及一个与其对应的.lib
文件(用于链接时使用)和头文件。
小结
lib
文件主要用于静态链接,在编译时合并到可执行文件中。dll
文件用于动态链接,在运行时加载,支持代码共享和动态更新。
静态库中的lib
- 包含函数定义:静态库(
.lib
)文件包含了所有需要的函数定义和实现。链接时,编译器会将这些函数的代码直接复制到目标可执行文件中。这意味着生成的可执行文件包含了库中所有用到的代码。
动态库中的lib
- 不包含函数定义:动态库(
.dll
)的lib
文件(有时称为“导入库”)不包含函数的实际实现代码。相反,它包含了动态库中导出的函数的符号和地址信息,用于在链接时告诉编译器这些函数在动态库中实际存在。这种lib
文件本质上是一个指向.dll
文件中函数实现的“指针”。
总结
- 静态库的
.lib
文件:包含了所有函数的完整实现。 - 动态库的
.lib
文件:不包含函数实现,仅包含函数的符号信息,用于链接时指向对应的.dll
文件。
在解决方案中,一个DLL工程中和一个Lib工程,DLL工程调用Lib工程需要添加附加依赖项和附加库目录
如果是在一个解决方案(solution)下,在DLL中可以引用Lib工程,这样就不需要添加附加依赖项和附加依赖库了,如下图: