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


当前回答

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

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

man gcc

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

然而,g++是GNU编译器集的c++编译器。像gnat是gcc的Ada编译器。参见使用GNU编译器集合(GCC)

例如,Ubuntu 16.04和18.04 mang++命令返回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手册页以获得关于gcc和g++之间的选项差异的更多详细信息。

一般的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为例。应用程序嵌入工具链,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 + +”。对于c++源文件,选择g++似乎是一个更好的选择。

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

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

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

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

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

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

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

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

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

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