一文梳理vs2017中lib的使用

本文详细介绍了在VS2017环境下生成和使用静态链接库(lib)的方法,包括lib的概念、生成步骤及调用方式,并对比了lib与dll的区别,适合初学者和开发者参考。

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项目

lib新建项目
Ps:vs2017新建lib项目会默认创建预编译头,如果不使用预编译头,则进行如下设置并删除相关文件即可:lib不使用预编译头

2. 实现一个lib函数

lib函数实现

3. 生成结果

lib生成结果

[How] 如何调用lib

新建一个控制台应用,在其中调用上述生成的lib。

调用lib需要两个文件:.h文件.lib文件

1. 项目配置

依次配置下列控制台应用的项目属性:

  • 附加包含目录
    lib附加包含目录

  • 附加库目录
    lib附加库目录

  • 附加依赖项
    lib附加依赖项

  • 调用结果如下:
    lib调用结果_项目配置

使用项目配置的方式调用lib库比较繁琐,还可能需要对debug版本和release版本作不同的配置。比较适合引用成熟的第三方库,eg. protobuf, gurobi等。

2. 编译语句

使用#pragma comment(lib, "../Debug/MyLIB.lib")语句调用lib。
lib调用结果_#pragma comment

#pragma comment语句将库目录直接写进代码,更加直观;需要仔细将头文件目录和库目录写对。

3. 直接引用

如果lib项目和控制台项目在同一解决方案下,可以采用直接添加引用的方式。

  • 添加引用
    lib添加引用

  • 调用结果如下:
    lib调用结果_引用

直接引用的方式最为简单,也避免了路径写错的可能性,但它无法区分该lib库是debug版本还是release版本。这种方法也等效于直接将lib文件拖到项目资源里使用。

[Why] lib的优缺点

  • 优点:单纯使用lib编译生成的应用程序仅有一个可执行文件exe,在运行时不需要挂载dll,方便管理,适用于应用程序一次性交付的场景。

  • 缺点:lib中的代码会拷贝到exe中,导致exe占用空间较大;同时失去动态库带来的模块化与更新的灵活性,每一次发版都需要发布全新的应用程序替换旧版。

[Github] 代码

项目实例均在vs2017上测试,并上传至GitHub: https://github.com/lyandut/EXE_LIB_DLL

[Reference] 参考

https://www.cnblogs.com/alantu2018/p/8470976.html
https://www.cnblogs.com/TenosDoIt/p/3203137.html
https://blog.csdn.net/weixin_43118068/article/details/88760001
https://blog.csdn.net/xiaohuh421/article/details/7476485

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值