什么是C运行库?

rsaldnfx  于 2023-02-11  发布在  其他
关注(0)|答案(8)|浏览(216)

C运行库到底是什么?它有什么用?我一直在搜索,像个魔鬼一样在谷歌上搜索,但我找不到比微软的更好的东西:“Microsoft运行库为Microsoft Windows操作系统的编程提供例程。这些例程自动执行C和 C++ 没有提供的许多常见编程任务。”
好的,我明白了,但是例如,libcmt.lib中有什么?它是做什么的?我认为C标准库是C编译器的一部分。那么libcmt.lib Windows对C标准库函数的实现在win32下工作吗?

wpx232ag

wpx232ag1#

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

l5tcr1uw

l5tcr1uw2#

首先,我们应该理解什么是运行库;并思考"MicrosoftC运行时库"可能意味着什么。
参见:http://en.wikipedia.org/wiki/Runtime_library
我已经张贴了大部分的文章在这里,因为它可能会得到更新。
当计算机程序的源代码被编译器翻译成相应的目标语言时,如果程序中的每个命令和对内置函数的每个调用每次都将导致以目标语言就地生成完整的相应程序代码,则将导致程序代码的极度扩大。运行时库中的一种专用辅助函数,应用程序员大多数情况下不能访问它。根据编译程序的制造商,运行时库有时也包含相应编译程序的标准库,或被包含在标准库中。
还有一些功能只能执行(或更有效率或准确),例如一些逻辑错误、数组边界检查、动态类型检查、异常处理和可能的调试功能。因此,一些编程错误直到程序在"实时"环境中用真实数据测试时才被发现,尽管有复杂的编译时检查和预发布测试。在这种情况下,最终用户可能会遇到运行时错误消息。
通常,运行时库通过访问操作系统来实现许多函数。许多编程语言都有内置函数,这些函数不一定要在编译器中实现,但可以在运行时库中实现。因此,运行时库和标准库之间的界限取决于编译器制造商。因此,运行时库总是特定于编译器和平台。
运行时库的概念不应与普通程序库(如由应用程序员创建或由第三方交付的程序库)或动态库混淆,动态库意味着在运行时链接的程序库。例如,编程语言C只需要最小的运行时库(通常称为crt0),但定义了每个实现都必须交付的大型标准库(称为C标准库)。

efzxgjgh

efzxgjgh3#

我只是自己问了这个问题,伤了几个小时的脑筋。仍然没有找到任何真正有意义的东西。每个确实对一个主题写东西的人都不能真正“教”。如果你想教某人,就拿一个人理解的最基本的语言,所以他在处理一个主题的时候不需要关心其他的主题。所以我为自己得出了一个似乎很适合这一切混乱的结论。
在编程语言C中,每个程序都以main()函数开始。其他语言可能会在程序开始的地方定义其他函数。但是处理器不知道main()。处理器只知道预定义的命令,由01的组合表示。
在微处理机程序设计中,没有底层操作系统的(Microsoft Windows、Linux、MacOS等),您需要通过设置ProgramCounter(PC)迭代和跳转(循环,函数调用)在处理器已知的命令中。你需要知道RAM有多大,你需要设置程序堆栈的位置(局部变量),以及堆的位置(动态变量)和全局变量(我猜它被称为SSA?)在RAM内的位置。单个处理器一次只能执行一个程序。
这就是操作系统的用武之地。操作系统本身是一个在处理器上运行的程序。一个允许执行定制代码的程序。通过在程序的执行代码之间切换,一次运行多个程序(它们被加载到RAM中)。但是操作系统是一个程序,每个程序的编写方式都不一样。2简单地将定制程序的代码放入RAM中并不能运行它,操作系统并不知道它。3你需要调用操作系统上的函数来注册你的程序,告诉操作系统程序需要多少内存,程序的入口点在哪里(在C语言中是main()函数)。这就是我猜的运行库中的位置,并解释了为什么每个操作系统都需要一个特殊的库,因为这些只是程序本身,有不同的函数来做这些事情。
这也解释了为什么它不是动态链接在运行时作为.dll文件是,即使它被称为一个运行时库。运行时库需要被静态链接,因为它是需要在您的程序的启动。运行时库注入/连接您的自定义程序到/到另一个程序(操作系统)在运行时。
结论:RUNTIME库在命名上是一个失败。早期可能没有.dll(在运行时链接),并且根本不存在理解差异的问题。但即使这是真的,这个名字也选得很糟糕。
运行时库的更好名称可能是:启动库/OS入口库/系统连接库/OS连接库
希望我做对了,准备修正/扩展。干杯。

fjnneemd

fjnneemd4#

C是一种语言,在它的定义中,你不需要任何可用的函数。没有IO,没有数学例程等等。按照惯例,你可以链接到你的可执行程序中,但你不需要使用它们。然而,这是一件很常见的事情,大多数链接器不再要求你链接到C运行库。
有时候你并不需要它们--例如,在使用嵌入式系统时,使用malloc可能是不切实际的。我曾经致力于将PostScript嵌入到打印机中,我们有自己的一套运行时库,它们在嵌入式系统上更受欢迎,所以我们没有为“标准”而烦恼。

tmb3ates

tmb3ates5#

运行库是为运行的任何C程序自动编译的库。要使用的库版本取决于编译器、平台、调试选项和多线程选项。
以下是对运行时库的不同选择的详细描述:http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html
它包括那些你通常认为不需要库来调用的函数:

  • 马洛克
  • 枚举、结构
  • 绝对值,最小值
  • Assert

Microsoft有一个运行时库函数的详细列表:
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/crt-alphabetical-function-reference?view=msvc-170
函数的确切列表会因编译器而异,因此对于iOS,您会得到其他函数,如dispatch_async()或NSLog()。

tjjdgumg

tjjdgumg6#

如果你在一个从C或C++编译的可执行文件上使用Dependency Walker这样的工具,你会看到它所依赖的DLL之一是MSVCRT.DLL。这是Microsoft C运行时库。如果你进一步检查带有DW的MSVCRT.DLL,你会看到这是printf()、puts(0)、gets()、atoi()等所有函数所在的地方。

owfi6suc

owfi6suc7#

我认为微软定义实际意思是:
标准C运行库的Microsoft实现提供...

ma8fv8wu

ma8fv8wu8#

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)。但是请注意,Win32s不支持MSVCRT10.DLL,而Win32s支持CRTDLL.LIB。MSVCRT20.DLL有两个版本:一个用于Windows NT,另一个用于Win32。
参见:http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

相关问题