vs2017中lib的使用

4/1/2020 C++vs2017

静态链接库(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项目

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 (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)