链接库可分为两种:一种为静态链接库lib,一种为动态链接库dll。你可以将它们看成一个仓库,它提供了可以直接拿来使用的变量、函数或类。在现实工作中,你需要给别人提供代码,但是又不想让别人知道你代码的内容,那么,链接库就能解决这个问题。别人只需要调用你做好的链接库,就能实现想要的功能。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以”动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
静态链接库
在VC++6.0中new一个名称为lib的Win32 Static Library工程。并创建一个.h与.cpp的文件。比如(经典例子):
//文件:lib.h
#ifndef LIB_H
#define LIB_H
extern “C” int add(int x,int y);
#endif
//文件:lib.cpp
#include “lib.h”
int add(int x,int y)
{
return x+y;
}
编译这个工程就会显示一个界面,如下图:
这时候,文件中的debug里就会多出一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件交给用户,用户就能直接使用里面的add函数了。
标准Turbo C2.0中的C库函数(我们用的scanf、printf、memcpy、strcpy等就来自静态库)。
调用lib的时候可能会出现一些问题 最常见的就是LINK:fatal error LNK1104:cannot open file...,遇到这个需要上网搜索相关答案,还有一种方法(亲自试过,没有报错):创建一个新的工程Win32 Console Application ,在该工程下创建两个文件,比如abc.c与abc.h。并将上个工程生成的lib.lib与lib.h放到该工程目录下。
//abc.h
#ifndef ABC_H
#define ABC_H
#pragma comment(lib,“lib.lib”);
#endif
//abc.c
#include <stdio.h>
#include “abc.h”
#inlcude “lib.h”
int main(int argc,char** argv)
{
printf(“2 + 3 = %d \n”,add(2,3));
return 0;
}
编译运行,即可得到结果,静态链接库的调用就是这样,或许我们每天都在用,可是没有明白这个概念。代码中#pragma comment(lib,”lib.lib”)的意思是指本文件生成的.obj应与lib.lib一起链接。
如果不用#pragma comment指定,也可以在VC++中设置,具体可以上网查下。
动态链接库
动态链接库的生成与调用与静态链接库还是有一点去别的。在VC++6.0 中可支持三种dll,分别是Non-MFC Dlls(非MFC dll)、Regular Dlls(MFC正规DLL)、Extension Dlls(MFC扩展DLL),在此,要说的是第一种,详细了解可以问度娘。
在VC++6.0中new一个名称为dll的Win32 Dynamic-Link Library工程。并创建一个.h与.cpp的文件。程序代码如下:
//dll.h
#ifndef DLL_H
#define DLL_H
extern “C” int __declspec(dllexport)add(int x,int y);
#endif
//dll.cpp
#include “dll.h”
int add(int x,int y)
{
return x+y;
}
对程序进行编译运行后同样出现如图:
此时在该工程的文件夹debug中生成了两个链接库,一个是dll.lib,一个是dll.dll。
将这两个链接库和头文件一起交给用户,用户就能调用add函数。
调用dll可分为两种方法,一种为纯代码,样本如下:
#include <stdio.h>
#include <windows.h>
typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
hDll = LoadLibrary("..\\Debug\\dll.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
另一种方法就是在VC++6.0里设置,首先创建一个新的工程(Win32 Console Application),并且新建两个文件.cpp与.h。
代码基本没有变化。主要是将dll.lib、dll.dll、dll.h放在该新建的工程中,dll.dll要放在该工程目录下的debug中,然后在VC++6.0中右击工程,选择Add file to project,将dll.h添加进来,dll.lib与dll.h放在一起(也就是说,dll.h与dll.lib放在工程目录下,dll.dll放在debug里);添加完成后,点击Project->setting->Link->modules 在末尾添加dll.lib,点击OK,编译运行即可。