当前位置:  开发笔记 > 编程语言 > 正文

g ++和gcc有什么区别?

如何解决《g++和gcc有什么区别?》经验,为你挑选了8个好方法。

g ++和gcc有什么区别?哪些应该用于一般的c ++开发?



1> 小智..:

gcc并且g++是GNU Compiler Collection的编译器驱动程序(曾经只是GNU C编译器).

即使它们cc1 cc1plus根据文件类型自动确定调用哪个后端(...),除非被覆盖,否则-x language它们会有一些差异.

默认情况下可能最重要的区别是它们自动链接的库.

根据GCC的在线文档链接选项以及如何调用g ++,g++相当于gcc -xc++ -lstdc++ -shared-libgcc(第一个是编译器选项,第二个是链接器选项).这可以通过使用-v选项运行来检查(它显示正在运行的后端工具链命令).


从这个答案中,我得出结论,有效的g ++命令只是带有一堆标志的gcc ..为什么在Linux中gcc和g ++有两个不同的二进制文件(大小大致相同)?我们不应该只有一个二进制文件和一个符号链接(或类似的东西)吗?

2> Martin York..:

GCC:GNU编译器集合

推荐GNU编译器支持的所有不同语言.

gcc:GNU C编译器
g ++:GNU C++编译器

主要区别:

    gcc将编译:*.c/*.cpp文件分别作为C和C++.

    g ++将编译:*.c/*.cpp文件,但它们都将被视为C++文件.

    此外,如果您使用g ++链接目标文件,它会自动链接到std C++库(gcc不会这样做).

    gcc编译C文件的预定义宏较少.

    gcc编译*.cpp和g ++编译*.c/*.cpp文件有一些额外的宏.

编译*.cpp文件时的额外宏:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern


您可以通过传递`-lstdc ++`参数链接`gcc`中的std C++库.
'gcc'和'g ++'之间的差异比标准库更多,所以`gcc -lstdc ++`仍然不会让你获得与`g ++`相同的行为.我们将所有特定于语言的行为放入其自己的驱动程序中是出于某种原因,这就是它的用途.:-)
相信我,我们经常讨论这个问题,通常当Linux用户试图将他不完整的Makefile移动到另一个平台时.:-) g ++链接阶段比其他操作系统上的`gcc -lstdc ++`做得更多,特别是当目标是嵌入式平台时.幸运的是,这就是我们首先发布g ++的原因.
规范字符串被构造为特定于编译器,而编译器又特定于操作系统和目标.因此,如果在(例如)针对嵌入式系统的交叉编译器上运行`-dumpspec`,您将看到差异.不仅仅是链接器差异......这也是您的答案(预处理器宏,包含路径,多个运行时库).我们似乎是在谈论彼此,但作为一名前GCC维护者,我向你保证,我熟悉前端是什么,不是.
我的评论不仅仅是关于链接...这就是重点.即使只是将讨论限制为链接(你的答案不是),用户*仍然*将无法通过仅指定`-lddc ++`来使用整个C++标准库,因为将缺少对数学,RTTI的依赖性和异常信息.给定的测试用例链接还是失败将取决于操作系统以及测试用例使用的C++功能,这也是为什么所有这些知识都内置到g ++驱动程序中而不是让用户知道的原因.

3> Nils Pipenbr..:

对于c ++,你应该使用g ++.

它是相同的编译器(例如GNU编译器集合).GCC或G ++只选择具有不同默认选项的不同前端.

简而言之:如果使用g ++,前端会告诉链接器您可能希望链接到C++标准库.gcc前端不会这样做(如果传递正确的命令行选项,它也可以与它们链接).


+1我的GNU / Linux gcc手册页还说:“编译C ++程序时,应改为将GCC调用为g ++。”

4> l --marc l..:

g++和之间有什么区别gcc

gcc已经从单一语言"GNU C Compiler"发展成为多语言"GNU编译器集合".术语"GNU C编译器"有时仍在C编程的上下文中使用.

g++ GNU Compiler Collection的C++编译器.就像gnatAda编译器一样gcc.请参阅使用GNU编译器集合(GCC)

例如,Ubuntu 16.04和18.04 man g++命令返回GCC(1)手册页.

Ubuntu 16.04和18.04 man gcc声明......

g++ 接受大多数相同的选项 gcc

那是默认的......

...使用gcc不添加C++库. g++是一个调用GCC并自动指定与C++库链接的程序.除非使用-x,否则它将.c,.h和.i文件视为C++源文件而不是C源文件.当预编译具有.h扩展名的C头文件以用于C++编译时,此程序也很有用.

搜索gcc上的选择差异风俗细节手册页gccg++.

哪一个应该用于一般的c ++开发?

从技术上讲,可以使用gccg++可以使用适用的选项设置进行常规C++开发.但是,g++默认行为自然与C++开发对齐.

Ubuntu 18.04手册页添加了以下段落:

运行GCC的常用方法是运行被调用的可执行文件gcc,或者machine-gcc在交叉编译时machine-gcc-version运行,或运行特定版本的GCC. 编译C++程序时,应该调用GCC g++.



5> njsf..:

唯一值得注意的区别是,如果你传递.c给gcc它将编译为C,而g ++将始终将其视为C++.


(迟到,但后人,​​)正如其他答案所指出的那样,这绝不是"唯一值得注意的差异",除非读者对明显性有不正确的定义.

6> zaphod..:

虽然gcc和g ++命令做的事情很相似,但g ++被设计成你调用编译C++程序的命令.它旨在自动做正确的事情.

在幕后,他们真的是同一个节目.据我所知,两者都决定是根据文件扩展名将程序编译为C还是C++.两者都能够链接到C++标准库,但只有g ++默认执行此操作.因此,如果您有一个用C++编写的程序,并不需要链接到标准库,那么gcc就会做正确的事情; 但是,g ++也是如此.因此,没有理由不使用g ++进行一般的C++开发.



7> bruziuz..:

我开始对这个问题感兴趣并进行一些实验

    我在这里找到了描述,但它很短.

    然后我尝试在我的Windows机器上试验gcc.exe和g ++.exe:

    $ g++ --version | head -n1 
    g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    
    $ gcc --version | head -n1
    gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    

    我试着编译c89,c99和c ++ 1998简单的测试文件,它对我来说很有用,正确的扩展名匹配语言

    gcc -std=c99 test_c99.c
    gcc -std=c89 test_c89.c 
    g++ -std=c++98 test_cpp.cpp
    gcc -std=c++98 test_cpp.cpp
    

    但是,当我尝试以这种方式运行"gnu编译器集合"工具时:

    $ gcc -std=c++98 test_cpp.c
    cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
    

    但是这个仍然没有错误

    $ gcc -x c++ -std=c++98 test_cpp.c
    

    这也是

    $ g++ -std=c++0x test_cpp_11.cpp 
    

ps测试文件

$ cat test_c89.c test_c99.c test_cpp.cpp

// C89 compatible file
int main()
{
    int x[] = {0, 2};
    return sizeof(x);
}

// C99 compatible file
int main()
{
    int x[] = {[1]=2};
    return sizeof(x);
}

// C++1998,2003 compatible file
class X{};
int main()
{
    X x;
    return sizeof(x);
}

// C++11
#include 
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
    std::vector a {1,2,3}; // bracket initialization
    return 0;
}

发现:

    如果查看进程树,那么似乎gcc和g ++是后端到其他工具,在我的环境中是:cc1plus.exe,cc1.exe,collect2.exe,as.exe,ld.exe

    如果你有正确的扩展名或设置正确的-std -x标志,gcc作为metatool工作正常.看到这个



8> Minh-Triet P..:

"GCC"是GNU Compiler Collection的常用简写术语.这是编译器的最通用名称,以及强调编译C程序时使用的名称(缩写以前代表"GNU C编译器").

在引用C++编译时,通常调用编译器"G ++".由于只有一个编译器,无论语言环境如何,将其称为"GCC"也是准确的; 但是,当重点是编译C++程序时,术语"G ++"更有用.

你可以在这里阅读更多.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有