在Visual Studio中使用C++创建和使用LIB
http://www.jellythink.com/archives/118
什么是LIB库?
库是已经写好的,成熟的,可以复用的代码。本质上说来,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。所谓的静态,是指的链接过程。让我们来看看将一个程序编译成可执行程序的步骤:
当一个可执行程序由代码变成可执行程序时,需要经过预编译、编译、汇编和链接。对于静态库,会在链接阶段将汇编生成的目标.o文件与引用到的库一起链接打包到可执行文件中,对于这种链接方式称为静态链接。静态库有如下特点:
- 静态库对函数的链接是放在编译时期完成的;
- 程序在运行时与函数库再无瓜葛,移植方便;
- 浪费空间和资源,因为所有相关的目标文件与牵扯到的函数库被链接合成一个可执行文件。
LIB库与DLL库的区别?
上面也说了,静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库;对于动态链接库,在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入的,因此在程序运行时还需要动态链接库。
由于链接后的可执行文件包含了所有需要调用的函数的代码,所以可执行文件占用的磁盘空间较大。当多个调用相同LIB库的程序在内存中运行时,内存中就存有多份相同的库函数代码,因此占用内存空间较多。对于动态链接库,DLL不必被包含在最终的可执行程序中,可执行程序可以动态的加载和卸载DLL。我们都知道,Windows三个最基本的动态链接库是:KERNEL32.DLL、USER32.DLL和GDI32.DLL;基本上每个程序都会使用这三个DLL,由于是动态链接库,它们在内存中就存在一份拷贝,被不同的应用调用,这样就避免了内存的浪费。由于静态库最终会被链接到可执行程序中去,这样就会出现一个问题,当静态库发生变化时,那么对应的可执行程序也需要进行重新编译,这样就导致了应用程序的更新变的极为困难。
创建LIB(静态库)
首先创建一个Win32 Console Application程序,如下图:
选择Application type为Static library类型,就是静态库,如下图:
添加Static_Lib.h和Static_Lib.cpp文件,在Static_Lib.h中添加以下代码:
#ifndef _STATIC_LIB_H_ #define _STATIC_LIB_H_ int Add(int, int); #endif
在Static_Lib.cpp中添加以下代码:
#include "stdafx.h" #include "Static_Lib.h" int Add(int a, int b) { return (a + b); }
进行编译,会在工程的Debug目录下生成一个LibDemo.lib静态库文件。
使用LIB(静态库)
创建一个Client客户端程序,负责调用LibDemo.lib静态库。客户端代码如下:
#include <iostream> #include "..\LibDemo\Static_Lib.h" using namespace std; #pragma comment(lib, "..\\LibDemo\\Debug\\LibDemo.lib") int main(int argc, char *argv[]) { cout<<Add(10, 20)<<endl; return 0; }
这样就完成了(工程下载)。看了《在Visual Studio中使用C++创建和使用DLL》的童鞋就会好奇了,为什么这个LIB的调用方式和DLL的加载时动态链接是一样的?由于生成DLL时,也会创建一个.lib文件,而该lib文件和我们这里说的LIB有很大的差别。和DLL一起生成的.lib文件,它只包含一些导出函数的声明,并不包括函数的实现,没有函数体,它只是为DLL服务的;而我们这里说的LIB,是包括完整的函数实现的。
总结
LIB学习起来很简单,没有多少东西可以讲,也没有什么需要去注意的,但是,我们需要将LIB和DLL对比起来进行学习,这样就能知道LIB的优点和缺点了。希望读者能和我分享你对LIB的认识和见解。推荐阅读《程序员的自我修养:链接、装载与库》(电子版下载)这本书。最后,祝愿嫦娥三号登月成功。
2013年12月2日 于大连,东软。未经允许不得转载:果冻想 » 在Visual Studio中使用C++创建和使用LIB
posted on 2016-12-22 22:06 zhangyz017 阅读(3997) 评论(0) 编辑 收藏 举报