用C ++编写的程序如何工作?

时间:2012-09-04 05:58:52

标签: c++ install

当我们运行java程序时,如果没有安装JRE,它就不起作用 我发现大多数着名的应用程序,如Google Chrome浏览器都是用C ++编写的。那么Windows如何在没有任何C ++运行时环境的情况下运行这样的程序?安装过程中究竟发生了什么?

4 个答案:

答案 0 :(得分:25)

  

那么Windows如何在没有任何运行时间的情况下运行这样的程序   C ++的环境?

问题的前提实际上并非如此。至少在Windows上,实际上有一个C ++的运行时环境。此运行时的一个组件(可能是最重要的组件)称为C运行时或CRT。 : - )

通常在程序进入main()函数之前,CRT会执行一系列初始化例程,当您从main()函数返回时,它会自行清理。这种舞蹈的重点在于提供几乎所有C和C ++程序都需要的标准功能。

如果您在启动Windows程序时遇到过丢失msvcrt.dll或类似错误(例如msvcr110.dll更新程序)的错误,那么缺少CRT就是程序抱怨。 msvcrt.dll是实现CRT的文件。它代表“Microsoft Visual C Runtime”。

显然,msvcrt.dll及其亲属附带Windows操作系统,这就是为什么通常不会遇到缺少运行时环境的问题,这与JRE不同,JRE必须由用户安装或由计算机制造商。

但是,Windows C ++应用程序被编译为使用特定版本的MSVCRT,如果您有错误的版本的MSVCRT,那么操作系统会抱怨它的方式与缺少。*安装人员通常做的是检查操作系统是否具有正确的版本,如果没有,则将其从计算机的某个位置复制到自己的安装文件中。

但是,对于所有Windows程序来说,MSVCRT不是必需的,也不是充分条件。编写一个不依赖于MSVCRT的程序是完全可能的,并且完全有可能Windows程序将具有除MSVCRT之外的依赖项。几乎所有重要的Windows程序都依赖于MSVCRT和其他操作系统组件。该程序的安装程序也会检查这些。

JRE和MSVCRT之间存在一些重要差异。一个很大的区别是JRE实现了Java应用程序的虚拟机环境(这就是它实现了它的“跨平台”功能),这可能涉及即时编译等,而MSVCRT只提供标准功能而且什么都不做关于C ++程序的汇编代码。


*这并不严格正确,因为C ++应用程序可以静态链接到MSVCRT,而MSVCRT不依赖于DLL。但是,大多数Windows C ++应用程序动态地链接到它,在这种情况下需要正确的DLL。

答案 1 :(得分:3)

这个问题似乎很明显,但如果我们稍微挖掘一下,那就显而易见了。 让我给你一个更抽象的观点:

每种语言都可以通过合适的机器“执行”,该机器将语言指令连接到特定的硬件“操作”。不同之处在于“接线”是如何完成的: direct <多少/ em>当设置时

一个窗口(但同样适用于linux)的机器至少是由处理器机器代码调用的某些“重要”DLL(例如Kernel.dll)所暴露的一组函数。

C程序通常在编译时被转换为机器代码,该机器代码将系统调用置于该“协议”之下。不需要任何其他功能的程序可以在该环境中本地执行。

需要其他功能的程序可以:

  • 静态链接到将函数实现为机器代码的库(事实上合并了代码):这使程序仍然可以原生执行。
  • 动态链接到这些库:程序需要在启动时或执行期间加载和链接这些库:如果这些库本身已经是操作系统的一部分,程序就会运行,否则,这些库必须放在某处程序可以找到它们的方式(C运行时支持的情况,不是用于编译OS本身的版本)

Java程序,就像设计和实现Java语言一样,不会直接转换为机器代码。它转换为一种中间语言(字节代码),必须用作实际执行其指令的interpeter(java机器)的“输入”,方法是将机器代码作用到底层机器上。

由于Windows本身不是用Java编写的,因此它本身不需要这样的解释器,因此您无法直接在Windows安装中找到它,但如果需要,您必须将它放在那里。

答案 2 :(得分:2)

澄清一下,java程序通过jdk编译为字节码,然后在jre中运行

将c ++程序直接编译为机器可读代码,就像jre必须编译为在windows中运行一样

答案 3 :(得分:2)

运行时(或C或C ++标准库)通常安装有操作系统(glibc,msvcrt,...)。

C / C ++程序也可以“静态”编译,程序使用的库部件链接(合并)到可执行文件中,因此程序在其自己的二进制文件中有库。

执行Java代码的“虚拟机”。 C ++通常被编译为将运行的系统的本机机器代码。 CPU是将运行它的非虚拟机。

也可以将C ++程序编译成各种“字节码”(.NET CLR,LLVM),但这种情况不太常见。