vs2017中lib的使用
静态链接库(lib)
Windows下有静态链接库(lib)和动态链接库(dll)两种共享代码的方式。
本文将介绍lib的应用场景,以及在vs2017平台下的生成和使用。
# [What] lib是什么
通常所说的lib是指静态链接库(Static Link Library),其中包含代码实现,lib实际上是obj文件的集合(obj文件由cpp文件编译生成),lib可以看作是一个壳子,obj文件集合打包生成lib的过程也称为"archive"。在应用程序生成过程中链接器将代码链接到目标模块(exe或dll)中,完成链接后lib文件也就没有用了,程序发布时无需提供lib文件。
还有另一种lib被称作是dll的导入库,里面包含了函数所在的dll文件及其位置信息(即索引功能),而真正的代码实现在dll文件中,它的作用是隐式链接dll,在完成链接后lib文件也没有用了,程序发布时也无需提供lib文件,但需要提供dll文件。
# [How] 如何生成lib
# 1. 新建一个lib项目
Ps:vs2017新建lib项目会默认创建预编译头,如果不使用预编译头,则进行如下设置并删除相关文件即可:
# 2. 实现一个lib函数
# 3. 生成结果
# [How] 如何调用lib
新建一个控制台应用,在其中调用上述生成的lib。
调用lib需要两个文件:.h文件 和 .lib文件。
# 1. 项目配置
依次配置下列控制台应用的项目属性:
附加包含目录
附加库目录
附加依赖项
调用结果如下:
使用项目配置的方式调用lib库比较繁琐,还可能需要对debug版本和release版本作不同的配置。比较适合引用成熟的第三方库,eg. protobuf, gurobi等。
# 2. 编译语句
使用#pragma comment(lib, "../Debug/MyLIB.lib")
语句调用lib。
#pragma comment
语句将库目录直接写进代码,更加直观;需要仔细将头文件目录和库目录写对。
# 3. 直接引用
如果lib项目和控制台项目在同一解决方案下,可以采用直接添加引用的方式。
添加引用
调用结果如下:
直接引用的方式最为简单,也避免了路径写错的可能性,但它无法区分该lib库是debug版本还是release版本。这种方法也等效于直接将lib文件拖到项目资源里使用。
# [Why] lib的优缺点
优点:单纯使用lib编译生成的应用程序仅有一个可执行文件exe,在运行时不需要挂载dll,方便管理,适用于应用程序一次性交付的场景。
缺点:lib中的代码会拷贝到exe中,导致exe占用空间较大;同时失去动态库带来的模块化与更新的灵活性,每一次发版都需要发布全新的应用程序替换旧版。
# [Github] 代码
项目实例均在vs2017上测试,并上传至GitHub: https://github.com/lyandut/EXE_LIB_DLL (opens new window)
# [Reference] 参考
https://www.cnblogs.com/alantu2018/p/8470976.html (opens new window) https://www.cnblogs.com/TenosDoIt/p/3203137.html (opens new window) https://blog.csdn.net/weixin_43118068/article/details/88760001 (opens new window) https://blog.csdn.net/xiaohuh421/article/details/7476485 (opens new window)