GCC (GNU Compiler Collection)是一个开源命令行软件,旨在充当GNU / Linux和基于BSD的操作系统的编译器。它包括许多编程语言的前端,包括Objective-C,Go,C ++,Java,C,Ada和Fortran。
功能一目了然
使用GCC,您可以仅使用相应程序的源存档在Linux或BSD操作系统中配置,编译和安装GNU / Linux应用程序。但是,用户不需要与编译器进行交互,因为这是由configure和make脚本自动完成的。
该项目还包括各种编程语言的库,例如libstdc和libgcj,与大多数GNU软件一样,它必须先配置才能在您的计算机上构建和安装。
它还可以显示特定库的完整路径,编译器搜索路径中的文件夹,特定组件的完整路径,目标库目录,用于查找标头的sysroot后缀以及目标的规范化GNU三元组。
此外,还有各种其他选项可以将某些逗号分隔的选项和参数传递给汇编程序,预处理程序和链接程序,无需链接即可编译和汇编,创建共享库等等。
专为GNU操作系统而设计
GCC(GNU编译器集合)最初是作为GNU操作系统的主编译器编写的,它是100%免费软件,默认情况下安装在任何Linux发行版上。
该软件也被开源开发人员用于编译他们的程序。命令行有几个选项,其中我们可以提到显示编译器目标处理器的能力,以及OS库的相对路径。
底线
总而言之,GCC是任何GNU / Linux操作系统中最重要的组件之一。不仅如此,我们甚至可以想象一个没有它的世界,但GCC是整个开源生态系统背后的主要原因。
这个版本中的新内容:
- GCC 7.3是GCC 7分支的错误修复版本,其中包含对GCC 7.2中的回归和严重错误的重要修复,自上一版本以来修复了99多个错误。
- 此版本包含代码生成选项,用于缓解x86和powerpc目标的Spectre Variant 2(CVE 2017-5715)。
版本8.1.0中的新功能:
- GCC 7.3是一个错误修复版本GCC 7分支包含对GCC 7.2中的回归和严重错误的重要修复,自上一版本以来修复了99多个错误。
- 此版本包含代码生成选项,用于缓解x86和powerpc目标的Spectre Variant 2(CVE 2017-5715)。
版本中的新功能:
- GCC 7.1是一个主要版本,包含GCC 6.x或之前GCC版本中未提供的实质性新功能。 C ++前端现在对所有当前的C ++ 17草案都有实验支持,其中-std = c ++ 1z和-std = gnu ++ 1z选项,libstdc ++库包含大部分C ++ 17草案库功能也实现了。此版本在发出的诊断中具有各种改进,包括改进的位置,位置范围,拼写错误标识符的建议,选项名称,修复提示和各种新警告。优化器得到了改进,所有的过程内和程序间优化,链接时间优化和各种目标后端都出现了改进,包括但不限于添加商店合并传递,代码提升优化,循环拆分和收缩包装改进。 Address Sanitizer现在可以在离开范围后报告变量的使用情况。现在可以将GCC配置为将OpenMP 4.5卸载到NVidia PTX GPGPU。
版本6.3.0中的新功能:
- GCC 6.3是GCC 6分支的错误修复版本,其中包含对GCC 6.2中的回归和严重错误的重要修复,自上一版本以来修复了超过79个错误。
版本6.2.0中的新功能:
- 此版本是一个错误修复版本,包含GCC 5.2中与以前版本的GCC相关的回归修复。
版本6.1.0中的新功能:
- 此版本是一个错误修复版本,包含GCC 5.2中与以前版本的GCC相关的回归修复。
版本5.3.0中的新功能:
- 此版本是一个错误修复版本,包含GCC 5.2中与以前版本的GCC相关的回归修复。
5.2.0版中的新功能:
- 此版本是一个错误修复版本,包含GCC 5.1中与以前版本的GCC相关的回归修复。
版本5.1.0中的新功能:
- C ++前端现在支持完整的C ++ 14语言,标准C ++库具有完整的C ++ 11支持和实验性完整的C ++ 14支持。采用Dual ABI可以提供完整的C ++ 11支持,详见https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html。
- C前端现在默认为带有GNU扩展的C11模式,这会影响内联关键字的语义并带来其他几个用户可见的更改,请参阅https://gcc.gnu.org/gcc-5/porting_to.html了解更多详情。
- GCC 5.1包含各种过程间优化改进,例如:新的IPA相同代码折叠通行证和各种LTO改进,例如:基于ODR的C ++类型合并,请参阅http://hubicka.blogspot.cz/2015/04/GCC5-IPA-LTO-news.html以获取更多详细信息。
- GCC 5.1本地寄存器分配器现在包含一个重新实现子通道,在i?86 / x86-64上能够重用PIC硬件寄存器来提高位置无关代码的性能,有一个简单的过程间RA通道和各种其他寄存器分配改进已添加。
- GCC 5.1增加了对OpenACC标准的部分支持,支持OpenMP 4.0卸载到英特尔即将推出的Xeon Phi加速器,并支持OpenACC卸载到PTX。 GCC中的Undefined Behavior Sanitizer已通过添加各种新的运行时检查进行了扩展。 GCC 5.1中增加了一个实验性的GCC JIT库。
版本4.8.4中的
新内容:
- 一般优化工具改进:
- 快速内存错误检测器AddressSanitizer现已在ARM上提供。
- UndefinedBehaviorSanitizer(ubsan),一个快速未定义的行为检测器,已添加,可以通过-fsanitize = undefined启用。将检测各种计算以在运行时检测未定义的行为。 UndefinedBehaviorSanitizer目前可用于C和C ++语言。
- 链接时优化(LTO)改进:
- 重写了类型合并。新的实现速度明显更快,占用的内存更少。
- 更好的分区算法,可在链接时间内减少流式传输。
- 尽早删除虚拟方法可以减少目标文件的大小,并缩短链接时内存使用和编译时间。
- 现在按需加载函数体,并在链接时提前释放,以提高整体内存使用量。
- 现在可以优化C ++隐藏的键控方法。
- 使用链接器插件时,使用-flto选项进行编译现在会生成仅包含LTO的中间语言表示的slim对象文件(.o)。使用-ffat -lto-objects创建另外包含目标代码的文件。要生成适合LTO处理的静态库,请使用gcc-ar和gcc-ranlib;使用gcc-nm列出来自细长对象文件的符号。 (这要求使用插件支持编译ar,ranlib和nm。)
- 内存使用情况构建启用了调试的Firefox从15GB减少到3.5GB;链接时间从1700秒到350秒。
- 程序间优化改进:
- 改进虚拟化的新型继承分析模块。现在,虚拟化会考虑匿名名称空间和C ++ 11 final关键字。
- 新的推测性虚拟化传递(由-fdevirtualize-speculatively控制。
- 推测性地直接拨打的电话会被转回间接电话,而直接电话并不便宜。
- 为已知在共享库之间在语义上等效的符号引入了本地别名,从而改善了动态链接时间。
- 反馈导向的优化改进:
- 使用C ++内联函数对程序进行概要分析现在更加可靠。
- 新时间分析确定执行函数的典型顺序。
- 新功能重新排序传递(由-freorder-functions控制)可显着减少大型应用程序的启动时间。在binutils支持完成之前,它仅对链接时优化有效。
- 反馈驱动的间接呼叫删除和虚拟化现在可以在启用链接时优化时处理跨模块调用。
- 新语言和语言的具体改进:
- 现在,C和C ++编译器支持OpenMP规范的4.0版本,并从Fortran编译器中的4.9.1版本开始。新的-fopenmp-simd选项可用于启用OpenMP的SIMD指令,而忽略其他OpenMP指令。新的-fsimd-cost-model =选项允许调整使用OpenMP和Cilk Plus simd指令注释的循环的矢量化成本模型; -Wopenmp-simd在当前成本模型覆盖用户设置的simd指令时发出警告。
- 为C,C ++和Fortran编译器添加了-Wdate-time选项,该选项在使用__DATE __,__ TIMME__或__TIMESTAMP__宏时发出警告。这些宏可能会阻止按位完全相同的可重现编译。
- 阿达:
- 默认情况下,GNAT切换到Ada 2012而不是Ada 2005.
- C家族:
- 增加了对GCC发出的着色诊断的支持。 -fdiagnostics-color = auto将在输出到终端时启用它,-fdiagnostics-color =始终无条件。 GCC_COLORS环境变量可用于自定义颜色或禁用着色。如果环境中存在GCC_COLORS变量,则默认为-fdiagnostics-color = auto,否则为-fdiagnostics-color = never。
- 样本诊断输出:
- $ g ++ -fdiagnostics-color = always -S -Wall test.C
- test.C:在功能‘ int foo()':
- test.C:1:14:警告:函数中没有返回语句返回非void [-Wreturn-type]
- int foo(){}
- test.C:2:46:错误:模板实例化深度超过最大值900(使用-ftemplate-depth =增加最大值)实例化‘ struct X'
- template struct X {static const int value = X :: value; }; template struct X;
- test.C:2:46:从‘ const int X :: value'递归需要
- test.C:2:46:需要来自‘ const int X :: value'
- test.C:2:88:从这里要求
- test.C:2:46:错误:类型不完整‘ X'用于嵌套名称说明符
- 使用新的#pragma GCC ivdep,用户可以断言没有循环携带的依赖关系会阻止使用SIMD(单指令多数据)指令并发执行连续迭代。
- 已添加对Cilk Plus的支持,可以使用-fcilkplus选项启用。 Cilk Plus是C和C ++语言的扩展,用于支持数据和任务并行。本实现遵循ABI版本1.2;所有功能,但_Cilk_for已经实现。
- 现在支持ISO C11原子(_Atomic类型说明符和限定符以及标题)。
- 现在支持ISO C11通用选择(_Generic关键字)。
- 现在支持ISO C11线程本地存储(_Thread_local,类似于GNU C __thread)。
- ISO C11支持现在与ISO C99支持完全相同:基本上完整的模数错误,扩展标识符(支持除了使用-fextended-identifiers时的极端情况),浮点问题(主要但不完全)与附件F和G)以及可选附件K(界限检查界面)和L(可分析性)的可选C99特征有关。
- 新的C扩展__auto_type在GNU C中提供了C ++ 11 auto的一部分功能。
- C ++:
- C ++的G ++实现1y正常函数的返回类型推导已更新为符合N3638,该提案被接受到工作文件中。最值得注意的是,它添加了decltype(auto)来获取decltype语义而不是普通auto的模板参数推理语义:
- INT&安培; F();
- auto i1 = f(); // int
- decltype(auto)i2 = f(); // int&
- G ++支持C ++ 1y lambda捕获初始化器:
- [x = 42] {...};
- 实际上,自GCC 4.5以来它们已被接受,但现在编译器并没有用-std = c ++ 1y来警告它们,并且还支持带括号和括号的初始化器。
- G ++支持C ++ 1y可变长度数组。 G ++长期以来一直支持GNU / C99风格的VLA,但现在还通过引用支持初始化器和lambda捕获。在C ++ 1y模式中,G ++会抱怨草案标准不允许的VLA使用,例如形成指向VLA类型的指针或将sizeof应用于VLA变量。请注意,现在看来,VLA不会成为C ++ 14的一部分,但它将成为单独文档的一部分,然后可能是C ++ 17。
- void f(int n){
- int a [n] = {1,2,3}; //如果n<抛出std :: bad_array_length 3
- [& a] {for(int i:a){cout
版本4.9.1中
什么是新:
- GCC 4.9.1是GCC 4.9分支的错误修复版本,其中包含对GCC 4.9.0中的回归和严重错误的重要修复,自上一版本以来修复了超过88个错误。除此之外,GCC 4.9.1版本还在Fortran中支持OpenMP 4.0,而不仅仅支持C和C ++。
版本4.9.0中
什么是新:
- 一般优化工具改进:
- 快速内存错误检测器AddressSanitizer现已在ARM上提供。
- UndefinedBehaviorSanitizer(ubsan),一个快速未定义的行为检测器,已添加,可以通过-fsanitize = undefined启用。将检测各种计算以在运行时检测未定义的行为。 UndefinedBehaviorSanitizer目前可用于C和C ++语言。
- 链接时优化(LTO)改进:
- 重写了类型合并。新的实现速度明显更快,占用的内存更少。
- 更好的分区算法,可在链接时间内减少流式传输。
- 尽早删除虚拟方法可以减少目标文件的大小,并缩短链接时内存使用和编译时间。
- 现在按需加载函数体,并在链接时提前释放,以提高整体内存使用量。
- 现在可以优化C ++隐藏的键控方法。
- 使用链接器插件时,使用-flto选项进行编译现在会生成仅包含LTO中间语言表示的超薄对象文件(.o)。使用-ffat -lto-objects创建另外包含目标代码的文件。要生成适合LTO处理的静态库,请使用gcc-ar和gcc-ranlib;使用gcc-nm列出来自细长对象文件的符号。 (需要使用插件支持编译ar,ranlib和nm。)
- 内存使用情况构建启用了调试的Firefox从15GB减少到3.5GB;链接时间从1700秒到350秒。
- 程序间优化改进:
- 改进虚拟化的新型继承分析模块。现在,虚拟化会考虑匿名名称空间和C ++ 11 final关键字。
- 新的推测性虚拟化传递(由-fdevirtualize-speculatively控制。
- 推测性地直接拨打的电话会被转回间接电话,而直接电话并不便宜。
- 为已知在共享库之间在语义上等效的符号引入了本地别名,从而改善了动态链接时间。
- 反馈导向的优化改进:
- 使用C ++内联函数对程序进行概要分析现在更加可靠。
- 新时间分析确定执行函数的典型顺序。
- 新功能重新排序传递(由-freorder-functions控制)可显着减少大型应用程序的启动时间。在binutils支持完成之前,它仅对链接时优化有效。
- 反馈驱动的间接呼叫删除和虚拟化现在可以在启用链接时优化时处理跨模块调用。
- 新语言和语言的具体改进:
- 现在,C和C ++编译器支持OpenMP规范的4.0版。新的-fopenmp-simd选项可用于启用OpenMP的SIMD指令,而忽略其他OpenMP指令。新的-fsimd-cost-model =选项允许调整使用OpenMP和Cilk Plus simd指令注释的循环的矢量化成本模型; -Wopenmp-simd在当前costmodel覆盖用户设置的simd指令时发出警告。
- 为C,C ++和Fortran编译器添加了-Wdate-time选项,该选项在使用__DATE __,__ TIMME__或__TIMESTAMP__宏时发出警告。这些宏可能会阻止按位完全相同的可重现编译。
- 阿达:
- 默认情况下,GNAT切换到Ada 2012而不是Ada 2005.
- C家族:
- 增加了对GCC发出的着色诊断的支持。 -fdiagnostics-color = auto将在输出到终端时启用它,-fdiagnostics-color =始终无条件。 GCC_COLORS环境变量可用于自定义颜色或禁用着色。如果环境中存在GCC_COLORS变量,则默认为-fdiagnostics-color = auto,否则为-fdiagnostics-color = never。
- 样本诊断输出:
- $ g ++ -fdiagnostics-color = always -S -Wall test.C
- test.C:在功能‘ int foo()':
- test.C:1:14:警告:函数中没有返回语句返回非void [-Wreturn-type]
- int foo(){}
- test.C:2:46:错误:模板实例化深度超过最大值900(使用-ftemplate-depth =增加最大值)实例化‘ struct X'
- template struct X {static const int value = X :: value; }; template struct X;
- test.C:2:46:从‘ const int X :: value'递归需要
- test.C:2:46:需要来自‘ const int X :: value'
- test.C:2:88:从这里要求
- test.C:2:46:错误:类型不完整‘ X'用于嵌套名称说明符
- 使用新的#pragma GCC ivdep,用户可以断言没有循环携带的依赖关系会阻止使用SIMD(单指令多数据)指令并发执行连续迭代。
- 已添加对Cilk Plus的支持,可以使用-fcilkplus选项启用。 Cilk Plus是C和C ++语言的扩展,用于支持数据和任务并行。本实现遵循ABI版本1.2;所有功能,但_Cilk_for已经实现。
- 现在支持ISO C11原子(_Atomic类型说明符和限定符以及标题)。
- 现在支持ISO C11通用选择(_Generic关键字)。
- 现在支持ISO C11线程本地存储(_Thread_local,类似于GNU C __thread)。
- ISO C11支持现在与ISO C99支持完全相同:基本上完整的模数错误,扩展标识符(支持除了使用-fextended-identifiers时的极端情况),浮点问题(主要但不完全)与附件F和G)以及可选附件K(界限检查界面)和L(可分析性)的可选C99特征有关。
- 新的C扩展__auto_type在GNU C中提供了C ++ 11 auto的一部分功能。
- C ++:
- C ++的G ++实现1y正常函数的返回类型推导已更新为符合N3638,该提案被接受到工作文件中。最值得注意的是,它添加了decltype(auto)来获取decltype语义而不是普通auto的模板参数推理语义:
- INT&安培; F();
- auto i1 = f(); // int
- decltype(auto)i2 = f(); // int&
- G ++支持C ++ 1y lambda捕获初始化器:
- [x = 42] {...};
- 实际上,自GCC 4.5以来它们已被接受,但现在编译器并没有用-std = c ++ 1y来警告它们,并且还支持带括号和括号的初始化器。
- G ++支持C ++ 1y可变长度数组。 G ++长期以来一直支持GNU / C99风格的VLA,但现在还通过引用支持初始化器和lambda捕获。在C ++ 1y模式中,G ++会抱怨草案标准不允许的VLA使用,例如形成指向VLA类型的指针或将sizeof应用于VLA变量。请注意,现在看来,VLA不会成为C ++ 14的一部分,但它将成为单独文档的一部分,然后可能是C ++ 17。
- void f(int n){
- int a [n] = {1,2,3}; //如果n<抛出std :: bad_array_length 3
- [& a] {for(int i:a){cout
1 注释
http://www.eduwizzonlinetrainings.com 29 Dec 17
EduwizzOnlineTraining is one of the Best Online Training Institute in Hyderabad, Bangalore. Eduwizz provide courses like Hybris Development, WebSphere Commerce Server,Blockchain Training,Hyperledger Fabric Development ,Ethereum Development ,Commvault Training, Devops , Netapps , Mulesoft ESB ,Machine Learning,Data Science , Internet of Things , Hybris ,Angular JS , Node JS , Express JS , Business Analyst, Selenium testing with webdriver, Guidewire ,Adobe, RPA ,TSM, EMC...etc