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