g ++和gcc有什么区别?

时间:2008-10-05 20:25:14

标签: c++ gcc g++

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

10 个答案:

答案 0 :(得分:646)

gccg++是GNU编译器集合的编译器驱动程序(曾经只是GNU C编译器

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

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

根据GCC的在线文档link optionshow g++ is invokedg++等同于gcc -xc++ -lstdc++ -shared-libgcc(第一个是编译器选项,第二个是链接器选项)。这可以通过使用-v选项运行来检查(它显示正在运行的后端工具链命令)。

答案 1 :(得分:393)

GCC:GNU编译器集合

  • 推荐使用GNU编译器支持的所有不同语言。

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

主要区别:

  1. gcc将编译:* .c / * .cpp文件分别为C和C ++。
  2. g ++将编译:* .c / * .cpp文件,但它们都将被视为C ++文件。
  3. 此外,如果您使用g ++链接目标文件,它会自动链接到std C ++库(gcc不会这样做)。
  4. gcc编译C文件的预定义宏较少。
  5. gcc编译* .cpp和g ++编译* .c / * .cpp文件有一些额外的宏。
  6. 编译* .cpp文件时的额外宏:

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

答案 2 :(得分:70)

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

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

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

答案 3 :(得分:23)

g++gcc有什么区别?

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

g++ GNU编译器集合的C ++编译器。与gnat类似,是gcc的Ada编译器。 see Using the GNU Compiler Collection (GCC)

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

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

  

g++主要接受与gcc

相同的选项

并且默认...

  

...使用gcc不会添加C ++库。 g++是一个程序   调用GCC并自动指定与C ++的链接   图书馆。它将.c,.h和.i文件视为C ++源文件而不是   C源文件,除非使用-x。这个程序在使用时也很有用   预编译带有.h扩展名的C头文件,以便在C ++中使用   汇编

gcc手册页中搜索有关gccg++的选项差异的更多详情。

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

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

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

  

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

答案 4 :(得分:16)

尽管gcc和g ++命令的功能非常相似,但g ++被设计为您调用编译C ++程序的命令。它旨在自动做正确的事情。

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

答案 5 :(得分:14)

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

答案 6 :(得分:10)

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

  1. 我找到了说明here,但它很短。

  2. 然后我尝试在我的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
    
  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
    
  4. 但是当我尝试运行" 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]
    
  5. 但是这个仍然没有错误

    $ gcc -x c++ -std=c++98 test_cpp.c
    
  6. 这也是

    $ g++ -std=c++0x test_cpp_11.cpp 
    
  7. P.S。测试文件

    $ 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 <vector>
    enum class Color : int{red,green,blue}; // scoped enum
    int main()
    {
        std::vector<int> a {1,2,3}; // bracket initialization
        return 0;
    }
    

    <强>调查结果:

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

    2. 如果您有正确的扩展名或设置正确,gcc可以正常使用metatool -std -x标志。请参阅this

答案 7 :(得分:9)

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

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

您可以阅读更多here

答案 8 :(得分:1)

我在linux系统中测试gcc和g ++。通过使用MAKEFILE,我可以定义“GNU make”使用的编译器。我通过以下方式测试了所谓的“动态记忆”定位功能“C plus plus”:

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

只有g ++可以在我的计算机上成功编译,而gcc会报告错误

undefined reference to `operator new(unsigned long)'

所以我自己的结论是gcc不完全支持“C plus plus”。 似乎选择g ++ for C ++源文件是一个更好的选择。

答案 9 :(得分:0)

gcc和g ++都是GNU编译器。他们都编译c和c ++。区别在于* .c文件gcc将其视为c程序,g ++将其视为c ++程序。 * .cpp文件被认为是c ++程序。 c ++是c的超集,语法更严格,所以要小心后缀。