什么是C运行时库?

B.G*_*ill 150 c runtime

实际上是什么是C运行时库以及它用于什么?我正在搜索,谷歌搜索像魔鬼,但我找不到比微软更好的东西:"微软运行时库提供了Microsoft Windows操作系统编程的例程.这些例程自动执行许多常见的编程任务,这些任务不是由微软提供的. C和C++语言."

好的,我明白了,但是例如,是什么libcmt.lib?它有什么作用?我认为C标准库是C编译器的一部分.那么libcmt.libWindows的C标准库函数的实现是否可以在win32下运行?

Jer*_*fin 67

是的,libcmt是Microsoft编译器提供的C标准库的(几种)实现之一.它们提供了三种基本类型库的"调试"和"发布"版本:单线程(始终静态链接),多线程静态链接多线程动态链接(但是,根据编译器版本,你是使用,其中一些可能不存在).

因此,在名称"libcmt"中,"libc"是(或多或少)C库的传统名称."mt"表示"多线程"."调试"版本将在末尾添加"d",给出"libcmtd".

至于它包含哪些功能,C标准(第7部分,如果你碰巧关心的话)定义了符合(托管)实现必须提供的一组功能.大多数供应商(包括Microsoft)自己添加各种其他功能(为了兼容性,提供标准功能无法解决的功能等).在大多数情况下,它还将包含编译器使用的相当多的"内部"函数.但通常不是最终用户.

