假设我们使用一种编译语言,例如C++
。现在假设一个框架示例Qt
。Qt
它的源代码可公开获得,并具有供用户下载二进制文件并允许用户使用其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配置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句