静态链接库(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_Hextern "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 <stdio.h>
#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获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。

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

静态链接库(Lib) 与 动态链接库(DLL)相关推荐

  1. 静态链接库(.lib)和动态链接库(.dll)的使用

    静态链接库(.lib)和动态链接库(.dll)的使用 文章目录 静态链接库(.lib)和动态链接库(.dll)的使用 一.静态链接库 1. 静态链接库概述 2. 创建静态链接库 3. 调用静态链接库 ...

  2. 静态链接库(Lib)和动态链接库(DLL)

    序言:本文主要讲解静态链接库和动态链接库的区别,以及怎么样编译和引用两种库,怎么样从DLL中导出函数和导出C++类. 一.静态链接库和动态链接库 1.静态链接库(.LIB):函数和数据被编译进一个二进 ...

  3. lib库反编译C语言,C语言静态链接库(lib)与动态链接库(dll)

    今天看到了之前的笔记,看到之前写的笔记,感觉自己都不认得了~~一.静态链接库(lib) 首先创建    "在VC6中创建项目:Win32 Static Library" 在项目中创 ...

  4. 静态链接库LIB和动态链接库DLL的区别 创建和示例

    1.什么是静态连接库,什么是动态链接库   静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意, lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了. 但是若使 ...

  5. 浅谈静态链接库(SLL)和动态链接库(DLL)

    静态链接库和动态链接库 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件:动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信 ...

  6. MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用

    静态链接库LIB和动态链接库DLL的区别,创建和示例   1.什么是静态连接库,什么是动态链接库   静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都 ...

  7. 动态链接库dll,静态链接库lib, 导入库lib 转

    动态链接库dll,静态链接库lib, 导入库lib 在用VS编译工程的时候,我们会选择动态链接库dll,静态链接库lib(static library),可是为什么在编译动态链接库的时候也可以指定输出 ...

  8. windows 调用linux .a lib,动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a)...

    动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a) 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀.例如:libhello.so libhello ...

  9. Python3源码编译和使用静态链接库lib动态链接库dll详细介绍

    说明: 本文主要介绍: 1.python3源码的下载和编译内核工程(pythoncore) 2.编译的lib和dll使用例子. 若需要编译源码PCBuild下其他python工程,类似参考内核工程(p ...

最新文章

  1. 职场的你,如何《赢》?
  2. 每天一个linux命令(49):at命令
  3. python爬虫教程网-Python爬虫全集
  4. Apache Solr入门教程
  5. iphone手机备忘录迁移_如何在iPhone和iPad上使用语音备忘录
  6. 目前市场上用于个人计算机的硬盘尺寸是,第5章-硬盘(计算机组装与维护).docx
  7. 传动系统结构简图_立式砂磨机与卧式砂磨机的结构特点比较
  8. ubuntu 64 12.04 oracle,Ubuntu 12.04 (amd64)安装Oracle 11g 总结
  9. GitHub优秀移动开源项目大集合
  10. 2021年新版阿里云服务器价格表(收费标准报价)
  11. 三国英杰之赵云传java7723_幻世三国之赵云传奇
  12. -1 转换成二进制数是多少,负数左移右移。
  13. 分时线的9代表什么_一位从亏损到稳赚的老股民告诉你:为什么要打板?
  14. 01_ue4进阶_PBR材质
  15. 世界著名设计公司-网址介绍
  16. win10系统没声音 服务器,win10电脑突然没有声音的10种修复方法
  17. xshell上传文件出现:unknown error的解决办法
  18. 五款功能强大的国产软件,常常被误认为是外国人开发的
  19. 蓝桥杯-杨辉三角形-python
  20. php 腾讯短信接口api,浅谈PHP使用腾讯云发送短信

热门文章

  1. vue 路由懒加载 报错 Loading chunk * failed 组件加载不出来
  2. maya RedShift 渲染报警告:细分问题
  3. MySQL 手动配置环境变量(详细)
  4. 【笔记】python中的for循环(遍历列表)、for循环中的一些缩进问题
  5. Python数据结构与算法基础|第二期:代码实现——栈的顺序存储与链式存储
  6. 惯性室内导航入门之PDR (步行者航位推算)
  7. Java的各个应用平台
  8. html中js计算百钱百鸡,JS经典案例之百钱百鸡
  9. ZSL (zero shutter lag)
  10. wps在线预览接口_WPS文档在线预览接入的一点心得