如果要获取"libcmt"中的完整功能列表(使用您的示例),您可以打开一个Visual Studio命令提示(通常在"Visual Studio工具"下),切换到库所在的目录安装,并键入类似于:lib -list libcmt.lib它将生成该库中所有目标文件的名称()列表.那些并不总是直接对应于函数的名称,但通常会给出一个想法.如果要查看特定的目标文件,可以使用lib -extract提取其中一个目标文件,然后使用`dumpbin/symbols'查找该特定目标文件中的哪些功能.

  • 你还没有告诉"C运行时库"是什么! (32认同)
  • @entropy:当然看起来像我一样,但简短的回答是它是一组函数,许多(但不一定是全部)函数在C标准的第7部分中指定. (4认同)
  • 那么 C 运行时库基本上是 Microsoft 引用标准 C 库的方式? (3认同)
  • @onmyway133 是的,他做到了。您正遭受 XY 问题的困扰。你认为你希望有人告诉你什么是 C 运行时库,但是当有人告诉你时(我可能会补充说,并且非常清楚地告诉你),你仍然会抱怨,因为你真的想问一些你可能不会问的完全不同的问题。甚至不知道如何表述,可能类似于“为什么 C 需要运行时库?” (3认同)
  • 这个答案暗示C库只是编译器工具链的一部分。不准确。 (2认同)
  • 那么,是否可以在没有 c 运行时库的情况下运行任何代码呢?例如,考虑一个像这样的 main.c 文件 `int main(void) { volatile int x = 4; 易失性 int y = x + 5; x *= y;return x;}` 我可以用 `arm-none-eabi-gcc -nostdlib -nostartupfiles -Og -Wl,-emain -mcpu=cortex-a15 main.c -o MyExe.elf` 编译它并仍然在合适的设备上运行它Arm Cortex A15 硬件?我希望看到 R0 设置为 x,R1 设置为 y,然后能够单步执行并看到它们更新。难道不是这样吗? (2认同)
  • @GregoryFenn:是的,当然有可能。事实上,对于相当多的小型嵌入式系统来说,编写根本不使用标准库的代码是很常见的(尽管它可能会使用一些库代码来完成打开和关闭 LED 等操作)。 (2认同)

小智 51

首先,我们应该了解运行时库是什么; 并想一想"Microsoft C Runtime Library"可能意味着什么.

请参阅:http://en.wikipedia.org/wiki/Runtime_library

我在这里发布了大部分文章,因为它可能会更新.

当编译器将计算机程序的源代码翻译成相应的目标语言时,如果程序中的每个命令和对内置函数的每次调用都会导致就地生成,则会导致程序代码的极大扩大.每次都使用目标语言的相应程序代码.相反,编译器通常在运行时库中使用特定于编译器的辅助函数,这些函数对应用程序员来说几乎是不可访问的 根据编译器制造商的不同,运行时库有时也会包含相应编译器的标准库或包含在其中.

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

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

运行时库的概念不应与普通程序库混淆,例如由应用程序员创建或由第三方或动态库提供的程序库,这意味着在运行时链接的程序库.例如,编程语言C仅需要最小的运行时库(通常称为crt0),但是定义了每个实现必须提供的大型标准库(称为C标准库).

  • 突出显示的句子作为区别于标准库的一种方式,是我见过的第一个简明的准确答案,不是"大多数"或"有时候". (2认同)

Rum*_*ble 18

我自己就问过这个问题并且在几个小时内伤害了我的大脑.仍然没有发现任何真正重要的事情.每个为某个主题写点东西的人都无法实际"教".如果您想教某人,请学习一个人理解的最基本语言,这样他在处理主题时就不需要关心其他主题了.所以我为自己得出的结论似乎很适合所有这些混乱.

在编程语言C中,每个程序都以main()函数开始.其他语言可能会定义程序启动的其他功能.但处理器不知道main().处理器仅知道由"0"和"1"的组合表示的预定义命令.

在微处理器编程中,没有底层操作系统(Microsoft Windows,Linux,MacOS,..),您需要通过设置迭代和跳转(循环,函数调用)的ProgrammCounter(PC)来明确告诉处理器从哪里开始处理器已知的命令.你需要知道RAM有多大,你需要设置程序堆栈的位置(局部变量),以及堆的位置(动态变量)和全局变量的位置(我猜它叫做SSA) ?)在RAM内.单个处理器一次只能执行一个程序.

这就是操作系统的用武之地.操作系统本身就是一个在处理器上运行的程序.一个允许执行自定义代码的程序.通过在程序的执行代码(加载到RAM中)之间切换,一次运行多个程序.但操作系统是一个程序,每个程序的编写方式不同.简单地将自定义程序的代码放入RAM就不会运行它,操作系统也不知道它.您需要在注册程序的操作系统上调用函数,告诉操作系统程序需要多少内存,进入程序的入口点(C中的main()函数).这就是我在RuntimeLibrary中所提到的内容,并解释了为什么你需要为每个操作系统提供一个特殊的库,因为这些只是程序本身并具有不同的功能来完成这些工作.

这也解释了为什么它不是在运行时动态链接的.dll文件,即使它被称为RUNTIMELibrary.RuntimeLibrary需要静态链接,因为在程序启动时需要它.RuntimeLibrary在RUNTIME中将自定义程序注入/连接到另一个程序(操作系统).这真的会引起一些脑力......

结论:RUNTIMELibrary命名失败.可能在早期没有.dll(在运行时链接)并且理解差异的问题根本不存在.但即使这是真的,这个名字也很糟糕.

RuntimeLibrary的更好名称可能是:StartupLibrary/OSEntryLibrary/SystemConnectLibrary/OSConnectLibrary

希望我做对了,纠正/扩大欢呼.

  • 您认为需要 C 运行时才能通过提供 main() 地址来启动程序并且 C 运行时库不是动态链接的结论是错误的。可执行文件(例如 ELF 可执行文件)包含入口点地址以及在操作系统上运行程序所需的其他信息。另外,仅 Microsoft C 运行时的名称就应该给您提供线索,它的名称为“msvcrt.dll”。 (7认同)
  • 理论上,程序不需要RTL.但是,如果没有操作系统的某些合作,您的程序将如何显示其结果或接受任何输入或请求内存? (5认同)
  • 这是这个问题最容易理解的答案,谢谢。还有一个问题是“启动库”是否也实现了 C 标准库?C 标准是否也像 C++ 一样定义了库的规范,并且该库是否也实现了相同的规范?请我需要有关这个主题的启发。 (3认同)
  • 我仍然没有得到ideia。为什么程序在运行时需要一些东西?为什么二进制代码不能 100% 单独运行,在运行时没有任何支持?或者换句话说:是否有可能让代码在没有任何东西(包括操作系统)的情况下 100% 运行? (2认同)

pli*_*nth 15

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

有些时候你不想要它们 - 例如,在使用嵌入式系统时,拥有malloc可能是不切实际的.我曾经将PostScript嵌入到打印机中,我们拥有自己的一组运行时库,这些库在嵌入式系统上更加快乐,所以我们没有打扰"标准".

  • 实际上,C标准描述了两种类型的C环境 - "独立"和"托管" - 并且在托管环境中,标准*中描述的功能被定义为可用.在嵌入式系统中,C环境通常是独立的,因此您可能没有库例程,或者您可以避免使用某些并使用自己的替换. (11认同)

ari*_*orf 9

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

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

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

  • 的malloc
  • 枚举,结构
  • 绝对,分钟
  • 断言

Microsoft有一个很好的运行时库函数列表:

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

确切的函​​数列表会因编译器而异,因此对于iOS,您将获得其他函数,如dispatch_async()或NSLog().

  • struct 和 enum 真的是一个运行时库吗? (2认同)

小智 6

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

  • 只有在编译该可执行文件时,C运行时才会动态链接.如果它是静态链接的,依赖性walker将显示nothiing (5认同)

And*_*rey 5

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

标准 C 运行时库的 Microsoft 实现提供了...