静态库(lib)

DinS          Written on 2017/6/4

一、库的概念

库(library)是编程中非常重要的一个概念,我们在编程中经常会使用到第三方库,那么什么是库?如何制作和使用库?

简言之,库就是把源代码提前编译成二进制,并提供接口文件,以供其他程序调用。库的作用有三:

1.代码复用。因为库中提供了现成的变量、函数、类,程序只要引用库就可以直接使用库中的内容,于是只需要维护一套源代码即可。

2.节省资源。不使用库的话exe中要包含所有代码,如果不同的程序中有部分代码是一样的,可以把这部分单独做成库。

3.隐藏实现。当我们不希望其他人看到实现时,使用库可以达到这个目的,因为库都是二进制的,人无法解读。

就Windows而言,库分成静态链接库(lib)和动态链接库(dll)。二者区别在于静态库被包含在exe之中,而动态库是独立,exe在运行时可以动态地引用和卸载这个库模块。

静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

不管哪种库,使用流程都是一样的:制作->编译->调用。本文先探讨lib文件的使用,有关dll的内容见《动态库(dll)》。

二、制作lib并编译

本文以Windows7系统下VS2012为工具演示。

创建Win32控制台项目,勾选静态库。

像往常一样写代码,添加.h和.cpp。这里仅仅写了一个加法函数,只展示声明,模仿库隐藏实现的效果。

注意声明的时候加extern “C”,用意是增加兼容性,如果制作的lib仅仅在VS程序之间调用可以不用加。

右键项目->生成,编译后得到.lib文件。

这还是十分简单的。

三、使用lib

首先新建一个控制台项目(当然其他项目类型同样也可以调用该lib,因为没有附加其他内容),建一个文件夹,把刚才生成的lib和.h文件拷贝进去。这是准备工作。
顺便补一句:以为库文件不能单独运行,所以通常会在同一解决方案下新建一个项目专门用于库的调试

请确认一下目录结构。

导入lib有两种方法,一种是在代码中写#pragma comment( lib, “路径” ) 。

顺便讲解一下路径的问题。
绝对路径:  E:\Project\lib\StaticLib.lib
相对路径:  .\lib\StaticLib.lib
.\表示当前目录下。因为工程中默认是当前目录,所以可以省去
..\表示上一级目录
不过由于\在C++中有特殊含义,所以需要使用\\对其转义

第二种导入lib方法是在工程属性中设置(推荐使用,因为这样方便后期更改)。

第一步:在c/c++常规中,附加包含目录输入文件夹名。
这一步的作用是指明.h文件所在目录。

第二步在链接器中输入附加库目录。
这一步的作用是指明.lib文件所在目录。

第三步输入附加依赖项,名称就是lib的名字
这一步的作用是指明引用哪个lib文件

完成这3步后就可以直接包含头文件,使用库函数了。

至此就完成了静态链接库的制作和调用,其实很简单,跟写正常程序没什么两样。
我们提供.h和.lib,然后通过一些设置,就可以直接使用库中的内容。

四、其他有关lib的注意事项

因为绝大部分第三方库都是以lib的形式提供的,因此在这里有必要强调一些问题。

由于lib是提前把源代码编译成二进制,因此调用lib的程序的编译选项必须与编译lib时的编译选项一致,这一点做不到会出现各种问题。具体而言有以下几个关键性的选项要注意:

1.平台:32位和64位是不通用的。如果程序是64位的编译lib时也要用64位。

2.MT和MD:程序与lib必须在这个选项上保持一致。至于什么是MT什么是MD自行百度。

3.语言:多字节字符集还是unicode最好保持一致,避免潜在问题。有关字符集的讨论可见《字符集简史》。

4.release和debug:也需要保持一致。貌似debug程序可以调release的lib,但是最好是一致。

如果除了这几个还有调用不了的情况,可以一一对比工程选项,看看哪里不同。