什么是 C 运行时库?

C运行时库到底是什么?它的用途是什么?我在谷歌上疯狂搜索,但我找不到比微软更好的:“微软运行时库为微软Windows操作系统提供编程示例。这些示例自动化了许多 C 和 C++ 语言没有提供的常见编程任务。”

好的,我明白了,但是举个例子,在libcmt.lib中有什么?它能做什么?我以为C标准库是C编译器的一部分。那么libcmt.lib Windows的C标准库函数的实现在win32下工作吗?

93573 次浏览

我认为微软的定义真正的意思是:

的微软实现 标准C运行时库提供

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位版本也包含这三种形式,但是DLL中的CRT名为MSVCRT.LIB。DLL是可重新分发的。它的名字取决于vc++的版本(即MSVCRT10.DLL或MSVCRT20.DLL)。但是请注意,win32上不支持MSVCRT10.DLL,而CRTDLL. dll不支持win32。在win32上支持LIB。dll有两个版本:一个用于Windows NT,另一个用于win32。

看:http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

C是一种语言,在它的定义中,不需要为您提供任何函数。没有IO,没有数学程序等等。按照惯例,你可以将一组可用的例程链接到可执行文件中,但你不能需要来使用它们。然而,这是一件很常见的事情,以至于大多数链接器不再要求你链接到C运行时库。

有时您不需要它们——例如,在使用嵌入式系统时,使用malloc可能是不切实际的。我曾经致力于将PostScript嵌入到打印机中,我们有自己的一组运行时库,它们更适合嵌入式系统,所以我们没有为“标准”而烦恼。

如果你在C或c++编译的可执行文件上使用依赖沃克这样的工具,你会看到它所依赖的dll之一是MSVCRT.DLL。这是微软C运行时库。如果你用DW进一步检查MSVCRT.DLL,你会发现这是所有函数如printf(), puts(0, gets(), atoi()等存在的地方。

是的,libcmt是微软编译器提供的C标准库的实现(其中之一)。他们提供&;调试&;和“;release"三种基本类型库的版本:单线程的(总是静态链接)、多线程静态链接多线程动态链接(不过,取决于你使用的编译器版本,其中一些可能不存在)。

所以,在“libcmt"”,“libcmt"是C库(或多或少)的传统名称。“mt"意味着“multi-threaded"。一个“debug"版本会有一个"d"加到结尾,给予“libcmtd"”

至于它包含哪些函数,C标准(如果您恰好关心的话,请参阅第7部分)定义了一组符合(托管)实现必须提供的函数。大多数供应商(包括微软)自己添加各种其他函数(为了兼容性,提供标准函数没有解决的功能,等等)在大多数情况下,它还将包含相当多的“内部”功能。由编译器使用但通常不由最终用户使用的函数。

运行时库基本上是一个大文件(或几个大文件)中这些函数实现的集合。在UNIX中,浮点函数传统上是与其他函数分开存储的)。这个大文件通常与压缩文件的顺序相同,但没有任何压缩,所以它基本上只是一些小文件收集在一起,并存储在一个大文件中。归档通常至少包含一些索引,以便相对快速/容易地从内部文件中查找和提取数据。至少在某些时候,微软使用了带有“扩展”的库格式。链接器可以使用索引来查找哪些函数在哪些子文件中实现,因此它可以更快地查找和链接所需的部分(但这纯粹是一种优化,而不是需求)。

如果您想获得“libcmt”中的完整函数列表;(使用你的例子)你可以打开Visual Studio命令提示符之一(通常在“Visual Studio工具”下),切换到你的库安装的目录,输入类似lib -list libcmt.lib这样的东西,它会生成一个()列表,其中包含该库中所有目标文件的名称。它们并不总是与函数名直接相对应,但通常会给出一个概念。如果你想查看一个特定的对象文件,你可以使用lib -extract来提取这些对象文件中的一个,然后使用dumpbin /symbols <object file name>来查找这个特定的对象文件中有哪些函数。

首先,我们应该理解什么是运行时库;想想“Microsoft C Runtime Library”是什么意思。

看:http://en.wikipedia.org/wiki/Runtime_library

我已经在这里张贴了大部分的文章,因为它可能会更新。

