Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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
GCC运行库与Microsoft Visual C++;运行时可再发行 < >可以对C++文库版本和的分布有一定的启示吗? GCC库(libgcc,libstdc++,…) 微软Visual C++运行库(6、2005, 2008, 2010、2012, 2013, 2015、…) 我在GCC编程中的暴露有限,我从未见过C++运行库随程序一起分发。MS Windows程序通常就是这样_C++_C_Qt_Visual C++_Gcc - Fatal编程技术网

GCC运行库与Microsoft Visual C++;运行时可再发行 < >可以对C++文库版本和的分布有一定的启示吗? GCC库(libgcc,libstdc++,…) 微软Visual C++运行库(6、2005, 2008, 2010、2012, 2013, 2015、…) 我在GCC编程中的暴露有限,我从未见过C++运行库随程序一起分发。MS Windows程序通常就是这样

GCC运行库与Microsoft Visual C++;运行时可再发行 < >可以对C++文库版本和的分布有一定的启示吗? GCC库(libgcc,libstdc++,…) 微软Visual C++运行库(6、2005, 2008, 2010、2012, 2013, 2015、…) 我在GCC编程中的暴露有限,我从未见过C++运行库随程序一起分发。MS Windows程序通常就是这样,c++,c,qt,visual-c++,gcc,C++,C,Qt,Visual C++,Gcc,相对较旧的linux系统能否运行较新的C++14程序(在较新的系统上编译,然后复制到旧系统) GCC程序员是否将运行库与程序一起分发?如果没有,为什么Windows程序会分发它们?GCC分布如何确保C++程序在安装时总是工作?< /P> Qt之类的框架如何,Qt如何处理Linux和Windows上的版本控制和分发?Qt是否也为不同版本分发运行时 这可能与平台、Linux的设计方式和Windows的设计方式有关 GCC和MS Windows采用的方法有什么根本不同 > GCC的运行库,如GNU的C

相对较旧的linux系统能否运行较新的C++14程序(在较新的系统上编译,然后复制到旧系统)

GCC程序员是否将运行库与程序一起分发?如果没有,为什么Windows程序会分发它们?GCC分布如何确保C++程序在安装时总是工作?< /P> Qt之类的框架如何,Qt如何处理Linux和Windows上的版本控制和分发?Qt是否也为不同版本分发运行时

这可能与平台、Linux的设计方式和Windows的设计方式有关


GCC和MS Windows采用的方法有什么根本不同

> GCC的运行库,如GNU的C库,提供了稳定的二进制接口(小脚注:GCC 5.1类型的这种做法,因为必须执行的新C++特性)。 微软的库没有,每一个小小的版本差异都可能打破ABI(应用程序二进制接口)。 此外,Microsoft编译器也会以版本增量更改其ABI,这使得组合由不同版本的工具生成的代码是一个坏主意。同样在这里,GCC维护一个严格的ABI,这使得目标代码完全兼容(当然,如果没有提供破坏ABI的codegen选项)

此ABI由编译器在生成代码时使用的对象大小和布局组成。因此,运行针对一个版本构建的代码,但在运行时使用不同的版本可能会产生意外的结果,因为内存布局和使用方式完全不同

GNU/Linux在这方面非常强大,通常能够保持很强的向后兼容性。 只要编译后的程序是根据库的旧版本编译的,那么如果加载了用户安装的新版本,它就可以完美地运行。 Qt也是如此,它只在主要版本号之间中断了ABI(Qt4和Qt5不能在运行时加载)

有一些小的例外,GCC5的libstdc++是一个大问题。不过,我知道没有大的glibc ABI故障。
新的MicrosoftUniversalCRT试图通过提供稳定的C运行时接口来解决这个问题,正如故事中所说,它提供了一个glibc风格的库ABI稳定性。此UCRT可用于Windows Vista及更高版本,但需要专门针对此编译应用程序。具有此功能的VS的第一个版本是VS2015。

基本区别在于gcc试图保留版本之间的二进制接口。Microsoft在每个版本中都提供了一组全新的库。这两种方法都有各自的优点和局限性。例如,引入破坏接口的更改有多难?用户需要多长时间安装一次新版本?GCC有很多错误,我相信其中很多都是在接口级别,通常需要更改接口来解决这些问题,您如何“保留”版本之间的二进制接口。@Boperson如果我没有错的话,微软和linux的方法远比这相似。MSVC运行时DLL也有不同的版本,具有相同的接口和相同的“版本”,这些版本随修补程序一起分发。linux也有一个“release”版本,可以破坏接口,系统中有多个SO文件。@user1通常在linux上,二进制文件将无法工作,因为不存在正确的运行时,安装它是非常重要的。在windows上,如果安装了正确的运行时可再发行版本,则可以使其工作。@rubenvb当然,这就是向后兼容性。总的来说,如果您在较旧版本的发行版上编译二进制文件,并尝试在较新的发行版上运行它,事情就会顺利进行。windows也是如此-将二进制文件编译到较旧的运行时,较新的windows版本将安装该旧的运行时,或者您可以轻松地安装它。不过,这里的问题是在旧系统上运行新的二进制文件。在这种情况下,旧系统上不存在新的运行时,在旧系统上安装新的运行时是非常重要的。请注意,OP还询问向前兼容性,而不仅仅是向后兼容性。@不,我不谈论向后兼容性,因为没有向后兼容性(保证)。@nos,为什么在linux上安装运行时非常重要?@user1因为没有可以安装的预构建运行时,所以您必须自己构建运行时-通常针对特定发行版/版本,并且没有安装并行运行时的捷径,因此,你必须想出一些变通/破解方法,让你的应用程序使用不同于默认运行时的运行时。运行时还与您可能正在使用的几乎所有库相关联,因此您可能无法将linux发行版上安装的任何库与该非默认运行时一起使用。