什么是C运行时库?
实际上C运行时库是什么,它用于什么? 我正在search,像一个魔鬼一样search,但我找不到比微软更好的东西:“微软的运行时库提供了用于微软Windows操作系统编程的例程,这些例程自动执行许多不是由C和C ++语言“。
好的,我明白了,但例如, libcmt.lib
内容是什么? 它有什么作用? 我认为C标准库是C编译器的一部分。 那么libcmt.lib
是Windows的C标准库函数在win32下工作的实现吗?
是的,libcmt是Microsoft编译器提供的C标准库实现中的一个。 它们提供了三种基本types的库的“debugging”版本和“发布”版本: 单线程 (总是静态链接), multithreading静态链接和multithreadingdynamic链接 (尽pipe取决于编译器版本使用,其中一些可能不存在)。
所以,在“libcmt”这个名字中,“libc”是C库的(或多或less)传统名称。 “mt”的意思是“multithreading”。 一个“debugging”版本将有一个“d”添加到最后,给“libcmtd”。
就其包含的function而言,C标准(第7部分,如果您恰好在意)定义了符合(托pipe)实现必须提供的一组函数。 大多数供应商(包括Microsoft)自己添加了其他各种function(为了兼容性,提供标准function无法解决的function等)。在大多数情况下,它还将包含相当多的由编译器使用的“内部”function但通常不由最终用户。
如果你想获得“libcmt”中的函数的完整列表(使用你的例子),你可以打开一个Visual Studio命令提示符(通常在“Visual Studio工具”下),切换到你的库所在的目录安装,并input如下所示: lib -list libcmt.lib
,它将生成该库中所有对象文件名称的( 长 )列表。 这些并不总是直接对应于function的名称,但通常会给出一个想法。 如果你想查看一个特定的目标文件,你可以使用lib -extract
来提取其中一个目标文件,然后使用`dumpbin / symbols'来查找那个特定目标文件中的函数。
首先,我们应该了解一个运行时库是什么; 并思考“Microsoft C运行时库”的含义。
请参阅: http : //en.wikipedia.org/wiki/Runtime_library
我已经发布了大部分文章,因为它可能会更新。
当一个计算机程序的源代码被编译器翻译成各自的目标语言时,如果程序中的每一个命令和每一个内build函数的调用都会导致就地产生,程序代码将会极大地扩大每次在目标语言中完成相应的程序代码。 相反,编译器经常在运行时库中使用编译器特定的辅助函数,这些辅助函数大部分是应用程序员无法访问的。 根据编译器制造商的不同,运行时库有时也会包含相应编译器的标准库或包含在其中。
在运行时库中还可以执行一些只能执行(或更高效或准确)的函数,例如一些逻辑错误,数组边界检查,dynamictypes检查,exception处理和可能的debuggingfunction。 由于这个原因,直到程序在具有真实数据的“实时”环境中进行testing时才发现一些编程错误,尽pipe复杂的编译时间检查和预发布testing。 在这种情况下,最终用户可能会遇到运行时错误消息。
通常,运行时库通过访问操作系统来实现许多function。 许多编程语言都具有内置函数,这些函数不一定必须在编译器中实现,但可以在运行时库中实现。 所以运行时库和标准库之间的边界取决于编译器制造商。 因此,运行时库始终是编译器特定的和特定于平台的。
运行时库的概念不应该与普通的程序库混淆,如应用程序员创build的程序库,或由第三方或dynamic库(即运行时链接的程序库)交付的程序库。 例如,编程语言C只需要最小的运行时库(通常称为crt0),但是定义了每个实现必须提供的大型标准库(称为C标准库)。
C是一种语言,在它的定义中,不需要任何可用的function。 没有IO,没有math例程等等。 按照惯例,有一组例程可供你使用,你可以链接到你的可执行文件,但是你不需要使用它们。 然而,这是一个很常见的事情,大多数链接程序不要求您再链接到C运行时库。
有些时候你不需要它们,例如,在使用embedded式系统时,使用malloc可能是不切实际的。 我过去一直在将PostScriptembedded到打印机中,而且我们有自己的一套运行时库,这些库在embedded式系统上非常快乐,所以我们没有打扰到“标准”。
运行时库是为您运行的任何C程序自动编译的库。 您使用的库的版本取决于您的编译器,平台,debugging选项和multithreading选项。
运行时库的不同select的一个很好的描述: http : //www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html
它包括那些你通常不认为需要图书馆来调用的function:
- 的malloc
- 枚举,结构
- 绝对,最小
- 断言
微软有一个很好的运行时库函数列表:
http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx
确切的函数列表取决于编译器,因此对于iOS,您将获得其他函数,如dispatch_async()或NSLog()。
如果在从C或C ++编译的可执行文件上使用类似Dependency Walker的工具,则会看到其中一个依赖于的DLL是MSVCRT.DLL。 这是Microsoft C运行时库。 如果你用DW来进一步检查MSVCRT.DLL,你会发现这里是所有的函数,如printf(),puts(0,gets(),atoi()等。
我只是问自己,并伤了我的脑子好几个小时。 仍然没有发现任何真正有意义的东西。 每个写一些话题的人都无法真正“教”。 如果你想教别人,就要用一个人理解的最基本的语言,所以他在处理一个话题时不需要关心其他的话题。 所以我得出了一个似乎适合所有这些混乱的自己的结论。
在编程语言C中,每个程序以main()函数开始。 其他语言可能会定义程序启动的其他function。 但是处理器不知道main()。 处理器只知道预定义的命令,由“0”和“1”的组合表示。
在微处理器编程中,如果没有底层操作系统(Microsoft Windows,Linux,MacOS,..),则需要通过设置ProgrammCounter(PC)来将迭代和跳转(循环,函数调用)明确告诉处理器从何处开始处理器已知的命令。 你需要知道RAM有多大,你需要设置程序堆栈的位置(局部variables),以及堆的位置(dynamicvariables)和全局variables的位置(我把它称为SSA )在RAM内。 一个处理器一次只能执行一个程序。
这就是操作系统进来的地方。操作系统本身是一个运行在处理器上的程序。 一个允许执行自定义代码的程序。 通过切换程序的执行代码(加载到RAM中)一次运行多个程序。 但是操作系统是一个程序,每个程序写的都不一样。 简单地把自定义程序的代码放到RAM中将不会运行它,操作系统不知道它。 您需要在注册程序的操作系统上调用函数,告诉操作系统程序需要多less内存,进入程序的入口点位于何处(main()函数在C的情况下)。 这就是我所说的位于RuntimeLibrary中,并解释了为什么每个操作系统都需要一个特殊的库,导致这些只是程序本身,并有不同的function来做这件事情。
这也解释了为什么它不是作为.dll文件在运行时dynamic链接的,即使它被称为RUNTIMELibrary。 RuntimeLibrary需要静态链接,导致程序启动时需要它。 RuntimeLibrary在RUNTIME中将自定义程序注入/连接到另一个程序(操作系统)。 这真的会导致一些大脑f …
结论:RUNTIMELibrary是命名失败。 在早期可能没有.dll(运行时链接),理解差异的问题根本就不存在。 但是,即使这是真的,这个名字是非常挑选。
RuntimeLibrary的更好名称可能是:StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary
希望我做对了,纠正/扩大欢呼声。
我认为微软的定义确实意味着:
标准C运行时库的Microsoft实现提供…
有三种forms的Win32 SDK提供的C运行库:
* LIBC.LIB is a statically linked library for single-threaded programs. * LIBCMT.LIB is a statically linked library that supports multithreaded programs. * CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT.
Microsoft Visual C ++ 32位版本也包含这三种forms,但是,DLL中的CRT被命名为MSVCRT.LIB。 该DLL是可再发行的。 它的名字取决于VC ++的版本(即MSVCRT10.DLL或MSVCRT20.DLL)。 但请注意,Win32s上不支持MSVCRT10.DLL,而Win32s上支持CRTDLL.LL。 MSVCRT20.DLL有两个版本:一个用于Windows NT,另一个用于Win32。
请参阅: http : //support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9