vs下制作和使用.lib静态库

来源:互联网 发布:动态数组 链表 编辑:程序博客网 时间:2024/04/20 09:18

关于链接库的讲解在这个网址上有不错的讲解:http://www.360doc.com/content/11/0805/17/6675409_138289992.shtml

下面写一下自己的实践:

首先可以创建一个空工程,然后再工程属性---configuration properties---General---configuration type改为.lib,创建可执行工程默认情况下是.exe

然后,可以在这个工程中创建头文件和源文件,如:

chang.h:

int fun(int a, int b)

chang.cpp:

#include <iostream>
#include "chang01.h"

using namespace std;

int fun(int a, int b)
{
 return a + b;
}

之后编译就会在工程文件夹下的Debug文件夹下生成以当前工程名命名的lib文件,这个会生成chang.lib。

到这里静态链接库文件制作完毕。

下面来说明使用:

创建一个要使用这个库的工程如libtest

第一种方法:

把这个库拷贝到工程目录下,(最好拷贝到vs编译器可以找到的目录下,这个路径在tools---options---projects and soulutions---show libraray的目录下,至于这些目录如何查看,在以前的博客中有相关的文章,这样可以方便编译器编译时候查找到这个库文件)

之后把库头文件拷贝到当前目录下

在libtest的实现文件中,首先包含这个头文件,然后使用pragma指令指明链接库chang.lib,

然后再工程中使用这个函数中的库就可以了,源文件如下:

#include <iostream>
#include "chang.h"

using namespace std;

#pragma comment(lib,"chang.lib")
void main()
{
 cout << fun(2,3) << endl;
}

之后运行就可以了

第二种方法:

这个库文件可以在任意路径下,首先在tools---options---projects and soulutions---show libraray目录下添加这个库文件所在的目录

然后再在工程属性---configuration properties---Linker---Addtional library directories下添加这个库文件所在的目录

在工程属性---configuration properties---Linker---Input---Addtional dependencies添加要使用的库的名字,现在这个就是chang.lib

之后把库文件的头文件拷贝到libtest工程的源文件文件夹下

最后在源文件中就可以不使用pragma指令了,源文件如下:

#include <iostream>
#include "chang.h"

using namespace std;

void main()
{
 cout << fun(2,3) << endl;
}

最后编译运行即可

一些小发现:

当不把头文件拷贝到libtest的时候,直接包含chang.h头文件是不可以的,报找不到头文件

当不包含头文件的时候,直接使用这个库是不可以的,报错是找不到fun函数,

然后当不拷贝头文件到libtest下,而只是在libtest的源文件中进行int fun声明,则可以正常运行;如下:

#include <iostream>
#include "chang.h"

using namespace std;

#pragma comment(lib,"chang.lib")
int fun(int a, int b);
void main()
{
 cout << fun(2,3) << endl;
}

当在libtest下重新实现该函数的时候,会运行重新实现的函数,如下:

#include <iostream>
#include "chang.h"

using namespace std;

#pragma comment(lib,"chang.lib")
int fun(int a, int b);

int fun(int a, int b)
{
 return a - b;
}

void main()
{
 cout << fun(2,3) << endl;
}

有这些现象推测:lib库文件只有函数的二进制实现,而不包含函数的声明,头文件等,

使用的时候也只需要把库链接进来,然后对库中的文件进行完全相同的声明,就可以直接调用库中的文件了,函数名只是索引

但是重新实现后就会运行这个版本,说明执行时候有一定的链接顺序

所以,还是按照一般的做法,把库文件的头文件拷贝过来就好了,只是个人一些推测,还请看到这篇文章的高人指点,呵呵~~