1044

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

4

10 回答 10

850

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

即使它们cc1 cc1plus根据文件类型自动确定要调用哪些后端 ( ...),除非用 覆盖-x language,它们还是有一些区别。

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

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

于 2008-10-05T20:26:59.520 回答
518

GCC:GNU 编译器集合

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

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

主要区别:

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

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

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
于 2008-10-06T01:55:00.917 回答
100

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

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

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

于 2008-10-05T20:29:26.973 回答
50

g++和 和有什么不一样gcc

gcc已从单一语言“GNU C 编译器”发展为多语言“GNU 编译器集合”。在 C 编程的上下文中,该术语gcc有时仍指“GNU C 编译器”。

man gcc

# GCC(1)                     GNU
# 
# NAME
#        gcc - GNU project C and C++ compiler

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

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

Ubuntu 16.04 和 18.04man gcc声明...

g++接受与gcc

并且默认...

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

搜索手册页以获取有关和gcc之间的选项差异的更多详细信息。gccg++

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

从技术上讲,gcc或者g++可以用于具有适用选项设置的一般 C++ 开发。但是,g++默认行为自然与 C++ 开发相一致。

添加了Ubuntu 18.04 'gcc' 手册页,并且Ubuntu 20.04继续具有以下段落:

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


旁注:对于 Xcode.app 嵌入式工具链,g++只需链接到gcc. 因此,g++调用可能因每个工具链而异。

ls -l /Applications/Xcode.app/Contents/Developer/usr/bin
# …
# lrwxr-xr-x  1 root  wheel         3 Apr 27  2021 g++ -> gcc
# -rwxr-xr-x  1 root  wheel    167120 Nov 23 20:51 gcc

### -- versus --
which -a g++
# /usr/bin/g++
ls -l /usr/bin/g++
# -rwxr-xr-x  1 root  wheel  137616 Jan  1  2020 /usr/bin/g++
于 2016-01-05T10:34:28.750 回答
29

一个显着的区别是,如果您将.c文件传递给 gcc,它将编译为 C。

g++ 的默认行为是将.c文件视为 C++(除非-x c指定)。

于 2008-10-05T20:35:31.030 回答
19

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

在幕后,它们实际上是同一个程序。据我了解,两者都根据文件扩展名决定将程序编译为 C 还是 C++。两者都能够链接到 C++ 标准库,但默认情况下只有 g++ 这样做。因此,如果您有一个用 C++ 编写的程序,并且碰巧不需要链接到标准库,那么 gcc 会碰巧做正确的事情;但是,g++ 也会如此。所以真的没有理由不使用 g++ 进行一般的 C++ 开发。

于 2008-10-06T00:51:10.733 回答
14

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

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

  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 
    

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 <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. 如果您有正确的扩展名或设置正确的 -std -x 标志,gcc 可以作为元工具正常工作。看到这个

于 2015-03-16T16:30:27.857 回答
9

“GCC”是 GNU 编译器集合的常用缩写词。这既是编译器的最通用名称,也是强调编译 C 程序时使用的名称(以前的缩写代表“GNU C Compiler”)。

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

你可以在这里阅读更多。

于 2012-10-18T11:37:16.770 回答
0

我在 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”。似乎为 C++ 源文件选择 g++ 是一个更好的选择。

于 2016-11-02T20:45:15.293 回答
-1

gcc 和 g++ 都是 GNU 编译器。他们都编译c和c++。不同之处在于 *.c 文件 gcc 将其视为 ac 程序,而 g++ 将其视为 ac ++ 程序。*.cpp 文件被认为是 c++ 程序。c++是c的超集,语法比较严格,所以要注意后缀。

于 2014-08-12T08:44:41.020 回答