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'查找该特定目标文件中的哪些功能.
小智 51
首先,我们应该了解运行时库是什么; 并想一想"Microsoft C Runtime Library"可能意味着什么.
请参阅:http://en.wikipedia.org/wiki/Runtime_library
我在这里发布了大部分文章,因为它可能会更新.
当编译器将计算机程序的源代码翻译成相应的目标语言时,如果程序中的每个命令和对内置函数的每次调用都会导致就地生成,则会导致程序代码的极大扩大.每次都使用目标语言的相应程序代码.相反,编译器通常在运行时库中使用特定于编译器的辅助函数,这些函数对应用程序员来说几乎是不可访问的 根据编译器制造商的不同,运行时库有时也会包含相应编译器的标准库或包含在其中.
此外,一些在运行时只能执行(或更有效或更准确)的函数在运行时库中实现,例如一些逻辑错误,数组边界检查,动态类型检查,异常处理和可能的调试功能.出于这个原因,在程序在具有真实数据的"实时"环境中进行测试之前,不会发现一些编程错误,尽管进行了复杂的编译时检查和预发布测试.在这种情况下,最终用户可能会遇到运行时错误消息.
通常,运行时库通过访问操作系统来实现许多功能.许多编程语言都具有内置函数,这些函数不一定必须在编译器中实现,而是可以在运行时库中实现.因此,运行时库和标准库之间的边界取决于编译器制造商.因此,运行时库始终是特定于编译器和特定于平台的.
运行时库的概念不应与普通程序库混淆,例如由应用程序员创建或由第三方或动态库提供的程序库,这意味着在运行时链接的程序库.例如,编程语言C仅需要最小的运行时库(通常称为crt0),但是定义了每个实现必须提供的大型标准库(称为C标准库).
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
希望我做对了,纠正/扩大欢呼.
pli*_*nth 15
C是一种语言,在其定义中,不需要任何可用的函数.没有IO,没有数学例程等等.按照惯例,您可以使用一组可以链接到可执行文件的例程,但不需要使用它们.然而,这是常见的事情,大多数链接器不再要求您链接到C运行时库.
有些时候你不想要它们 - 例如,在使用嵌入式系统时,拥有malloc可能是不切实际的.我曾经将PostScript嵌入到打印机中,我们拥有自己的一组运行时库,这些库在嵌入式系统上更加快乐,所以我们没有打扰"标准".
运行时库是为您运行的任何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().
小智 6
如果在从C或C++编译的可执行文件上使用Dependency Walker之类的工具,您将看到它所依赖的DLL之一是MSVCRT.DLL.这是Microsoft C运行时库.如果您使用DW进一步检查MSVCRT.DLL,您将看到这是所有函数,如printf(),puts(0,gets(),atoi()等.