c++ - 如果编译后的源代码特定于编译时所使用的硬件,我们该如何分发?

标签 c++ operating-system frameworks compiled

假设我们采用一种编译语言,例如C++。现在让我们来看一个框架示例,假设QtQt公开提供其源代码,并具有供用户下载二进制文件并允许用户使用其API的选项。但是我的问题是,当他们编译代码时,所有代码都被编译为特定的HardWare,操作系统。我了解有多少软件需要针对不同类型的操作系统(包括32位和64位)进行重新编译,并在其网站上提供了多次下载,但是,进一步说明它也是特定于硬件的,又怎么走得更远,最终导致编译后的软件重新发行执行极其令人沮丧的生产?

最佳答案

代码被编译到目标基本CPU(例如32位x86,x86_64或ARM),但不一定编译为特定于处理器,例如Core i9-10900K。默认情况下,编译器通常会生成代码以在最广泛的处理器上运行。英特尔和AMD保证了在较新的处理器上运行该代码的向前兼容性。编译器通常会提供开关,以进行优化以在具有新指令集的新型处理器上运行,但是您很少这样做,因为并非所有客户都具有该配置。或者,也许您两次构建代码(一次用于较旧的处理器,一次优化用于较新的处理器)。
还有一个称为交叉编译的概念。在那里,编译器为与运行它的处理器完全不同的处理器生成代码。在Mac上构建iOS应用时就是这种情况。编译器本身是一个x86_64程序,但是它生成的ARM CPU指令集可以在iPhone上运行。
代码被编译并与一组特定的OS API和外部运行时库(包括C / C++运行时)链接。如果您希望代码在Windows 7或Mac OSX Maverics上运行,则不会静态链接到仅在Windows 10或Mac OS Big Sur上存在的API。该代码可以编译,但不能在较旧的操作系统上运行。相反,您可以采取一种解决方法,或者有条件地加载该API(如果有)。 Microsoft和Apple提供了相同的运行时库API,以便在以后的OS版本中可用,从而提供了向前兼容性。
此外,Windows支持在64位芯片和OS上运行32位进程。 Mac甚至可以在今年晚些时候推出的基于ARM的新设备上模拟x86_64。但是我离题了。
至于Qt,他们实际上为引用二进制下载提供了几种预配置。因为至少在Windows上,MSVCRT(Visual Studio的C运行时API)与Visual Studio的不同编译器版本紧密相关。因此,他们提供了各种下载以匹配您要为其构建代码的配置(32位,64位,VS2017,VS2019等)。因此,当您将具有第三方依赖关系的完整应用程序组合在一起时,必须考虑其中的一些构建,链接和CPU / OS配置。

关于c++ - 如果编译后的源代码特定于编译时所使用的硬件,我们该如何分发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62847490/

相关文章:

c++ - 如何多次更改全局变量

php - 使用 codeigniter 用户代理获取准确的操作系统详细信息

Java 配置框架

javascript - Angular JS 工厂理解 - 加载时出现错误

C++ 继承简单错误

c++ - clang无限尾递归优化

将字符串转换为 double 的 C++ 错误

python - 如果 RAM 接近饱和,如何终止 Python 进程(Windows 上的 Anaconda)?

python - 如何在 os.popen() 中进行管道传输? - Python

php - Slim 框架闪存和中间件