1. 静态库和动态库

1.1 静态库(.lib)

函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.EXE文件)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。

1.2 动态库(.lib文件和.dll文件)

在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件(也称“导入库文件”)和一个DLL(.dll)文件。虽然引入库的后缀名也是“lib”,但是,动态库的引入库文件和静态库文件有着本质的区别,对一个DLL文件来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不可复制到可执行文件,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。这时,在发布产品时,除了发布可执行文件以外,同时还需要发布该程序将要调用的动态链接库。

Windows 系统平台上你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Windows自己就将一些主要的系统功能以 DLL模块的形式实现。Windows为应用程序提供了丰富的函数调用,这些函数调用都包含在动态链接库中。其中有3个最重要的 DLL:

Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;

User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;

GDI32.dll,它包含用于画图和显示文本的各个函数。

当Windows .exe程序被加载到内存中时,程序中的调用被指向DLL函数的入口,如果DLL不在内存中,系统就将其加载到内存中。当链接Windows程序以产生一个可执行文件时,你必须链接由编程环境提供的专门的 “引入库(import library)”。这些引入库包含了动态链接库名称和所有Windows函数调用的引用信息。链接程序使用该信息在.EXE文件中构造一个表,当加载程序时,Windows使用它将调用转换为Windows函数。

1.3 引入库和静态库的区别

引入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于引入库而言,其实际的执行代码位于动态库中,引入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。但是引入库文件的引入方式和静态库一样,要在链接路径上添加找到这些.lib的路径。

2.  VS链接lib文件

在VS中添加lib文件的方法有两种:

1)程序中头文件之后通过pragma指定。

#pragma comment(lib,"../lib/libmysql.lib")

2)VS中指定目录和库名。

2.1 VS导入库和头文件

VS中添加lib库和头文件(外部依赖项)步骤:

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

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

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

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

3. VS运行库MT和MD区别

VS项目属性->配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)。

/MT是 “multithread, static version”,意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib 安置到OBJ文件中,让链接器使用LIBCMT.lib 处理外部符号。

/MD是 “multithread- and DLL-specific version”,意思是多线程DLL版本,定义了它后,编译器把 MSVCRT.lib 安置到OBJ文件中,它连接到DLL的方式是静态链接,实际上工作的库是MSVCR80.DLL。

即:

静态运行时库:LIBCMT.lib

动态运行时库:MSVCRT.lib + MSVCR80.DLL

其中以小写“d”结尾的选项表示的DEBUG版本的,没有“d”的为RELEASE版本。大型项目中必须要求所有组件和第三方库的运行时库是统一的,否则将会出现LNK2005井喷。

单线程运行时库选项/ML和/MLd在VS2003以后就被废了。

参考:

1. vs中c++添加lib库和头文件(外部依赖项)

2. 静态库和动态库的区别,lib文件和dll文件的配置方法

3. VS 运行库MT、MD的区别

4. vc++编译时运行库选择(/MT、/MTd、/MD、/MDd)

转载于:https://www.cnblogs.com/embedded-linux/p/11469900.html

windows动态库和静态库VS导入相关推荐

  1. 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

    文章目录 I . CMake 简介 II . Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) ...

  2. 结合CmakeList来更好地理解windows下的动态库和静态库

    动态库和静态库的输出 window下输出的静态库为.lib文件,用于包含所有的函数,以及函数的实现,以及其他的一些东西,所以文件较大:输出的动态库包含.lib文件和.dll文件,.lib文件主要包含接 ...

  3. 动态库、静态库、运行时库、引入库之间的区别

    动态库.静态库.运行时库.引入库之间的区别 杂集.捡对口味的看看吧. 转自:http://lingualspark.blog.sohu.com/94785899.html 运行时库:Unix中一个典型 ...

  4. Linux中的动态库和静态库(.a/.la/.so/.o)

    为什么80%的码农都做不了架构师?>>>    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序 ...

  5. c语言仿ce内存搜索工 源代码_C语言函数库:动态库和静态库优缺点比较

    函数的重要性 我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护.我们可以把他们制 ...

  6. 动态库与静态库优缺点比较(转 侵删)

    动态库与静态库优缺点比较 2017-10-09   13:32:01      我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效 ...

  7. Linux库概念及相关编程(动态库、静态库、环境变量)

    分文件编程: 好处:分模块编程思想,功能和责任划分清楚便与调试,main函数简洁,代码易于阅读. 编程时头文件有的是使用<>这个符号括起来的,有的是" "使用的是双引号 ...

  8. sqlserver如何定义一个静态变量_[Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库...

    1 前言 2 自定义规则实现 2.1 规则功能 2.2 实现规则的理论基础 2.3 规则代码实现 3 总结 4 参考资料 1 前言 为了实现如标题所述的将多个静态库合并为一个动态库,内置的 Bazel ...

  9. C语言函数库:动态库和静态库优缺点比较

    函数的重要性 我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护.我们可以把他们制 ...

  10. 操作系统之动态库和静态库

    什么是库? 平时在写代码的时候会经常添加一些头文件,添加这些头文件其实是让编译器从一个目录下去寻找这个文件,这个目录就是我们常说的库.在Linux中库一般存放在user/lib目录.库就是将一些常用的 ...

最新文章

  1. [译]ElasticSearch数据类型--string类型已死, 字符串数据永生
  2. vue笔记(二)Vue-class与style、事件、计算属性、数据监听、指令+自定义指令、过滤器
  3. 程序员面试金典 - 面试题 05.02. 二进制数转字符串(浮点型 转 二进制小数,乘2取整)
  4. zookeeper基础整理
  5. 往map里的vector添加_面试官:同步容器(如Vector)的所有操作一定是线程安全的吗?...
  6. wmic cpu get processorid获取的都一样_DJL 之 Java 玩转多维数组,就像 NumPy 一样
  7. MySQL千万级访问量架构(转)
  8. 前端—每天5道面试题(3)
  9. OLAP-presto-大数据Week13-DAY-presto
  10. 挑战练习题2.3动态规划 poj3046 Ant Counting dp
  11. weex 项目开发(五)自定义 过滤函数 和 混合 及 自定义 Header 组件
  12. Win10 SAS9.4缺少增强型编辑器
  13. 倒立摆源代码仿真matlab/simulink神经网络PID(模糊)控制校正LQR 神经网络 倒立摆控制 倒立摆LQR控制仿真 单级倒立摆的模糊控制 旋转倒立摆
  14. 区分 WDM驱动和NT驱动(有待继续思考)
  15. 从0开发豆果美食小程序——项目搭建
  16. win10迁移C盘Administrator目录
  17. css 如何实现文本竖排、横排展示
  18. FFT(快速傅里叶变化)学习
  19. python用户输入文字_python中用户输入的关键字
  20. 详解CorelDRAW X7的多种视图显示模式

热门文章

  1. 异质图神经网络及其在电商领域中的应用
  2. java对mysql的简单操作的综合运用——登录系统
  3. matlab幂次变换代码,常用的一些图像处理Matlab源代码
  4. linux脚本初尝滋味-----编写与执行
  5. 博为峰Java技术题 ——JavaSE Java 方法Ⅰ
  6. 数据库快照,自定义函数与计算列
  7. Cesium颜色调整
  8. 试驾小程序_Linux如何成为Linux:试驾1993-2003发行版
  9. ipsec加密技术谁提出的_如何提出技术问题以获得高质量的答案
  10. grace hopper_开源日,在Grace Hopper会议上建立FOSS技能