"g++"和"c++"编译器

73

我刚刚在我的Ubuntu操作系统上发现了两个不同的C++编译器: /usr/bin/g++/usr/bin/c++。我不熟悉后者,但是输入man c++命令只会跳转到gcc的手册页。我想知道这两个编译器在C++编译方面有什么区别?


8
ccc++ 是 POSIX 编译器的名称。很可能,c++ 会是指向 g++ 的符号链接,而 cc 则是指向 gcc 的。 - Cat Plus Plus
可能是What is the difference between g++ and gcc?的重复问题。 - Romain Vincent
4个回答

80

这是典型的Ubuntu符号链接混乱。

如果你运行ls -l /usr/bin/c++,你会发现它实际上是一个符号链接,指向:

/etc/alternatives/c++

这又是一个符号链接,指向:

/usr/bin/g++

因此,在Ubuntu系统上,c++ 等同于 g ++。链接间接性背后的原因是有多个软件包可以提供c ++编译器(例如不同版本的g ++)。在Ubuntu上,您会经常看到这种情况。例如,qmake是指向/etc/alternatives中的一个文件的链接,该文件(在我的系统上)是指向/usr/bin/qmake-qt3的链接。


3
在 Fedora 21 上,/usr/bin/c++ 和 /usr/bin/g++ 都是二进制文件(即不是符号链接)......但这两个文件是相同的(字节数和 md5 校验和相同)。 (一个符号链接似乎更合适...不确定为什么他们复制了同一个文件。g++ 和 c++ 都由相同的 rpm“gcc-c ++”提供。) - Trevor Boyd Smith

35

C++编译器在系统上的标准名称为c++

在GNU系统上,您几乎肯定已安装了GCC(GNU编译器集合),其中包括名为g++('g'代表GNU)的C++编译器。但为了与POSIX兼容,它们也将此编译器安装为c++,有时c++是指向g++的符号链接,有时是硬链接,有时只是安装两次相同的文件。

但对于其他系统(如FreeBSD或NetBSD),情况可能不是这样。这些系统可能没有安装GCC(和其他GNU工具)。

在我的系统上,这两个文件完全相同:

% diff `which c++` `which g++`
% echo $?
0

这意味着c ++至少调用相同的编译器,但在理论上它可以以不同的方式解释某些命令行选项或具有一些不同的默认值。更了解此问题的人可以自由地扩展答案。


1
谢谢,我检查了C++和G++的MD5校验和,它们是相同的!但是如果有两个文件可以完成相同的工作,那么该怎么办? - Laser
没错,它们没有区别,你可以使用任何一个。如果在构建中使用了GCC特定的选项,我建议使用g++,这样就清楚明确了,但你应该始终让用户通过CXX变量覆盖编译器。 - ams
2
即使文件相同也不意味着它们是等价的。程序的行为可能会因调用它的名称而异(例如,gunzipzcat都链接到gzip,当使用其他两个名称调用gzip时会使用不同的默认参数)。 - Claudio
@unkulunkulu 我不知道是否有任何区别。 - Claudio
FreeBSD 9安装了gcc,但在FreeBSD 10中它将被删除。 - Konrad Borowski
显示剩余3条评论

11
在我的电脑上,c++ 是一个链接:
$ readlink /usr/bin/c++
/etc/alternatives/c++
$ readlink /etc/alternatives/c++
/usr/bin/g++
所以只是指向的链接。

6

g++是GNU C++编译器,其中C++是系统自带的C++编译器,在Ubuntu中C++链接到g++,但在其他系统中它可能链接到非GCC编译器。另外,就像有人说的vi vs vim,仅仅因为系统上存在对vi的链接并不意味着它是vim,可能是任何一个vi克隆版。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接