首先明确这篇文章的目的,我希望大家能够通过这篇文章了解一下如何在实际工作中创建和使用Windows平台下的静态链接库。关于链接库的概念,希望大家参考*”Library”词条(英文版),介绍的很全面,措辞也很严谨。远比你从网上东看西逛来的迅捷。文中对动态链接库和静态链接库的区别以及Windows平台和Linux平台的具体实现都做了很详细的说明。什么时候该用动态库,什么时候该用静态库也可以从中得到结论。所以我就不谈哪个好,哪个不好了。我只假设这样一种情况,你已经确定要创建、使用Windows的静态链接库,但却不知道如何操作,本篇文章的用意仅在于此。
另外顺便说一下,如果你想了解Windows下的动态链接库的创建和使用,你可以参考孙鑫老师的《VC++深入详解(修订版)》中的相关章节,里面介绍的也很系统,而且涉及一些原理介绍。如果你想了解Linux下静态链接库、动态链接库的创建和使用你可以在阅读刚才提到的*”Library”词条(英文版)的基础上阅读我的后续博客内容。
这里说明一下,我所使用的系统为Windows 8.1 x64,所使用的编译器为VS 2012。其它类似环境的操作不难从本文推出。但有一点我想说明,既然你选择Windows下的静态链接库,那么我推荐你使用微软体系的编译器,无论是VC6.0还是后来的VS,都没有关系。但最好不要使用其它编译器。我不是说它们不如微软体系的编译器好,而是因为库文件这个东西很依赖于系统实现,Windows就是微软开发的,许多该平台上库的实现都是以微软为标准,所以其兼容性最好。当然如果你要使用linux下的动态、静态链接库,我就会推荐你使用gcc编译器,其对linux平台的兼容性最好。
下面开始正文,首先在VS中新建一个名称为libjiangxin的static library工程,并新建libjiangxin.h和libjiangxin.cpp两个文件,源代码如下:
//文件:libjiangxin.h #ifndef LIB_H #define LIB_H extern "C" int add(int x,int y); //声明为C编译、连接方式的外部函数 #endif //文件:libjiangxin.cpp #include "libjiangxin.h" int add(int x,int y) { return x + y; }
注意如果你使用VS2012的话,你还可以直接将libjiangxin.h中的代码改为:
#pragma once extern "C" int add(int a,int b);
编译这个工程就得到了一个.lib文件,具体生成位置随编译器版本不同而不同,你可以在你的工程目录下仔细找找,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。下面来看看怎么使用这个库,在libjiangxin工程所在的工作区(解决方案)内新建一个libTest工程。libTest工程仅包含一个test.cpp文件,它演示了静态链接库的调用方法,其源代码如下:
#include <stdio.h> //Libjiangxin.h文件的所在位置,可能与我的不同 #include "..\\Libjiangxin\\Libjiangxin.h" //指出本文件生成的.obj文件应与libjiangxin.lib一起连接,具体位置可能与我的不同 #pragma comment(lib, "..\\Debug\\libjiangxin\\libjiangxin.lib") int main() { printf( "2 + 3 = %d", add( 2, 3 ) ); return 0; }