Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果编译后的源代码特定于编译时使用的硬件,我们如何分发它?_C++_Operating System_Frameworks_Compiled - Fatal编程技术网

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

C++ 如果编译后的源代码特定于编译时使用的硬件,我们如何分发它?,c++,operating-system,frameworks,compiled,C++,Operating System,Frameworks,Compiled,假设我们使用编译语言,例如,C++。现在让我们以一个框架为例,假设QtQt公开了它的源代码,并为用户提供了下载二进制文件和让用户使用API的选项。然而,我的问题是,当他们编译代码时,它被编译成他们特定的硬件、操作系统等等。我了解有多少软件需要为不同类型的操作系统(包括32位和64位)重新编译,并在其网站上提供多次下载,然而,它如何不进一步表明它也是特定于硬件的,并最终导致编译执行的重新分配,这极为令人沮丧?代码被编译到目标基础CPU(例如32位x86、x86_64或ARM),但不一定是特定于的处

假设我们使用编译语言,例如,
C++
。现在让我们以一个框架为例,假设
Qt
Qt
公开了它的源代码,并为用户提供了下载二进制文件和让用户使用API的选项。然而,我的问题是,当他们编译代码时,它被编译成他们特定的硬件、操作系统等等。我了解有多少软件需要为不同类型的操作系统(包括32位和64位)重新编译,并在其网站上提供多次下载,然而,它如何不进一步表明它也是特定于硬件的,并最终导致编译执行的重新分配,这极为令人沮丧?

代码被编译到目标基础CPU(例如32位x86、x86_64或ARM),但不一定是特定于的处理器,如Core i9-10900K。默认情况下,编译器通常生成要在最广泛的处理器上运行的代码。英特尔和AMD保证在较新处理器上运行该代码的前向兼容性。编译器通常提供用于优化的开关,以便在具有新指令集的较新处理器上运行,但您很少这样做,因为并非所有客户都具有该配置。或者,您可以构建两次代码(一次用于较旧的处理器,一次用于较新的处理器)

还有一个叫做交叉编译的概念。这就是编译器为完全不同于其运行的处理器生成代码的地方。在Mac上构建iOS应用程序就是这样。编译器本身是一个x86_64程序,但它生成的ARM CPU指令集可以在iPhone上运行

代码通过一组特定的OS API和外部运行库(包括C/C++运行库)进行编译和链接。如果您希望代码在Windows7或MacOSX Maverics上运行,则不会静态链接到仅存在于Windows10或MacOSBigSur上的API。代码可以编译,但不能在较旧的操作系统上运行。相反,如果API可用,您可以进行变通或有条件地加载API。微软和苹果提供了向前兼容性,即提供那些在更高版本的操作系统上可用的运行时库API

此外,Windows支持在64位芯片和操作系统上运行32位进程。Mac甚至可以在今年晚些时候推出的基于ARM的新设备上模仿x86_64。但我离题了


至于Qt,它们实际上为参考二进制下载提供了几个预构建的配置。因为,至少在Windows上,MSVCRT(Visual Studio的C运行时API)与Visual Studio的不同编译器版本密切相关。因此,他们提供各种下载,以匹配您要为其构建代码的配置(32位、64位、VS2017、VS2019等)。因此,当您组装一个具有第三方依赖关系的完整应用程序时,必须考虑其中的一些构建、链接和CPU/OS配置。

我不太确定您要问什么,以及您想知道什么。你说的
是什么意思?但是,它怎么不进一步说明它也是特定于硬件的
?我认为,当你编译一些源代码时,它创建了特定于CPU硬件的指令。如果我在C++中创建了一个可执行文件,那么我就需要把它送给其他拥有硬件设备的人吗?是的,你编译了一个特定的体系结构的应用程序。根据所选择的体系结构,编译器将把源代码翻译成特定的CPU指令集。然后,该二进制文件可以在与该特定体系结构兼容的任何CPU上运行。因此,是的,想要运行二进制文件的人必须拥有支持该指令集的硬件。但这有什么问题?