C运行时库实际上是什么,它的作用是什么?我一直在搜寻,就像恶魔一样,但没有找到比微软更好的东西:“微软运行时库提供了用于Microsoft Windows操作系统编程的例程。这些例程可自动执行许多常规编程任务,而这些任务并非由Microsoft提供C和C++语言。”
好的,我明白了,但是例如libcmt.lib
是什么?它有什么作用?我认为C标准库是C编译器的一部分。那么libcmt.lib
Windows的C标准库函数实现是否可以在win32下工作?
最佳答案
是的,libcmt是Microsoft编译器提供的C标准库的(几个)实现。它们提供三种基本类型的库的“调试”和“发行”版本:单线程(始终静态链接),多线程静态链接和多线程动态链接(尽管取决于您使用的编译器版本,其中一些可能不存在)。
因此,在名称“libcmt”中,“libc”是(或多或少)C库的传统名称。 “mt”表示“多线程”。 “调试”版本的末尾将添加“d”,从而得到“libcmtd”。
就其包含的功能而言,C标准(如果您很在意,请参见第7部分)定义了一组符合标准(托管)的实现必须提供的功能。大多数供应商(包括Microsoft)本身都会添加其他各种功能(出于兼容性,提供标准功能无法解决的功能等)。在大多数情况下,它还将包含许多编译器使用的“内部”功能但最终用户通常不这样做。
运行时库基本上是在一个大文件(或几个大文件)中这些功能的实现的集合-例如,在UNIX上,传统上将浮点函数与其余函数分开存储。该大文件通常与zip文件具有相同的总体顺序,但是没有任何压缩,因此基本上只是一些小文件收集在一起并一起存储到一个更大的文件中。存档通常将至少包含一些索引,以使其相对快速/轻松地从内部文件中查找和提取数据。至少有时,Microsoft使用了带有“扩展”索引的库格式,链接器可以使用该格式来查找在哪个子文件中实现了哪些功能,因此它可以更快地查找和链接所需的部分(但这就是纯粹是一种优化,而不是要求)。
如果要在“libcmt”中获得功能的完整列表(以您的示例为例),可以打开一个Visual Studio命令提示符(通常在“Visual Studio Tools”下),切换到库所在的目录安装后,输入类似lib -list libcmt.lib
的代码,它将生成该库中所有目标文件名称的(长)列表。这些并不总是直接对应于函数的名称,但是通常会给出一个想法。如果要查看特定的目标文件,可以使用lib -extract
提取其中一个目标文件,然后使用dumpbin /symbols <object file name>
查找该特定目标文件中的功能。