c运行库,c标准库,windows API的区别和联系
第一个问题,首先你要明白,C语言在某个平台上开发应用需要这个平台的API,但它本身也有自己的函数,C库的部分函数调用了windows API,比如文件读取函数,也有一些是自身的,如字符串操作。 所以它们之间关系你也就明白了。 他们之间的区别在于前者执行效率快,因为前者直接对windows系统实现控制。 第二个问题,头文件只是声明程序要用哪些函数以及什么数据类型,而这些函数体以二进制形式保存dll文件中,winAPI在系统自带的dll中,sin函数则在vc的bin文件下dll文件。 怎么实现sin函数功能的? 在vc目录下有lib文件,是提供这些函数体所在地址。 程序在编译前会告诉编译器用哪些函数,然后在生成.exe可执行文档前会与lib链接,在.exe运行时,要用哪些函数直接查找地址,这由系统完成。 第三个,我想c++库是在c库基础上的拓展。
C/C++库很多,有标准库,不标准库,编译器提供的类库 运行库嘛,,,应该是指运行时所需的资源,包含API
C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的。
API函数
API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的。
区别
他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的。
·1、运行时库就是 C run-time library,是C而非C++语言世界的概念。
取这个名字就是因为你的C程序运行时需要这些库中的函数。
·2、C语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);
所以,C语言内核开发出来之后,Dennis Ritchie和Brian Kernighan就用C本身重写了90%以上的UNIX系统
函数,并且把其中最常用的部分独立出来,形成头文件和对应的LIBRARY,C run-time Library就是这样
形成的。
·3、随后,随着C语言的流行,各个C编译器的生产商/个体/团体都遵循老的传统,在不同平台上都有相对应
的Standard Library,但大部分实现都是与各个平台有关的。由于各个C编译器对C的支持和理解有很多
分歧和微妙的差别,所以就有了ANSI C;ANSI C(主观意图上)详细的规定了C语言各个要素的具体含义
和编译器实现要求,引进了新的函数声明方式,同时订立了Standard Library的标准形式。所以C运行时
库由编译器生产商提供。至于由其他厂商/个人/团体提供的头文件和库函数,应当称为第三方C运行库
(Third party C runtime libraries)。
·4、C run-time library里面含有初始化代码,还有错误处理代码(例如divide by zero处理)。你写的程序
可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,main()
就不会被调用,exit()也不能被响应。因为 C run-time Library 包含了C程序运行的最基本和最常用的
函数。
·5、到了C++世界里,有另外一个概念:Standard C ++ Library,它包括了上面所说的C run-time Library
和STL。包含C run-time Library的原因很明显,C++是C的超集,没有理由再重新来一个C++ run-time
Library。VC针对C++加入的Standard C ++ Library主要包括:LIBCP.LIB、LIBCPMT.LIB和MSVCPRT.LIB。
·6、Windows环境下,VC提供的 C run-time Library又分为动态运行时库和静态运行时库。
动态运行时库
动态运行时库主要包括:
·DLL库文件:msvcrt.dll(或 MSVCRTD.DLL for debug build)
·对应的Import Library文件:MSVCRT.LIB(或 MSVCRTD.LIB for debug build)
静态运行时库
静态运行时库(release版)对应的主要文件包括:
·LIBC.LIB(Single thread static library, retail version)
·LIBCMT.LIB(Multithread static library, retail version)
msvcrt.dll提供几千个C函数,即使是像printf这么低级的函数都在msvcrt.dll里。其实你的程序运行时,很大一部分时间是在这些运行库里运行。在你的程序(release版)被编译时,VC会根据你的编译选项(单线程、多线程或DLL)自动将相应的运行时库文件(libc.lib、libcmt.lib或Import Library msvcrt.lib)链接进来。
2.C运行时库的作用
C运行时库除了给我们提供必要的库函数调用(如memcpy、printf、malloc等)之外,它提供的另一个最重要的功能是为应用程序添加启动函数。
C运行时库启动函数的主要功能为进行程序的初始化,对全局变量进行赋初值,加载用户程序的入口函数。
不采用宽字符集的控制台程序的入口点为mainCRTStartup(void)。下面我们以该函数为例来分析运行时库究竟为我们添加了怎样的入口程序。这个函数在crt0.c中被定义,下列的代码经过了笔者的整理和简化:
void mainCRTStartup(void)
{
int mainret;
/*获得WIN32完整的版本信息*/
_osver = GetVersion();
_winminor = (_osver >> 8) & 0x00FF ;
_winmajor = _osver & 0x00FF ;
_winver = (_winmajor << 8) + _winminor;
_osver = (_osver >> 16) & 0x00FFFF ;
_ioinit(); /* initialize lowio */
/* 获得命令行信息 */
_acmdln = (char *) GetCommandLineA();
/* 获得环境信息 */
_aenvptr = (char *) __crtGetEnvironmentStringsA();
_setargv(); /* 设置命令行参数 */
_setenvp(); /* 设置环境参数 */
_cinit(); /* C数据初始化:全局变量初始化,就在这里!*/
__initenv = _environ;
mainret = main( __argc, __argv, _environ ); /*调用main函数*/
exit( mainret );
}
从以上代码可知,运行库在调用用户程序的main或WinMain函数之前,进行了一些初始化工作。初始化完成后,接着才调用了我们编写的main或WinMain函数。只有这样,我们的C语言运行时库和应用程序才能正常地工作起来。
除了crt0.c外,C运行时库中还包含wcrt0.c、 wincrt0.c、wwincrt0.c三个文件用来提供初始化函数。wcrt0.c是crt0.c的宽字符集版,wincrt0.c中包含 windows应用程序的入口函数,而wwincrt0.c则是wincrt0.c的宽字符集版。
Visual C++的运行时库源代码缺省情况下不被安装。如果您想查看其源代码,则需要重装Visual C++,并在重装在时选中安装运行库源代码选项。
下面看一个未正确使用C运行时库的控制台程序:
#include
#include
int main()
{
CFile file;
CString str("I love you");
TRY
{
file.Open("file.dat",CFile::modeWrite | CFile::modeCreate);
}
CATCH( CFileException, e )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << e->m_cause << "\n";
#endif
}
END_CATCH
file.Write(str,str.GetLength());
file.Close();
}
我们在"rebuild all"的时候发生了link错误:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
main.exe : fatal error LNK1120: 2 unresolved externals
Error executing cl.exe.
发生错误的原因在于Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程。我们只需要在Visual C++6.0中依次点选Project->Settings->C/C++菜单和选项,在Project Options里修改编译选项即可。
C运行库和C标准库的关系
C标准库,顾名思义既然是标准,就是由标准组织制定的。是由“美国国家标准协会(American National Standards Institute,ANSI)”为了规范C语言库而制定的标准。在最初,各个大学各个公司使用的C语言库都不尽相同,造成相互移植非常困难,在这个背景下,制定了这个标准。
C运行库,是和平台相关的,即和操作系统相关的。它由不同操作系统不同开发平台提供不同的C运行库。但是C运行库的部分实现是基于C标准库的,即C运行库是各个操作系统各个开发工具根据自身平台开发的库,某种程度上,可以说C运行库是C标准库的一个扩展库,只是加了很多C标准库所没有的与平台相关的或者不相关的库接口函数。举例子如:c标准库的strcpy函数负责字符串的拷贝,但是由于缺少对目地字符串缓冲区大小的控制,极有可能导致缓冲区溢出(大量的缓冲区溢出攻击都是由于这种漏洞而产生的);相反,Windows提供了能够实现同样功能的安全的字符串拷贝函数,减少了缓冲区攻击的可能,strcpy_s。这些函数是以c运行库的方式提供的,当然,不同的操作系统,c运行时库可能不同,但是对c标准库的支持是完全一致的,也就是说,在不同的操作系统上,使用同一个c标准库的函数必然产生一致的结果。
C标准库中提供的有:
l 标准输入输出(stdio.h)。
l 文件操作(stdio.h)。
l 字符操作(ctype.h)。
l 字符串操作(string.h)。
l 数学函数(math.h)。
l 资源管理(stdlib.h)。
l 格式转换(stdlib.h)。
l 时间/日期(time.h)。
l 断言(assert.h)。
l 各种类型上的常数(limits.h & float.h)。
你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。因为C run-time library包含了C程序运行的最基本和最常用的函数。
如下是C运行库与C标准库的关系:
一个C运行库大致包含了如下功能:
l 启动与退出:包括入口函数及入口函数所依赖的其他函数等。
l 标准函数:由C语言标准规定的C语言标准库所拥有的函数实现。(C标准库)
l I/O:I/O功能的封装和实现,参见上一节中I/O初始化部分。
l 堆:堆的封装和实现,参见上一节中堆初始化部分。
l 语言实现:语言中一些特殊功能的实现。
l 调试:实现调试功能的代码。
操作系统API和C运行库CRT,C标准库之间区别
首先,C语言要早于Windows出现,而且C语言实际标准制定的开始时间也要早于Windows(API概念出现的)系统的开发时间。所以Windows系统在开发的时候是完全可以使用C语言的。目前最多的说法是用C和汇编实现的。那么只要用C,就可能用C标准库。
我们假设两种情况,一是Windows API的实现包含部分C标准库函数的功能实现,这就决定了这部分操作系统API的实现是由调用标准库实现的,那么在发布时需要加入所用到的c标准库DLL一同发布。
二是微软的内核(包括API)开发是使用着一个和平台严格相关的C语言的静态的链接库,这样不必提供Dll也能开发和发行。而且必然的这个C库是在汇编的基础上实现的,也就是说这个库里面的C函数都是(至少有很大比例)披着C语法的汇编代码。
要你是微软,你选择哪个呢?也许是两者兼而有之,也许是后者。
一般情况下,我们说C运行库暗含的意思是哪种平台哪个开发平台的C运行库,
CRT的实现是基于Windows API的,而WindowsAPI的开发也是基于C语言的,但不是或者不一定基于CRT(或者C标准库)的。
再深一步,虽然CRT是基于操作系统 API实现的,但并不代表所有的CRT封装了操作系统 API,如一些用户的权限控制,操作系统线程创建等都不属于C运行库,于是对于这些操作我们就不得不直接调用操作系统API或者其他库。
总结一下,C标准库就是任何平台都可以使用的基本C语言库。而CRT除了将C标准库加入所属范围外,还扩展了与平台相关的接口库,这些接口实现根据不同平台调用不同平台的操作系统API。
如下图所示,采用C标准库编写的程序可以应用到windows平台,也可以应用到linux平台;而用CRT另外与平台相关的库函数编写的应用程序不能跨平台运行。
c++运行库错误怎么修复
2. 更新编译器 编译器的问题也可能导致运行库错误。如果你的编译器版本过旧,可能会出现与最新C++标准不兼容的情况。访问编译器的官方网站,下载并安装最新版本的编译器,这通常可以解决兼容性问题。3. 检查代码依赖 有时候,运行库错误可能是由于代码中依赖的库文件版本不匹配或缺失导致的。检查你的项目...
VC2005运行库是干什么用的?
就是windows为实现C\/C++语言而提供的一系列函数,如strcpy,strcat,printf等等。即c\/c++的标准库函数或标准模板库。换句话说,如果你不使用c\/c++的库函数或标准类库,那么你编译出的程序就不依赖运行库。
我电脑里有这么多个Microsoft Visual C++ 有什么用,可以卸载么
这些都是一些微软的组件,里面包括一些C++标准库、原始数据库等相关信息,比如QQ这款软件里面有部分是用C++写的,如果没有C++标准库的支持,你的软件是无法运行的,还有一些游戏,如魔兽亦如此 这些组件除电脑自带外,还有就是你安装的vc也会附带,如果你卸载vc后这些组件是不会删除的,所以微软软件往往...
visual c++2015运行库在哪里?
microsoft visual c++ 2015是一些软件支持的必备运行库,有些软件需要的到c++ 2015才能运行,误删会导致个别软件无法正常使用。VisualC++2015,2012年5月26日发布,支持.net4.5beta,并实现golive。只能安装于win7或者更高的windows操作系统。可以开发windows8专用的ModernUI风格的应用程序。相比2010又...
Windows系统常用运行库有哪些?
利用先进的渲染引擎和优化算法,搜狗高速浏览器确保了卓越的页面加载速度和流畅的多媒体体验。具备全方位的安全防护特性,能有效防御各类网络威胁,同时支持HTML5和CSS3,确保了与最新网络技术标准的完美兼容。欲了解更多或立即下载,请访问https:\/\/sogou.37moyu.com\/ 说到Windows系统常用的运行库,我首先要...
vc2005运行库x86是什么
vc2005运行库x86是一款编程工具,在用户打开软件和游戏的时候经常会出现报错。下载vc2005将可以直接帮助你解决此类问题,让用户在的打开软件与游戏。有需要的用户不妨快来下载体验尝试一下吧!vc2005运行库x86特色:1、本软件包安装了CRT(C运行时),标准C ++,ATL,MFC,OpenMP和MSDIA库的运行时组件。2...
microsoft visual c++这程序电脑里有很多 可不可以删掉几个?_百度知 ...
00Microsoft .NET Framework 4.0 2、游戏运行库 00DirectX 9.0C (2010.6)00Open Audio Library 2.07(OpenAL)00NVIDIA PhysX System 9.10.0514 00Microsoft XNA Framework 3.1 3、其他运行库 00Java 运行库 7 Update1(JRE)00微软 ActiveX 公共控件 00微软标准C运行库(VC1)00Visual Basic 1 ...
请问大佬有VC++2008运行库 32位&64位 完整版软件免费百度云资源吗_百度...
《VC++2008运行库》百度网盘免费资源下载:链接: https:\/\/pan.baidu.com\/s\/11nc9HqKA8yjRr1y5R-FBTA 提取码: 5ssa 介绍:vc++2008运行库是vc++在Windows中运行的必备辅助程序,提供了C、标准C++、ATL、MFC、OpenMP以及MSDIA等类库的运行支持,让用户可以在未安装VisualC++2008的计算机上运行VisualC++...
为什么我的游戏一直显示get the read context failed?
解决方法 1、装个完整运行库。2、重新运行试试,如果不行把游戏卸载再重新安装,卸载时要把残留卸干净。如果问题还一样,试试下载个驱动精灵更新设备驱动!软件和3D设置。其他运行库 Java运行库7 Update1(JRE)。java运行库8 update。java运行库9。微软ActiveX公共控件。微软标准C运行库(VC1)。Visual ...
用ddk checked build环境,怎么c标准库函数没定义
驱动程序不能和标准C运行库相连,C运行库需要初始化,试图初始化一个堆栈区,这会干扰正确的驱动程序的操作。
何杨盐酸: 第一个问题,首先你要明白,C语言在某个平台上开发应用需要这个平台的API,但它本身也有自己的函数,C库的部分函数调用了windows API,比如文件读取函数,也有一些是自身的,如字符串操作. 所以它们之间关系你也就明白了. 他们之...
让胡路区13250292592: c运行时库和c标准库一样吗? - ?
何杨盐酸: 你好!!!有c标准库这个说法的,首先标准库的就是一些已经编译好的函数,比如:求绝对值,什么sin(),cos()函数,这些函数都已经编写好了,我们要是想使用这些函数只需要加入相关的头文件即可.这个已经写好的函数就组成了函数库.也就是我们所说的c标准库. 再补充点: runtime library是编译器提供的标准库库,提供了基本的库函数和系统调用,我们一般使用的runtime library是c runtime library. c runtime library实现利ANSICa标准的库.我们所说的非标准库就是哪些没有被专家承认的函数,但是我们并不能说这样的函数就不好.
让胡路区13250292592: c的标准库和运行时库有什么区别 - ?
何杨盐酸: c标准库包括常用的数学函数、字符串操作函数等等,这些函数都是由编程高手写的,效率高,很少出错,而且是完全符合c语言标准的函数. c运行库可以说是c标准库的扩展集,它是完全包含c标准库,但是在此基础之上添加了一些额外的函数...
让胡路区13250292592: C运行库头文件 Windows头文件 区别是什么 - ?
何杨盐酸: C运行库头文件是VC自带的,也是一直以来c语言一脉相承延用下来的,包含一些常用函数及算法,头文件一般在C:\Program Files\Microsoft Visual Studio 9.0\VC\include下面.Windows库文件及头文件是Windows自己特有的东西,包含了和Windows相关的一些操作,是Windows SDK的一部分,头文件一般在C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include
让胡路区13250292592: msvcrt.dll是什么? - ?
何杨盐酸: msvcrt.dll 是微软在windows操作系统中提供的C语言运行库执行文件(Microsoft C Runtime Library),其中提供了printf,malloc,strcpy等C语言库函数的具体运行实现,并且为使用C/C++(Vc)编绎的程序提供了初始化(如获取命令行参数)以及退...
让胡路区13250292592: linux下的c与windows下的c的区别 - ?
何杨盐酸: linux :库 编辑器 编译器 都是分别安装的 运用灵活 windows: 一般是集成开发环境,包含了上述东西 c都有个标准库,那个是一样的,其他的就不一定一样了,linux下的库可以等你需要时再安装进系统,还有相关文档说明 linux下有c++的 其实linux下有个很强大的glibc库,他将c重新封装,直接可以用c进行面向对象的开发
让胡路区13250292592: Win7运行库一共有哪几种啊?一般需要哪几种就够了 - ?
何杨盐酸: Java、Sliverlight、Adobe flash、Visual C++、.Net Framework、DirectX等等 运行库列表: 1、常用运行库 Visual Basic 6.0 公共控件 Visual C++ 2003 运行库(VC7) Visual C++ 2005 运行库(VC8) Visual C++ 2008 运行库(VC9) Visual C+...
让胡路区13250292592: 使用标准的windows库 运行库怎么选择 - ?
何杨盐酸: 第一个问题,首先你要明白,C语言在某个平台上开发应用需要这个平台的API,但它本身也有自己的函数,C库的部分函数调用了windows API,比如文件读取函数,也有一些是自身的,如字符串操作. 所以它们之间关系你也就明白了. 他们之...
让胡路区13250292592: 小白求教,程序运行为什么和操作系统有关,比如c开发的程序,为什么只能在windows上运行 - ?
何杨盐酸: 不同程序经过编译后生成的目标代码不一样,就像同一篇中文,只有翻译成德语在德国才能使用,翻译成法语在法国才能使用.更正一点,C开发的程序,在LINUX环境下一般是能执行的.
让胡路区13250292592: C运行库是什么? - ?
何杨盐酸: C运行库,是函数库,比方说你使用C语言的printf()函数,而它具体的实现就是在C运行库中的,应该大概就是这样.