当计算机程序的源代码由编译器翻译成相应的目标语言时,如果程序中的每一条命令和对内置函数的每一次调用都导致在目标语言中就地生成相应的完整程序代码,则会导致程序代码的极大扩大。相反,编译器经常在运行时库中使用特定于编译器的辅助函数,而应用程序程序员大多无法访问这些辅助函数。根据编译器制造商的不同,运行时库有时也会包含相应编译器的标准库,或者包含在标准库中。

此外,一些只能在运行时执行(或者更有效或更准确)的函数在运行时库中实现,例如一些逻辑错误、数组边界检查、动态类型检查、异常处理和可能的调试功能。出于这个原因,尽管进行了复杂的编译时检查和发布前测试,但直到在使用真实数据的“实时”环境中测试程序时,才会发现一些编程错误。在这种情况下,最终用户可能会遇到运行时错误消息。

通常运行时库通过访问操作系统来实现许多功能。许多编程语言都有内置函数,这些函数不一定必须在编译器中实现,但可以在运行时库中实现。因此,运行时库和标准库之间的界限取决于编译器制造商。因此,运行时库总是特定于编译器和平台的。

运行时库的概念不应与应用程序程序员创建的或由第三方交付的普通程序库或动态库(即在运行时链接的程序库)相混淆。例如,编程语言C只需要最小的运行时库(通常称为crt0),但定义了每个实现都必须交付的大型标准库(称为C标准库)。

运行时库是为您运行的任何C程序自动编译的库。使用的库版本取决于编译器、平台、调试选项和多线程选项。

关于运行时库的不同选择的良好描述: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html < / p >

它包括那些你通常认为不需要库来调用的函数:

  • malloc
  • 枚举、结构
  • abs、敏
  • 断言

微软有一个很好的运行库函数列表:

< a href = " http://msdn.microsoft.com/en-us/library/2aza74he%28VS.71%29.aspx " > http://msdn.microsoft.com/en-us/library/2aza74he (VS.71) . aspx < / >

函数的确切列表取决于编译器,所以对于iOS,你会得到其他函数,如dispatch_async()或NSLog()。

我只是自己问了这个问题,然后脑子疼了好几个小时。还是没找到任何有意义的东西。每个针对某个主题写东西的人并不能真正地“教学”。如果你想教一个人,就用一个人能理解的最基本的语言,这样他在处理一个话题时就不需要关心其他话题。所以我自己得出了一个结论,似乎很适合所有这些混乱。

在编程语言C中,每个程序都以main()函数开始。 其他语言可能在程序开始的地方定义其他函数。但是处理器不知道main()。处理器只知道预定义的命令,由01的组合表示 在微处理器编程中,没有底层操作系统(Microsoft Windows, Linux, MacOS,..),你需要通过设置ProgramCounter (PC)显式地告诉处理器从哪里开始,该ProgramCounter (PC)在处理器已知的命令中迭代和跳转(循环,函数调用)。你需要知道RAM有多大,你需要设置程序堆栈的位置(局部变量),以及堆的位置(动态变量)和全局变量的位置(我猜它被称为SSA?)

.一个处理器一次只能执行一个程序

这就是操作系统的用武之地。操作系统本身是一个运行在处理器上的程序。允许执行自定义代码的程序。通过在程序(加载到RAM中)的执行代码之间切换,一次运行多个程序。但是操作系统是一个程序,每个程序都是不同的。简单地将您的自定义程序的代码放入RAM中不会运行它,操作系统不知道它。你需要调用注册你的程序的操作系统上的函数,告诉操作系统程序需要多少内存,进入程序的入口点位于哪里(在C的情况下是main()函数)。这就是我猜测的运行时库中的位置,并解释了为什么你需要为每个操作系统一个特殊的库,因为这些只是程序本身,有不同的函数来做这些事情。

这也解释了为什么它不像.dll文件那样在运行时动态链接,即使它被称为运行时库。需要静态地链接运行时库,因为在程序启动时需要它。运行时库在运行时将您的自定义程序注入/连接到另一个程序(操作系统)。这真的会导致一些大脑问题…

< p >结论: RUNTIME Library是一个失败的命名。在早期可能没有.dll(运行时链接),理解差异的问题根本不存在。但即使这是真的,这个名字也选得很糟糕

更好的运行时库名称可以是:StartupLibrary/OSEntryLibrary/SystemConnectLibrary/OSConnectLibrary

希望我做对了,准备更正/扩展。 欢呼。< / p >