前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[C-C++]你所不知道的C和C++运行库

[C-C++]你所不知道的C和C++运行库

作者头像
祥知道
发布于 2020-03-10 08:38:11
发布于 2020-03-10 08:38:11
1.7K0
举报
文章被收录于专栏:祥的专栏祥的专栏
原创文章

文章目录
  • @[toc]
  • 从C和C++运行库说起
  • VC++在何处实现C和C++运行库
  • 动态版(DLL)和静态版(LIB)C和C++运行库的优缺点

原文:你所不知道的C和C++运行库 转载后只做了格式上的编辑,原文如下:


周五晚,小雨,少见的未加班。无聊,遂准备写一篇博客,介绍一下C和C++运行库,只因发现工作几年的人对此一知半解的大有人在。 在使用VC构建项目时,经常会遇到下面的链接错误:

初学者面对这些错误常常不知所错:libcmt.lib是什么东西?msvcrtd.dll又是干吗用的?在使用VC++时我们也常常对下面的运行库配置项感到疑惑,它们到底究竟是什么意思呢?甚至一些工作了很多年的程序员也对此一知半解。今天让我们来了解一下它们。

从C和C++运行库说起

为了提高C语言的开发效率,C标准定义了一系列常用的函数,称为C库函数C标准仅仅定义了函数原型,并没有提供实现。因此这个任务留给了各个支持C语言标准的编译器。每个编译器通常实现了标准C的超集,称为C运行时库(C Run Time Libray) ,简称CRT。对于VC++编译器来说,它提供的CRT库支持C标准定义的标准C函数,同时也有一些专门针对windows系统特别设计的函数

与C语言类似,C++也定义了自己的标准,同时提供相关支持库,我们把它称为C++运行时库C++标准库

由于C++对C的兼容性C++标准库包括了C标准库,除此之外还包括IO流标准模板库STL

VC++在何处实现C和C++运行库

VC++完美的支持C和C++标准,因此也就按照C和C++的标准定义的函数原型实现了上述运行时库。为了方便有不同需求的客户的使用,VC++分别实现了动态链接库DLL版本静态库LIB版本。同时为了支持程序调试且不影响程序的性能,又分别提供了对应的调试版本。调试版本的名称在Release版本名称后添了字母d

对于C运行时库CRTVC6.0VC2005VC2008VC2010均提供了DLL版本LIB版本。上述各个编译器提供的LIB版的CRT库,均实现在libcmt.lib。对应的调试版名称为libcmtd.lib

而DLL版本名称根据编译器不同而不同,我们可以从名称上加以分辨:

  • VC6.0使用的CRT库的DLL版本在MSVCRT.DLL中实现, 对应调试版本为MSVCRTD.LIB
  • VC2005使用的CRT库的DLL版本在MSVCR80.DLL中实现,对应调试版本为MSVCR80.DLL
  • VC2008使用的CRT库的DLL版本在MSVCR90.DLL中实现,对应调试版本为MSVCR90D.DLL
  • VC2010使用的CRT库的DLL版本在MSVCR100.DLL中实现,对应调试版本为MSVCR100D.DLL

C++标准兼容C标准,但VC各版本C++编译器使用的C标准库与C编译器使用的C运行库一起实现,它们使用相同的运行库

对于C++标准库中的IO流STL,VC6.0、VC2005、VC2008和VC2010也提供了DLL版本LIB版本

LIB版均实现在libcpmt.lib中,对应的调试版本为libcpmtd.lib

不同版本的编译器实现的DLL也不相同:

  • VC6.0使用的C++类库的 DLL版本在MSVCP60.DLL中实现, 对应调试版本为MSVCP60D.LIB
  • VC2005使用的C++类库的DLL版本在MSVCP80.DLL中实现,对应调试版本为MSVCP80.DLL
  • VC2008使用的C++类库的 DLL版本在MSVCP90.DLL中实现,对应调试版本为MSVCP90D.DLL
  • VC2010使用的C++类库的DLL版本在MSVCP100.DLL中实现,对应调试版本为MSVCP100D.DLL

在各个版本的编译器中,我们可以通过配置选项来设置程序使用的C和C++运行时库的类型。如下图(其他版本编译器大同小异):

  • MT选项链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库集成到程序中成为程序中的代码程序体积会变大
  • MTd选项LIB的调试版
  • MD选项使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL程序体积会减小,缺点是在系统没有对应DLL时程序无法运行
  • MDd选项表示使用DLL的调试版

