C++ 版本,它们会自动检测 exe 的版本吗?
Posted
技术标签:
【中文标题】C++ 版本,它们会自动检测 exe 的版本吗?【英文标题】:C++ Versions, do they auto-detect the version of an exe? 【发布时间】:2017-04-12 17:32:04 【问题描述】:好的,我知道有多个 c++ 版本。而且我不太了解它们之间的区别,但我的问题是: 假设我在 c++ 11 中制作了一个 c++ 应用程序并将其发送到另一台计算机,它会从其他版本的 c++ 中出现错误,还是会自动检测到它并使用该版本运行? 或者我弄错了,它是在编译时定义的吗?有人请告诉我,因为我还没有在谷歌上找到我的问题的单一答案。
【问题讨论】:
应用程序已编译且独立。与 java 或 python 不同,你不需要 c++ 来运行 c++ 编译的程序。 【参考方案1】:这取决于您是将源代码复制到另一台计算机并在那里编译,还是您在您的计算机上编译它并将生成的二进制文件发送到另一台计算机。
C++ 被编译器翻译成机器码,直接在处理器上运行。任何具有兼容处理器的计算机都会理解机器代码,但不止于此。该程序需要与文件系统、图形适配器等接口。这部分通常由操作系统以不同的方式处理。即使其中一些是由 C++ 库抽象出来的,对操作系统的调用也是不同的,并且是特定于它的。
例如,即使两台计算机具有相同的处理器和硬件,为 ubuntu 编译的二进制文件也不会在 Windows 上运行。
如果您将源代码复制到另一台机器并在那里编译(或使用交叉编译器),如果您不使用特定于操作系统的功能,您的程序应该可以正常编译和运行。
C++ 版本对编译很重要,如果你有 C++11 源代码当然需要支持 C++11 的编译器,但是一旦程序编译完成,就不再重要了。
【讨论】:
没什么。真的,我只是问自己为什么在我自己点击赞成按钮之前它会遭到反对:-)【参考方案2】:C++ 被编译为机器码,然后可以在任何具有该架构的计算机上运行,例如i386 或 x64(将 SSE 等处理器功能放在一边)。
对于Java,举个反例,就不一样了。在那里,代码被编译成字节码格式,即与机器无关。 Java 虚拟机 (JVM) 可以读取/理解此字节码格式。然后,JVM 必须可用于您的架构,并且必须安装正确的版本。
【讨论】:
操作系统中也存在一些可能导致问题的差异:例如标准 C 库的 ABI。这就是为什么您不能只获取一个 linux 可执行文件并在 Windows 机器上运行它,即使该机器甚至可能在完全相同的硬件上运行。您至少必须将范围缩小到能够理解相同可执行格式的机器。 仅当您在特定操作系统上为该操作系统编译时才是正确的。但是,还有其他方法可以将代码放入内存。您可以编写引导加载程序、bioses、固件、操作系统等。加载代码后,无论哪个 C++ 版本,它都可以运行。 @Espen 但是,此类代码无法访问标准 C 库,因此无法访问依赖标准 C 库的标准 C++ 库的所有部分。文件 I/O、线程和malloc()
之类的东西在不依赖内核的情况下不容易实现。因此,虽然出于纯粹的需要编写这样的代码当然是可能的(内核必须用 某种 语言编写),但有人可能会争辩说它不是真正的 C/C++ 代码:它必须使用某些子集编写语言,在那个级别,它通常必须包含一些汇编程序,使其与标准 C/C++ 相距甚远。
好吧,我将标准库视为提供的框架,而不是 C 语言本身的一部分。你可以在没有标准库的情况下用 C/C++ 编写任何你想要的东西,也不需要接触汇编。这将是低级的,但您不必离开您的语言,这对于任何本地语言(如 Pascal、C、C++ 等)都是如此。我已经编写了我的 C/C++ 部分,而无需内核、BIOS 和引导加载程序。这当然不仅是可能的,而且是由许多人完成的。在我的演示场景中,我会因为加载任何标准库而受到很大的打击:)【参考方案3】:
还是我弄错了,它是在编译时定义的吗?
这正是这个想法:代码被编译,然后语言版本几乎无关紧要。唯一可能的陷阱是,如果更新的 C++ 版本包含对标准 C++ 库(库,而不是语言本身!)的重大更改。但是,由于该库的绝大多数是模板代码,因此无论如何它都会与您自己的代码一起编译。它基本上与您自己的代码一起包含在您的.exe
文件中,因此它与您的代码一样可移植。此外,C 和 C++ 设计者都非常小心不破坏旧代码;因此,您甚至可以期望系统本身(标准 C 库)提供的那些部分也不会破坏任何东西。
因此,即使理论上存在一些问题,纯 C++ 代码应该在所有理解与编译它的机器相同的.exe
格式的机器上运行良好。
【讨论】:
以上是关于C++ 版本,它们会自动检测 exe 的版本吗?的主要内容,如果未能解决你的问题,请参考以下文章
最新版本的 VSCode 可以使用 C++ 扩展和 MSVC 调试 C++ 吗?
Python自动检测Chrome浏览器版本号并下载对应驱动文件[chromedriver.exe]