g++和gcc的区别是什么?

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

579284 次浏览

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

尽管它们根据文件类型自动决定调用哪个后端(cc1 cc1plus…),但它们还是有一些不同之处,除非被-x language覆盖。

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

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

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

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

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

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

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

虽然gcc和g++命令做的事情非常相似,但g++被设计为编译c++程序时调用的命令;它的目的是自动做正确的事情。

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

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编译*.cppg++编译*.c\*.cpp文件有一些额外的宏。

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

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

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

当提到c++编译时,通常称编译器为“g++”。由于只有一个编译器,所以无论在什么语言环境中,都可以准确地称其为“GCC”;然而,当重点是编译c++程序时,术语“g++”更有用。

你可以读更多在这里

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

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

  1. 我发现描述这里,但它很短。

  2. 然后我试着在我的windows机器上实验gcc.exe和g++.exe:

    $ g++ --version | head -n1g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    $ gcc --version | head -n1gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
  3. I tried to compile c89, c99, and c++1998 simple test files and It's work well for me with correct extensions matching for language

    gcc -std=c99 test_c99.cgcc -std=c89 test_c89.cg++ -std=c++98 test_cpp.cppgcc -std=c++98 test_cpp.cpp
  4. But when I try to run "gnu compiler collection" tool in that fashion:

    $ gcc -std=c++98 test_cpp.ccc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
  5. But this one still work with no errors

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. And this also

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

p.s. Test files

$ cat test_c89.c test_c99.c test_cpp.cpp
// C89 compatible fileint main(){int x[] = {0, 2};return sizeof(x);}
// C99 compatible fileint main(){int x[] = {[1]=2};return sizeof(x);}
// C++1998,2003 compatible fileclass X{};int main(){X x;return sizeof(x);}
// C++11#include <vector>enum class Color : int{red,green,blue}; // scoped enumint main(){std::vector<int> a {1,2,3}; // bracket initializationreturn 0;}

发现:

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

  2. gcc可以作为metatool,如果您有正确的扩展名或设置正确-std -x标志。李看到# 0 < / p > < / >

g++gcc的区别是什么?

gcc已经从单一语言“GNU C编译器”进化而来;成为一个多语言的“GNU编译器集”。术语gcc有时仍然指“GNU C编译器”;在C语言编程的环境中。

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

然而,g++ c++编译器的GNU编译器集合。就像1号是2号的Ada编译器。# 4

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

Ubuntu 16.04和18.04 man gcc声明…

g++接受与gcc几乎相同的选项

这是默认的。

< p >…使用gcc不会添加c++库。第一条是程序调用GCC并自动指定针对c++的链接图书馆。它将.c, .h和.i文件视为c++源文件,而不是C源文件,除非使用-x。这个程序在以下情况下也很有用预编译一个扩展名为.h的C头文件,以便在c++中使用编译。< / p >

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

一般的c++开发应该使用哪一种?

从技术上讲,gccg++都可以用于具有适用选项设置的通用c++开发。然而,g++的默认行为自然是与c++开发相一致的。

Ubuntu 18.04“gcc”手册页增加了以下段落,Ubuntu 20.04继续保留:

运行GCC的通常方法是运行名为gcc的可执行文件,或者在交叉编译时运行machine-gcc,或者运行machine-gcc-version来运行特定版本的GCC。# 4


注:以Xcode为例。应用程序嵌入工具链,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++

我在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 + +”。# 0