静态链接库(Lib) 与 动态链接库(DLL)

静态链接库(Lib) 与 动态链接库(DLL)

一、VS中添加LIb库及头文件(外部依赖项)的步骤:

1、添加工程的头文件目录:工程—属性—配置属性—c/c+±–常规—附加包含目录:加上头文件存放目录。

2、添加文件引用的lib静态库路径:工程—属性—配置属性—链接器—常规—附加库目录:加上lib文件存放目录。

然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。

3、添加工程引用的dll动态库:把引用的dll放到工程的可执行文件所在的目录下。
————————————————

链接方式 与 lib库

静态链接:在进行代码的编译过程中,将代码直接连接到目标程序中,这样最终只会出现一个执行程序,并且程序执行过程中不需要其他的库文件
动态链接:将调用函数所在的库文件以及调用函数所在文件的位置链接到目标程序,在运行过程中,从对应的库文件中找到相应的代码

区别

静态链接库与动态链接库都是共享代码的方式,
1.如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。

lib库有两种:
   一种是包含了函数所在DLL文件和文件中函数位置的信息,称为导出库;一般现有的DLL,用的是这种库;
   一种是包含函数代码本身,以前在DOS下的TC/BC等,是后这种库。包含函数原型声明的,是头文件(.h)。

二、 静态链接库(Lib)

在VC++6.0中new一个名称为libTest的static library工程,并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下:
//文件:lib.h

#ifndef LIB_H
#define LIB_H
  extern "C" int add(int x,int y);   //声明为C编译、连接方式的外部函数
#endif

//文件:lib.cpp

#include "lib.h"
int add(int x,int y)
{
  return x + y;
}

编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。
静态链接库的调用方法,其源代码如下:

#include
#include “…\lib.h”//不可丢失
#pragma comment( lib, “…\debug\libTest.lib” )  //指定与静态库一起连接
int main(int argc, char* argv[])
{
printf( “2 + 3 = %d”, add( 2, 3 ) );
}

2、动态链接库:

动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。

 对于DLL的导出,可以采用如下方法:

    #ifdef WLL_EXPORTS

    #define WLL_API __declspec(dllexport)

    #else

    #define WLL_API __declspec(dllimport)

    #endif

这是导出类的宏定义,将导出类必须加上该宏,才能被导出。

动态库函数的调用,可以采用静态链接的方式,主要步骤如下:

  1. 包含DLL中导出的头文件。

  2. 采用#pragma comment(lib,“…\debug\libTest.lib”)导入动态库生成的*.lib头文件。或在 Dependencies中加入lib文件。

  3. 将动态库生成的*.dll文件放到EXE或DLL的同一目录下。

LIB文件

目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。

静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。

动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。

导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。

你可能感兴趣的:(工具,windows,c++,开发语言)