《由使用LeakDialog时遇到的问题而引出的一些分析》这篇文章中的实验一,使用VC6.0的默认配置没有拦截到内存泄露。其原因是VC6.0的控制台项目默认配置是静态链接CRT库(单线程版,后面会介绍)。

动态版(DLL)和静态版(LIB)C和C++运行库的优缺点

因为静态版必须把C和C++运行库复制到目标程序中,所以产生的可执行文件会比较大。同时对于使用多个模块大型软件来说,如果每个模块均选择静态链接C或C++运行库,在程序运行时就会存在多个运行库。在链接时也会出现重复定义的问题,如文章首第一张图所示。

使用DLL版的C和C++运行库,程序在运行时动态的加载对应的DLL。程序体积变小,但一个很大的问题就是一旦找不到对应DLL,程序将无法运行。假设使用VC6.0并选择使用MD选项构建,那么当用户使用VC2005来使用这个DLL时很可能出现找不到MSVCRT.DLLMSVCP60.DLL的情况。

在这里介绍一个很好的工具:Dependency Walker,可以用来分析DLL的依赖关系,同时查看DLL导出的函数,使用方法请Google。

使用该工具打开MSVCRT.DLL,如下图:

我们可以在其中找到我们经常使用使用的C函数,如printfgetcharmalloc等。

打开MSVCP100.DLL,也可以找到这些C函数

在开发的过程中我们也会遇到如下图的链接错误,LIBCD.lib究竟是何方神圣呢?

