关于链接库的讲解在这个网址上有不错的讲解: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库文件只有函数的二进制实现,而不包含函数的声明,头文件等,
使用的时候也只需要把库链接进来,然后对库中的文件进行完全相同的声明,就可以直接调用库中的文件了,函数名只是索引
但是重新实现后就会运行这个版本,说明执行时候有一定的链接顺序
所以,还是按照一般的做法,把库文件的头文件拷贝过来就好了,只是个人一些推测,还请看到这篇文章的高人指点,呵呵~~