实际上C运行时库是什么以及它用于什么?我正在搜索,谷歌搜索像魔鬼,但我找不到比微软更好的东西:“微软运行时库提供了Microsoft Windows操作系统编程的例程。这些例程自动执行许多常见的编程任务,这些任务不是由微软提供的。 C和C ++语言。“
好的,我明白了,但是例如libcmt.lib
中的内容是什么?它有什么作用?我认为C标准库是C编译器的一部分。那么libcmt.lib
Windows的C标准库函数的实现是否可以在win32下工作?
答案 0 :(得分:61)
是的,libcmt是Microsoft编译器提供的C标准库的(几种)实现之一。它们提供了三种基本类型库的“调试”和“发布”版本:单线程(始终静态链接),多线程静态链接和多线程动态链接(但是,根据您使用的编译器版本,其中一些可能不存在)。
因此,在名称“libcmt”中,“libc”是(或多或少)C库的传统名称。 “mt”表示“多线程”。 “debug”版本将在末尾添加“d”,给出“libcmtd”。
就其包含的功能而言,C标准(第7部分,如果你碰巧关心的话)定义了一组符合(托管)实现必须提供的功能。大多数供应商(包括Microsoft)自己添加各种其他功能(为了兼容性,提供标准功能无法解决的功能等)。在大多数情况下,它还将包含编译器使用的相当多的“内部”函数。但通常不是最终用户。
如果要获取“libcmt”中的完整功能列表(使用您的示例),您可以打开一个Visual Studio命令提示(通常在“Visual Studio Tools”下),切换到目录您的库已安装,并输入类似:lib -list libcmt.lib
的内容,它将生成( long )该库中所有目标文件名称的列表。那些并不总是将直接对应于函数的名称,但通常会给出一个想法。如果要查看特定的目标文件,可以使用lib -extract
提取其中一个目标文件,然后使用`dumpbin / symbols'查找该特定目标文件中的功能。
答案 1 :(得分:47)
首先,我们应该了解运行时库是什么;并想一想“Microsoft C Runtime Library”可能意味着什么。
请参阅:http://en.wikipedia.org/wiki/Runtime_library
我在这里发布了大部分文章,因为它可能会更新。
当编译器将计算机程序的源代码翻译成相应的目标语言时,如果程序中的每个命令以及对内置函数的每次调用都会导致程序代码,则会导致程序代码的极大扩大。 - 每次以目标语言生成完整的相应程序代码。相反,编译器通常在运行时库中使用特定于编译器的辅助函数,这些函数对应用程序员来说几乎是不可访问的根据编译器制造商的不同,运行时库有时也会包含相应编译器的标准库或包含在其中。
在运行时库中也可以实现一些只能(或者更高效或更准确)执行的功能,例如,一些逻辑错误,数组边界检查,动态类型检查,异常处理和可能的调试功能。出于这个原因,在程序在具有真实数据的“实时”环境中进行测试之前,不会发现一些编程错误,尽管进行了复杂的编译时检查和预发布测试。在这种情况下,最终用户可能会遇到运行时错误消息。
通常,运行时库通过访问操作系统来实现许多功能。许多编程语言都具有内置函数,这些函数不一定必须在编译器中实现,而是可以在运行时库中实现。因此,运行时库和标准库之间的边界取决于编译器制造商。 因此,运行时库始终是特定于编译器和特定于平台的。
运行时库的概念不应与普通程序库混淆,例如由应用程序员创建或由第三方或动态库提供的程序库,这意味着在运行时链接的程序库。例如,编程语言C只需要一个最小的运行时库(通常称为crt0),但定义了每个实现必须提供的大型标准库(称为C标准库)。
答案 2 :(得分:16)
我自己刚问过这个问题并且在几个小时内伤害了我的大脑。仍然没有发现任何真正重要的事情。每个为某个主题写点东西的人都无法实际教授"。如果您想教某人,请学习一个人理解的最基本语言,这样他在处理主题时就不需要关心其他主题了。所以我为自己得出的结论似乎很适合所有这些混乱。
在编程语言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
希望我做对了,纠正/扩展 欢呼声。
答案 3 :(得分:14)
C是一种语言,在其定义中,不需要任何可用的功能。没有IO,没有数学例程等等。按照惯例,您可以使用一组可以链接到可执行文件的例程,但不需要 来使用它们。然而,这是常见的事情,大多数链接器不再要求您链接到C运行时库。
有些时候你不想要它们 - 例如,在使用嵌入式系统时,拥有malloc可能是不切实际的。我曾经将PostScript嵌入到打印机中,我们拥有自己的一组运行时库,这些库在嵌入式系统上更加快乐,所以我们没有打扰“标准”。
答案 4 :(得分:9)
运行时库是为您运行的任何C程序自动编译的库。您将使用的库版本取决于您的编译器,平台,调试选项和多线程选项。
运行时库的不同选择的良好描述: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html
它包括您通常认为不需要图书馆呼叫的功能:
Microsoft有一个很好的运行时库函数列表:
http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx
确切的函数列表会因编译器而异,因此对于iOS,您将获得其他函数,如dispatch_async()或NSLog()。
答案 5 :(得分:6)
如果对从C或C ++编译的可执行文件使用Dependency Walker之类的工具,您将看到它所依赖的DLL之一是MSVCRT.DLL。这是Microsoft C运行时库。如果您使用DW进一步检查MSVCRT.DLL,您将看到这是所有函数,如printf(),puts(0,gets(),atoi()等等。
答案 6 :(得分:4)
我认为微软的定义确实意味着:
Microsoft的实现 标准C运行时库提供...
答案 7 :(得分:1)
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
答案 8 :(得分:0)
所以...我不明白...... C运行时库是否是标准C库? 我认为Microsoft C运行时库包括所有(ANSI?)标准C库的实现以及Microsoft扩展标准库的特定功能。