它其实是LIBC.lib的调试版,而LIBC.lib是只有在VC6.0才会使用的静态库,该库是CRT的单线程版,用于支持单线程版本的CRTVC2005等更高版本的编译器已经不再提供单线程版本,转而使用多线程版的MSVCR80.DLLlibcmt.lib。 当遇到上述符号定义冲突的链接错误时,可以选择忽略libcd.lib

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​ 机器学习(九) ——构建决策树(离散特征值)
机器学习(九) ——构建决策树(离散特征值) (原创内容,转载请注明来源,谢谢) 一、概述 1、概念 决策树,这个概念是一个很常见的概念,应该是机器学习中最好理解的一个算法。决策树是在已知训练结果
用户1327360
2018/03/07
2.4K0
​ 机器学习(九) ——构建决策树(离散特征值)
用python实现决策树ID3算法,对隐形眼镜类型预测
本节讲解如何预测患者需要佩戴的隐形眼镜类型。 1、使用决策树预测隐形眼镜类型的一般流程 (1)收集数据:提供的文本文件(数据来源于UCI数据库) (2)准备数据:解析tab键分隔的数据行 (3)分析数
机器学习AI算法工程
2018/03/14
1.6K0
用python实现决策树ID3算法,对隐形眼镜类型预测
决策树(二)
有了决策树,我们就可以根据样本的特征值来执行分类。遇到判断节点则递归调用,遇到叶子节点则终止,返回叶子节点的分类标签:
用户6021899
2019/08/14
4340
机器学习--决策树(ID3)算法及案例
1 基本原理 决策树是一个预测模型。它代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,每个分支路径代表某个可能的属性值,每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。一般情况下,决策树由决策结点、分支路径和叶结点组成。在选择哪个属性作为结点的时候,采用信息论原理,计算信息增益,获得最大信息增益的属性就是最好的选择。信息增益是指原有数据集的熵减去按某个属性分类后数据集的熵所得的差值。然后采用递归的原则处理数据集,并得到了我们需要的决策树。 2 算法流程
机器学习AI算法工程
2018/03/12
1.8K0
机器学习--决策树(ID3)算法及案例
机器学习--决策树算法(CART)
​ 我们知道,在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益比来选择特征,以减少信息增益容易选择特征值多的特征的问题。但是无论是ID3还是C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算。能不能简化模型同时也不至于完全丢失熵模型的优点呢?有!CART分类树算法使用基尼系数 来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。
Kindear
2021/11/24
1.1K0
机器学习--决策树算法(CART)
Python AI 教学 | 决策树算法及应用
决策树是一种简单高效并且具有强解释性的模型,广泛应用于数据分析领域。其本质是一颗由多个判断节点组成的树,可以是二叉树或非二叉树。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
短短的路走走停停
2019/07/10
6650
机器学习笔记(四)——决策树的构建及可视化
本文以一个新的数据集(隐形眼镜数据集)为基础实现构建决策树、决策树的保存与加载、利用决策树分类、决策树的可视化,前文的知识不在过多概述,着重介绍这四个方面。
奶糖猫
2020/07/07
2.1K0
机器学习笔记(四)——决策树的构建及可视化
机器学习(四)—决策树
摘要:本文首先浅谈了自己对决策树的理解,进而通过Python一步步构造决策树,并通过Matplotlib更直观的绘制树形图,最后,选取相应的数据集对算法进行测试。
oYabea
2020/09/07
5040
机器学习实战教程(三):决策树实战篇之为自己配个隐形眼镜
原文链接:https://cuijiahua.com/blog/2017/11/ml_3_decision_tree_2.html
圆方圆PYTHON学院
2019/01/03
1.7K0
机器学习实战教程(三):决策树实战篇之为自己配个隐形眼镜
【白话机器学习】算法理论+实战之决策树
如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的, 常见的机器学习算法:
Datawhale
2020/03/04
7130
【白话机器学习】算法理论+实战之决策树
《机器学习实战》 - 决策树
知道如何计算信息增益,我们就可以计算 每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择。
yiyun
2022/04/01
7650
《机器学习实战》 - 决策树
python机器学习实战(二)
http://www.cnblogs.com/fydeblog/p/7159775.html
努力努力再努力F
2018/09/11
1.4K0
python机器学习实战(二)
R语言与机器学习(分类算法)决策树算法
决策树定义 首先,我们来谈谈什么是决策树。我们还是以鸢尾花为例子来说明这个问题。 观察上图,我们判决鸢尾花的思考过程可以这么来描述:花瓣的长度小于2.4cm的是setos
机器学习AI算法工程
2018/03/12
2K0
R语言与机器学习(分类算法)决策树算法
机器学习--决策树算法
在生活中,“树”这一模型有很广泛的应用,事实证明,它在机器学习分类和回归领域也有着深刻而广泛的影响。在决策分析中,决策树可以明确直观的展现出决策结果和决策过程。如名所示,它使用树状决策模型。它不仅仅是在数据挖掘中用户获取特定目标解的策略,同时也被广泛的应用于机器学习。
Kindear
2021/10/26
6440
常见面试算法:决策树、随机森林和AdaBoost
决策树(Decision Tree)算法是一种基本的分类与回归方法,是最经常使用的数据挖掘算法之一。我们这章节只讨论用于分类的决策树。
机器学习AI算法工程
2019/10/28
1.3K0
常见面试算法:决策树、随机森林和AdaBoost
【Python机器学习】系列五决策树非线性回归与分类(深度详细附源码)
查看之前文章请点击右上角,关注并且查看历史消息 所有文章全部分类和整理,让您更方便查找阅读。请在页面菜单里查找。 相关内容:(点击标题可查看原文) 第1章 机器学习基础 将机器学习定义成一种通过学习经验改善工作效果的程序研究与设计过程。其他章节都以这个定义为基础,后面每一章里介绍的机器学习模型都是按照这个思路解决任务,评估效果。 第2章 线性回归 介绍线性回归模型,一种解释变量和模型参数与连续的响应变量相关的模型。本章介绍成本函数的定义,通过最小二乘法求解模型参数获得最优模型。 第3章 特征提取与
量化投资与机器学习微信公众号
2018/01/29
2K0
【机器学习实战】第3章 决策树
第3章 决策树 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=
片刻
2018/01/05
1.1K0
【机器学习实战】第3章 决策树
【Python机器学习实战】决策树和集成学习(二)——决策树的实现
摘要:上一节对决策树的基本原理进行了梳理,本节主要根据其原理做一个逻辑的实现,然后调用sklearn的包实现决策树分类。
冬夜先生
2021/09/08
9410
【机器学习】决策树
本文介绍了 ID3,C4.5,CART三种基本的决策树模型。首先介绍了决策树的特征选择,包括信息增益,信息增益率、基尼指数、最小均方差分别对应分类树ID3、C4.5、CART、回归树CART。然后介绍了决策树建树的一般流程、对比分类树和回归树建树的区别。最后介绍了树模型中避免过拟合问题的剪枝方法,包括前剪枝和后剪枝。
yuquanle
2020/04/01
6790
【机器学习】决策树
决策树(Decision Tree)ID3算法
决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。
统计学家
2019/04/08
7830
推荐阅读
相关推荐
​ 机器学习(九) ——构建决策树(离散特征值)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档