首页 文章

g和gcc有什么区别?

提问于
浏览
715

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

10 回答

  • 16

    I became interested in the issue and perform some experiments

    • 我发现描述here,但它很短 .

    • 然后我尝试在我的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
    

    附:测试文件

    $ 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;
    }
    

    Findings:

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

    如果你有正确的扩展名或设置正确的-std -x标志,

    • gcc可以正常使用metatool . 见this
  • 596

    What is the difference between g++ and gcc?

    gcc 已从单一语言"GNU C Compiler"演变为多语言"GNU Compiler Collection" . 术语"GNU C Compiler"有时仍在C编程的上下文中使用 .

    g++ 是GNU编译器集合的C编译器 . 像 gnatgcc 的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++ 的选项差异的详细信息 .

    Which one should be used for general c++ development?

    从技术上讲, gccg++ 可用于通用C开发,并带有适用的选项设置 . 但是, g++ 默认行为自然与C开发对齐 .

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

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

  • 65

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

  • 0

    我在linux系统中测试gcc和g . 通过使用MAKEFILE,我可以定义“GNU make”使用的compliler . 我测试了所谓的“动态记忆”定位功能“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" . It seems that choosing g++ for C++ source files is a better option.

  • 19

    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
    
  • 374

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

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

  • 9

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

  • 9

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

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

    你可以阅读更多here .

  • 1

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

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

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

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

  • 10

    对于c你应该使用g .

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

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

相关问题